(标题要长^_^)

刚刚把支付宝对接到了自己的WHMCS平台上。

因为只签约了担保交易、使用了CloudFlare的CDN,遇到了许多小问题(非关联),整理下发出来。

1:ILLEGAL_PARTNER_EXTERFACE

这个问题是由于只有担保交易情况下,使用了其他类型接口导致的非法合作接口问题。

我已开始收集到了双功能和即时到账接口的文件,还天真的以为可以直接用双功能,直到。。。

解决方案:使用符合签约合同权限的接口

2:支付宝付款后不发货(等待卖家发货),即使启用了接口的SSL&自动发货选项

一开始遇到这问题,我还以为是自己的接口文件有问题(PS:重新找的,不是1的那个),于是换了我之前为其他商家做对接用的接口。

然并卵,后来启用了“前台返回页面处理数据”,这样确实能自动发货了,但毕竟这样不妥,在为上个商家做对接用的是异步,也就从理论上避免了掉单。但是如果使用客户付款后就关闭页面,支付宝还没有使客户浏览器跳转到商家对接页面时,这样发货消息就不会被触发,也就掉单。

而且即使发货了,确认收货后依旧没有到账。所以,往下看。

3:支付宝付款,并确认收货后不到账(即使等了10分钟)

这个问题我最终找到了原因,是由于Cloudflare的防火墙设定,导致支付宝通知服务器无法传递支付成功消息给商家服务器。(之前为其他商户做的,是国内的CDN)

解除CDN(或其他防火墙)后恢复正常(当然!你需要等待DNS缓存刷新,这通常对于GoogleDNS只有几秒钟,但对于阿里DNS[223.5.5.5],则可能长达几小时甚至更久,我就被坑过!)

CloudFlare的防火墙提供了对于可疑IP/来源的验证码验证服务,也就是可以识别可疑IP,然后发送验证码验证,如果你通过了,即可继续15分钟/几小时或一年的网站访问。

但是CF的黑名单很全,囊括了各大VPS服务商,V#PN等,可能支付宝服务器发出的提醒请求很多,也被CF列入了黑名单。

列入黑名单后你的请求就无法抵达源站,自然无法发货/确认付款。

解决方法:禁用CDN、关闭CDN防火墙 / 把支付宝IP列入白名单

这里有个很坑的地方,CloudFlare的防火墙是无法关闭的(免费版),但是你可以设定为最低(只验证特别明显的攻击),或者加IP白名单。

还有个很坑的地方!就是无法设置白名单URL(也就是无法单独把路径加进去),隔壁的360就支持。

还有个更坑的地方,IP白名单仅支持加/16网段和/24网段的。

从搜索隐禽找到的支付宝通知服务器IP:

121.0.26.0/23

110.75.128.0/19

由于CF只认16和24,

关于使用CDN及安全防护时对接支付宝接口需要注意的事项

所以需要修改为:

121.0.0.0/16(注意,第三段不是26,要修改为0)

110.75.0.0/16(注意:同上)

这样才能加入,再试试,是不是成功了?

关于使用CDN及安全防护时对接支付宝接口需要注意的事项

 

 

补:等等,刚刚发现,支付宝官方也有强调。。

https://cshall.alipay.com/enterprise/help_detail.htm?help_id=477479

https://cshall.alipay.com/enterprise/help_detail.htm?help_id=491096

确认发货开发流程还提到了几个IP段(保险起见还是加上咯):

121.0.26.0/23、110.75.128.0/19、110.75.225.0/24、110.75.242.0/24

3.仍然无法自动发货&收款

关闭SSL访问。

进入WHMCS系统设置,仅指定HTTP访问方式的URL。

或者实现4 ↓

4.修改插件代码,强制指定绝对通知URL

https://github.com/frankwei98/WHMCS_Alipay/issues/2

在发issue之后,又研究了下代码,找到解决方法了。

吧php中的部分改成下面的样子就行(xxx换成自己的哦!):

$alipay_config['return_url'] = "http://xxxxx.com/modules/gateways/callback/alipay_return.php";
$alipay_config['notify_url'] = "http://xxxxx.com/modules/gateways/callback/alipay_callback.php";

这样指定http通知就可以了,试了之后瞬间可以了(新订单情况)。

指定https就不能访问,也不知道是我这的问题还是(没准是CloudFlare的HSTS没折腾好。)

具体哪行也忘了,回调页面也被我改的面目全非233(小小的美化了一下。。原来的提示太low。)

 

PS:上面讨论的情况是,服务器支持PHP-SSL的情况(不是说https入,是出哦),应该是基本把。


眼里有远方,心中有阳光,脚下有力量