前言
体能状态先于精神状态,习惯先于决心,聚焦先于喜好。
需求描述
微信开发中会遇到一个安全域名的问题,微信要求将其提供的txt文件放到指定服务器,然后可以通过 http://域名/项目名/文件名.txt 来进行请求
访问成功的话,可以得到一个字符串,通过浏览器可以看到这个字符串
问题解决
参考来网上提供的一些方法,最后发现有两种思路
第一种是将txt文件作为静态文件加到项目里
第二种是增加 Controller 方法,既然微信请求后得到的是个字符串,那么我直接让 controller 返回字符串即可,即我不再保存txt文件了,而是直接保存txt文件的内容
比如放到 redis里,文件名作为key,文件内容字符串作为 value
本文采用第二种,鉴于网上将该文件的访问路径写死,本文做里进一步的延伸,即可以自由匹配多个配置文件
思路
提供给微信的访问路径不变 http://域名/项目名/文件名.txt
controller 的 @RequestMapping 方法使用地址传参
根据传参-即文件名字获取对应的值
文件名字和文件内容组成 key-value ,保存在数据库或者缓存里
代码
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* @Title: controller
* @Description: 访问微信认证 txt 文件
* @Version: v1.0
* @Date:2019-04-08 11:36
*/
@Controller
public class WeChatTxtController extends BaseController{
/**
* 微信访问的url 类似于 https://域名/项目名/MP_verify_demodemodemo.txt
* 文件内容只是一个字符串
* 这里我们将文件内容保存到统一配置中
* @param txtName
* @return
*/
@RequestMapping("{txtName}.txt")
@ResponseBody
public String getTxtContent(@PathVariable("txtName") String txtName){
//出于安全到考虑,可以对访问该路径对请求进行白名单限制
//比如只允许来自微信的域名的请求
//当然这部分限制可以放到拦截器或者过滤器中
/**
* map 的内容如下,可以存储多个搭配:
* txt文件名:文件值
* txt文件名:文件值
*/
Map map=null;//这里需要你自己实现,内容存在数据库或者缓存里都行
if(map==null){
return "error";
}else{
//查询到以此文件名保存到内容,即查询到正确到正确到文件
if( StringUtils.isNotBlank((String)map.get(txtName))){
return (String)map.get(txtName);
}
}
return "error";
}
}
访问例子说明
比如微信提供的文件是 demo.txt ,文件内容是 123456
那么就请求 http://域名/项目名/demo.txt
多想一步:寻找规律,不用存储?
近期配置了几个新对微信提供对txt文件,发现一个规律
微信提供的 txt 文件名称为 MP_verify_随机字符串.txt
而文档的内容居然和文件名字中的 随机字符串 一样
比如 MP_verify_123456.txt 的内容就是 123456
这样一来,其实可以不对这个文件进行存储,只要需要对访问路径进行处理,直接截取 随机字符串对部分,返回给请求即可
当然,这样是有风险的,万一以后微信改变规则了,估计就傻眼了,所以还是存起来吧.
本文介绍如何解决微信开发中安全域名问题,通过不保存TXT文件,直接返回字符串内容的方法,并提供了可自由配置多个TXT文件的解决方案。
628

被折叠的 条评论
为什么被折叠?



