记一次踩微信支付的坑
事情是这样:
前几天接一单子,给客户接入微信支付。
一切开发、测试就绪之后交付客户上线到生产环境。一切配置就绪之后发现微信支付结果死活不回调,回调地址根本收不到任何通知。
当时我是萌币的。
之后各种排查,发现是CDN的问题。因为客户使用的百度云加速,并且开启了 HTTPS 。而百度云加速并不支持自定义证书,造成证书与域名不匹配。从而导致了微信服务器在回调的时候验证证书通不过,然后就不回调了。(PS:同样的环境下,支付宝的异步通知却能成功...)
知道了原因之后就开始着手解决问题了。百度云加速给出的方案是取消 HTTPS。然而,这视乎不太可能。
然后想了一个折中的办法:让微信支付通过 HTTP 来回调。
实现的办法是,在 Nginx 内开启 HSTS 。在 location ~ [^/]\.php(/|$)
段加入以下代码
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
然后,微信支付就可以正常回调啦!
最后我想说:阿里云、腾讯云的 CDN 都是支持自定义 SSL 证书的!!!!!
评论 (4)
您好,我遇到您文中所述的一模一样的问题:使用百度云做CDN,开启https,然后微信支付不能用了。
非常感谢您的分享!
文章中的解决方案是:
让微信支付通过 HTTP 来回调。
实现的办法是,在 Nginx 内开启 HSTS 。
但是,貌似这两条有矛盾呀,开启HSTS是强制使用HTTPS,怎么实现“让微信支付通过 HTTP 来回调”呢?
希望能得到您的指教,谢谢!
开启HSTS后微信支付那边设置回调域名为HTTP开头的,服务器收到回调后不会重定向至HTTPS。当时实测是OK的,并且在线上运行了一段时间...不过有时候还是会抽风。
最后我们是另外开了一个域名来解决这个事儿的。
目前百度已经支持自义SSL证书了,不过微信支付开始不支持CDN了
造化弄人