博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信支付开发本地接收异步通知回调【实战】
阅读量:6037 次
发布时间:2019-06-20

本文共 2120 字,大约阅读时间需要 7 分钟。

前言

最近在调试微信相关的接口,但是由于微信官方出于安全的考虑,对于调用接口的域名有限制。微信授权与微信支付统一下单接口在本地可以通过更改 host 的方式来调试,微信服务器也能跳转回来,但是微信支付异步通知这里;微信官方强制让设置支付授权目录,且是通过 ICP 备案的域名,因此不采取特殊手段,本地是无法接收到微信的异步通知回调请求的,只能部署到线上环境测试

前置条件

为了解决这个问题,折腾了好几天,才搞出来了,究其根本原因,还是对于 Nginx 不太熟悉。所以在此记录一下。

内网转发

如果想本地进行调试,并且想让微信服务器请求回调回来,则本地必须要有一个外网域名,这里我们是用 来实现;Ngrok 的配置就是将本地项目的端口映射到分配的外网域名,具体配置参考官网教程文档,此处不再赘述。

我的配置是:

http://topn.free.ngrok.cc -> 127.0.0.1:8080

配置测试支付目录

前面提到了,微信支付异步通知会对支付域名目录有要求,因此,支付时的域名必须要在设置的支付域名目录下。

首先需要在 中配置 商户秘钥,支付授权目录。

mark

这里支付授权目录配置的是以后线上的支付授权目录

http://pay.domain.com/wechat/public/

然后再加一条本地测试支付的临时授权目录,这个目录最好在本地测试完成后,进行删除。

http://pay.domain.com/testpay/

必知的 Nginx 语法

proxy_pass 后的 url 加不加 / 的区别

这里列举 nginx 的 proxy_pass 语法,是为了下一步针对 nginx 的配置进行修改。

这里访问 http://127.0.0.1/proxy/test.html 测试 proxy_pass 后面的 url 加与不加 / 的区别

server {    listen       80;    server_name 127.0.0.1;    location  /proxy/ {          proxy_pass http://192.168.0.100/;    }}

以上 location 会代理到 即相当于是绝对根路径,则 Nginx 不会把 location 中的路径部分代理走。

server {    listen       80;    server_name 127.0.0.1;    location  /proxy/ {          proxy_pass http://192.168.0.100;    }}

以上 location 会代理到 即相当于相对路径。


代理支付域名到第三方域名

知道上一步 proxy_pass 后 / 的作用后,就开始来配置支付域名指向的服务器上的 nginx 的配置文件。

server {    listen       80;    server_name pay.domain.com;    location /testpay/ {        proxy_set_header Host vcmq.free.ngrok.cc;        proxy_pass http://vcmq.free.ngrok.cc/wide/;    }        location / {        proxy_pass http://payServer;    }}

配置中的 wide 是我项目的名称;

注意:这里的 proxy_set_header Host 必须配置,否则进入 location 块后,会提示 tunnel pay.domain.com not found

当访问 pay.domain.com/testpay/create 微信统一下单接口时, 会代理到

需要注意的是,在统一下单接口,设置 notify_url 的值要为配置的支付授权目录,比如我的 ,这个异步通知回调 URL 限定是 POST 请求,可以在异步回调方法打断点,然后通过 postman 工具发送 post 请求到 ,看是否可以正常进入断点,如果正常进入断点,恭喜你配置好了 Nginx 回调这一块。

注意: 统一下单接口参数中提交的参数 notify_url ,如果链接无法访问,商户将无法接收到微信通知。

通知 url 必须为直接可访问的 url ,不能携带参数。示例:notify_url:“”

另外要注意,如果支付目录中配置的是 https 的,那么 notify_url 也一定要保持一致是 https 的。

统一下单并完成支付完成后,微信服务器会请求统一下单接口中的 notify_url,经过服务器 nginx 进行代理后,会代理到 本地的内网转发域名异步通知回调接口 , 从而达到了本地接收微信支付异步通知回调请求的目的。

如果地址不在支付授权目录下,会提示当前 Url 未注册。因为是代理过去,因此地址栏的地址不会改变,这也是不能简单使用 nginx 的 rewrite 的原因。

如有疑问,可以联系我。

参考

转载地址:http://whohx.baihongyu.com/

你可能感兴趣的文章
[转]Oracle中存储过程和函数的区别
查看>>
解决eclipse中安装AIX2插件问题
查看>>
UIKIT网页基本结构学习
查看>>
多线程的常见用法详解 --转载
查看>>
CArray,CList,CMap如何实例化
查看>>
Jquery DataTable
查看>>
java将白色背景图片转换成无色
查看>>
Oracle 收集统计信息11g和12C在差异
查看>>
项目中phpexcel的基本用法
查看>>
ContextLoaderListener作用详解(转)
查看>>
优步司机端界面大改版,不会用搓这里!
查看>>
MapReduce整体架构分析
查看>>
spring mvc接收JSON格式的参数
查看>>
opencv的实用研究--分析轮廓并寻找边界点
查看>>
[React Testing] Redux Reducers
查看>>
微信web开发者工具
查看>>
Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
查看>>
REST服务介绍二
查看>>
【计算机基础】 经常使用的排序算法的时间复杂度和空间复杂度
查看>>
IOS中的多线程之GCD
查看>>