关于访问微信安全域名认证txt文件访问的通用解决方案

文章目录

          • 前言
          • 需求描述
          • 问题解决
            • 思路
            • 代码
          • 访问例子说明
          • 多想一步:寻找规律,不用存储?

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

需求描述

微信开发中会遇到一个安全域名的问题,微信要求将其提供的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
这样一来,其实可以不对这个文件进行存储,只要需要对访问路径进行处理,直接截取 随机字符串对部分,返回给请求即可
当然,这样是有风险的,万一以后微信改变规则了,估计就傻眼了,所以还是存起来吧.

你可能感兴趣的:(开发问题记录)