访问个人博客html
最近在调试微信相关的接口,可是因为微信官方出于安全的考虑,对于调用接口的域名有限制。微信受权与微信支付统一下单接口在本地能够经过更改 host 的方式来调试,微信服务器也能跳转回来,可是微信支付异步通知这里;微信官方强制让设置支付受权目录,且是经过 ICP 备案的域名,所以不采起特殊手段,本地是没法接收到微信的异步通知回调请求的,只能部署到线上环境测试。nginx
为了解决这个问题,折腾了好几天,才搞出来了,究其根本缘由,仍是对于 Nginx 不太熟悉。因此在此记录一下。web
若是想本地进行调试,而且想让微信服务器请求回调回来,则本地必需要有一个外网域名,这里咱们是用 Ngrok内网转发 来实现;Ngrok 的配置就是将本地项目的端口映射到分配的外网域名,具体配置参考官网教程文档,此处再也不赘述。安全
个人配置是:服务器
http://vcmq.free.ngrok.cc -> 127.0.0.1:8080
前面提到了,微信支付异步通知会对支付域名目录有要求,所以,支付时的域名必需要在设置的支付域名目录下。微信
首先须要在 微信商户平台 中配置 商户秘钥,支付受权目录。dom
这里支付受权目录配置的是之后线上的支付受权目录异步
http://pay.domain.com/wechat/public/
而后再加一条本地测试支付的临时受权目录,这个目录最好在本地测试完成后,进行删除。ide
http://pay.domain.com/testpay/
这里列举 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 会代理到 http://192.168.0.100/test.html 即至关因而绝对根路径,则 Nginx 不会把 location 中的路径部分代理走。
server { listen 80; server_name 127.0.0.1; location /proxy/ { proxy_pass http://192.168.0.100; } }
以上 location 会代理到 http://192.168.0.100/proxy/test.html 即至关于相对路径。
知道上一步 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 微信统一下单接口时, 会代理到 http://vcmq.free.ngrok.cc/wide/create;
须要注意的是,在统一下单接口,设置 notify_url 的值要为配置的支付受权目录,好比个人 http://pay.domain.com/testpay/notify,这个异步通知回调 URL 限定是 POST 请求,能够在异步回调方法打断点,而后经过 postman 工具发送 post 请求到 http://pay.domain.com/testpay/notify,看是否能够正常进入断点,若是正常进入断点,恭喜你配置好了 Nginx 回调这一块。
注意: 统一下单接口参数中提交的参数 notify_url ,若是连接没法访问,商户将没法接收到微信通知。
通知 url 必须为直接可访问的 url ,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
另外要注意,若是支付目录中配置的是 https 的,那么 notify_url 也必定要保持一致是 https 的。
统一下单并完成支付完成后,微信服务器会请求统一下单接口中的 notify_url,通过服务器 nginx 进行代理后,会代理到 本地的内网转发域名异步通知回调接口 http://vcmq.free.ngrok.cc/wide/notify, 从而达到了本地接收微信支付异步通知回调请求的目的。
若是地址不在支付受权目录下,会提示当前 Url 未注册。由于是代理过去,所以地址栏的地址不会改变,这也是不能简单使用 nginx 的 rewrite 的缘由。
若有疑问,能够联系我。