背景

上个月有个做虚拟卡券的哥们找我,他刚把站从别的平台迁到易支付上,折腾了三天说回调一直不触发。

起因

他之前用的是某第三方聚合支付,那边回调是自动配好的,不需要自己管。换到易支付之后,他以为把商户后台的回调地址填上就行了,结果订单支付成功之后,用户那边页面上一直转圈,页面不跳转,订单状态也不更新。 他跟我说这事的时候,语气已经有点急了。说那天下午已经发出去十来个货,全是手动核的,人快疯了。

踩坑

他干了什么?他先在易支付后台的"支付通道配置"里填了回调地址,然后又跑到微信支付商户平台那边也填了一遍。两个地址填的还不一样——一个是他的域名+/notify,另一个是域名+/callback.php。 结果翻车了。用户付完钱,易支付那边显示支付成功,但系统完全没收到通知。他当时想的是"多填几个地方总有一个能用",这想法我见过不知道多少次了。 上周去楼下买咖啡,店员说机器坏了只能现金,我翻遍口袋凑了八块钱,还差五毛,后面排队的人盯着我看。最后把零钱罐倒出来才够。

他后来跟我说,当时还专门去查了服务器日志,发现根本就没有任何来自支付平台的请求打到他的服务器上。他以为是防火墙拦了,又把安全组全放开了,还是不行。

转折

他实在没辙了,跑来找我。我让他把易支付后台的配置页面截图发过来,看完就知道问题了。 易支付的回调地址配置,很多新手不知道——它分两层。第一层是全局设置里有个"默认回调地址",第二层是每个支付通道单独有"回调地址覆盖"选项。他全局设了一个,通道里又覆盖了一个,但通道覆盖那里他填错了,少写了一个斜杠。 就少了那个斜杠,整个回调路径就不对。易支付内部处理的时候,全局回调被通道覆盖项取代了,但覆盖项路径是坏的,所以回调根本发不出去。 我让他把通道覆盖项清空,只保留全局设置里的地址,然后重新试了一下。第一次测试还是没反应,我让他再检查一下Nginx配置——果然,他的服务器上根本没开对应端口的监听。

结果

前后折腾了大概两个小时才彻底搞定。那哥们当天晚上把之前手动核对的订单全部标记成已处理了,损失了多少不太清楚,他自己说大概亏了百来块钱的退款差额。从那以后,他每次改配置都会先拿一块钱试一单。

如果重来

易支付的回调地址配置,我的建议是——全局设置里只填一个地址,所有通道都不要单独覆盖,除非你非常清楚自己在干什么。另外,设置完之后不要急着上线,先用测试通道发一笔最低金额,确认服务器日志里能看到POST请求进来再说。之前我写过一篇关于排查回调收不到的详细步骤,叫支付回调收不到?按这五步排查,十分钟搞定,他那情况其实第一步就中招了。 你永远不知道少一个斜杠能让你多加班多久。