小背景
最近在调整支付宝支付的功能时发现,不能够正常接收支付宝付款成功之后的回调通知了,从代码到配置最后到服务器配置都排查了一遍,最终发现问题原因竟然是因为我们的回调地址notify_url是https的但并非是权威机构颁发的证书,不被支付宝所信赖,所以并没有发起回调。
问题追踪
确认自己的回调地址notify_url配置无误之后,在开发环境自己用Postman请求自己设置的回调地址,是可以正常进入到Controller的接口层。
遂即便怀疑测试环境服务器负载配置是否正确,通过跟踪nginx的access.log,发现自己模拟发起的请求的都可以进入到服务器中,并正确转发到后面的应用进程中。
那不成是支付宝的沙箱环境挂了,或者支付宝服务器出bug了,理性告诉我应该另有蹊跷,在支付宝的一个页面中有提及这问题。
需确认页面是http还是https,如果是https,那么需要安装ssl证书,证书要求有如下:要求“正规的证书机构签发,不支持自签名”。
然后赶快,按照支付宝,宝爷的要求,去自检了一下自家的证书,下面两个地址可以很方便的检测SSL证书的合法性。
检测地址:
https://www.chinassl.net/ssltools/ssl-checker.html
https://cheapsslsecurity.com/ssltools/ssl-checker.php
把notify_url的通知域名放上去检测,报出No Intermediate/Chain certificate were found.
妈耶,俺们的证书居然不是权威机构颁发的,太可怕了。
未找到相应认证机构所颁发的认证证书链,RapidSSL RSA CA 2018并不是权威机构,所以不被支付宝所信赖,所以就没有向对应的地址notify_url进行接口回调通知。
分析出原因后,立马更换为http的回调地址,便可以正常接收通知了,后面我们换了一个由GoDaddy.com, Inc授权过后的https证书,彻底解决了这个问题。
参考文章: