项目场景:

最近做的项目需要使用到微信支付的jsapi类型,其实如果是做native支付的话还是很容易搞的,但是使用jsapi支付的话需要一个特殊的参数,这个参数就是openid,官网上有获取openid的教程,大致的意思就是首先要先获取到用户的code,然后在请求连接上把code重定向到另一个get请求里面去,由此获取用户的openid(具体的文档已经附在下面了),但是这个请求地址是需要外界可以访问的,这也是我们今天要讲问题关键。
在这里插入图片描述

微信支付获取openId

问题描述

因为jsapi是在微信内部浏览器打开h5页面才会调用的支付接口,所以这里是需要去绑定微信公众号的(怎么申请公众号网上有很多,大家可以自行查看哈)在我们授权过后有一项必须的设置就是网页域名授权,其实这个是很简单的一步操作,只需要将他的文件下载下来放在域名指向的根目录就可以了,linux上配置nginx可以放在指向的html目录下面,Tomcat的话放在webapp下就可以了,然后就可以访问到了,但是我们用的是内网穿透,内网穿透映射的是我们本地的项目,所以我们就变成了一个Windows主机,这个时候我们把文件下载下来放到项目的跟目录下,会报出访问到 内网穿透地址/MP verify 9ftCdNQpsXHLbt2q.txt****内容与下载文件不符,请检查文件内容或重新上传原始文件 的错误,但是如果我们是在浏览器上访问我们的地址是可以访问到文件的,在网上找了好多,发现有好多人遇到这个问题,出了各种方法但是基本上都没有用,有说写一个读取文件的controller去读取指定文件然后return出去就可以的,例如以下代码,其实下面的思路是没有问题的,但是当我们去授权的时候仍然会出现这个错误。


@Controller
@RequestMapping({"/"})
public class WxConfigController {
 
    @RequestMapping({"MP_verify_xxxxxx.txt"})
    @responseBody
    private String returnConfigFile() {
        //把MP_verify_xxxxxx.txt中的内容返回
        return "文件里的内容";
    }
}

在这里插入图片描述


原因分析:

后来想到在浏览器端将文件下载下来查看是什么情况结果发现下载下来的文件显然多了双引号,因为我们返回的是String类型所以返回出去的内容加上了双引号,这个双引号就是导致内容不符的罪魁祸首。


解决方案:

然后我们将以上的代码给优化一下,我们使用response.getWriter()方法将文件内容给打印输出去,这样就不会带上双引号了,问题完美解决。


@Controller
@RequestMapping("/")
public class IndexController {

    @GetMapping("MP_verify_9ftCdNQpsXHLbt2q.txt")
    public void wxPrivateKey(HttpServletResponse response) throws IOException {
        response.getWriter().write("9ftCdNQpsXHLbt2q");

    }

}

更多推荐