Apple 2017 年 1 月 1 号起要求 Appstore 上线的应用都必须使用 https 加密请求协议,在二月份又改为建议 从 http 升级为 https 协议,此为背景。
公司做的 APP 同时在 App Store 和安卓应用市场上了线。应要求,我们也将协议升级为 https。由于自制 https 证书不能用于支付宝请求协议,故从阿里云购买的证书服务。升级为 https 之后碰到了诸多问题。
1. 支付宝微信支付成功却收不到 notify 回调的情况。
支付 notify_url 要求回调时 url 不得带任何参数,如果请求为 https 证书必须由认证机构发放,自制证书无效。
微信要求必须为 80 端口,那么回调请求就应该为 http 请求。
项目由 nginx 加 tomcat 搭建,部署在 ECS Linux 上面。那么支付请求如下
1)APP 发起支付请求——>
2)支付宝确认签名,如果正确则支付成功——>
3)支付宝给 notify_url 发异步通知——>
4)服务器收到异步通知,确认订单状态,结束此次支付请求。
第一步是 APP 发起请求调用支付宝的接口然后支付宝确认签名验证成功后划款。
问题出在第三步,支付宝给请求支付时预先配好的 notify_url 发送异步通知时出现了问题,服务器没有收到异步通知。ngnix 和 tomcat 日志均未显示 支付宝的异步通知请求。在这里可能出现收不到回调的情况有这几种可能:
1》请求协议的问题(http,https)有可能是证书配置出现问题,但是浏览器访问网站都加上了绿色的安全锁,这一点可以排除
2》服务器防火墙配置问题,ESC 的防火墙(iptables)是在阿里云的控制台配置的,在安全组规则公网配置里面,这个默认配置就可以了,不用做改动。
3》nginx 配置问题,nginx 做代理服务器请求没有正确转发至后台。这一点我觉得可能性最大。有可能是配置问题导致支付宝回调失败。
这是阿里建议的 ssl 配置证书
- 1 # HTTPS server
- 2 # server {
- 3 # listen 443;
- 4 # server_name localhost;
- 5 # ssl on;
- 6 # ssl_certificate cert.pem;
- 7 # ssl_certificate_key cert.key;
- 8 # ssl_session_timeout 5m;
- 9 # ssl_protocols SSLv2 SSLv3 TLSv1;
- 10 # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
- 11 # ssl_prefer_server_ciphers on;
- 12 # location / {
- 13 #
- 14 #
- 15 #}
- 16 #}
可以看到此配置只配置了 443 端口监听,443 端口为 https 的默认请求端口。这样的话微信支付回调肯定就收不到了。于是我将配置改为
- # HTTPS server
- # #server {
- # listen 80;
- # listen 443 ssl;
- # server_name localhost;
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
- # ssl_session_timeout 5m;
- # ssl_protocols TLSv1.1 TLSv1.2;
- # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
- # ssl_prefer_server_ciphers on;
- # location / {
- #
- #
- #}
- #}
如上,这样 nginx 就可以同时支持 http 和 https 请求了。保证微信可以正常支付,但是支付宝还是不行。
项目服务器支持两个项目的线上运营,nginx 采用的虚拟主机配置。也就是说同一台服务器共用 https 的证书。这个需要开启 nginx 的 sni 服务。查看状态进入 nginx 安装目录下输入命令:
- sbin/nginx -V
nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/webserver/nginx --with-openssl=/usr/local/openssl/openssl-1.0.1g/ --with-http_stub_status_module --with-htt p_ssl_module --with-pcre=/usr/local/tools/pcre/ --add-module=/usr/local/tools/packages/echo-nginx-module-0.60/
可以看到
- TLS SNI support enabled
已经开启。如果没有开启,将 nginx 加入 openssl 重新 make && make install 。
然后这个时候在测试支付,微信可以正常支付并受到回调了。这样 APP 微信支付和公众号支付两条路就走通了。
剩下支付宝支付还是没有收到回调。于是我把支付宝回调调整为 http 请求在 nginx 中过滤,如果为 notify 请求则重写为 http://notify_url,将项目打包到测试环境测试,果然成功了。剩下的就是将项目打包正式版本,更新了。
这次升级主要是 nginx 的证书配置和 http 和 https 的限制。遇到这样网络请求的问题,将请求全过程的从头到尾的过程多想几遍,再按照请求的流程一步一步排查问题。缩小问题的范围,问题就慢慢浮现出水面了。
来源: http://www.cnblogs.com/xiaowang1/p/6489498.html