关于PHPCMS v9支付模块在使用新支付宝接口key时报错不能正常使用的解决方法
问题描述:
如题,在iphpcms.net的会员群中有学员提出当前版本的phpcms(v9.5)在使用其支付模块中的支付宝接口进行在线充值支付功能时存在着问题,表现为“使用三年前申请的支付宝接口key是正常的,但是使用醉近刚刚申请的就会失败”。
问题分析:
此问题从表现形式来看就知道应该是phpcms v9中的支付模块中的支付宝接口程序某些地方因为很久没有更新太过老旧导致的不符合支付宝新版本接口规则导致的。
好的,那么接下来就是要找到需要更新的地方了,说实话,本人因为之前在给客户做某些项目是遇到过此问题(大约是2013年的事情了),并进行了一定的研究,正好把一些主要需要注意修改升级的地方给大家进行说明。
因为时间太久,现回想查看以前的资料,有些细节可能有所遗漏,算是供读者参考吧~
解决方法:
找到支付宝的接口程序,文件目录:/phpcms/modules/pay/class/Alipay.class.php 。
在此文件中,主要修改的地方有两处:
第35行:
$this->config['gateway_url'] = 'https://www.alipay.com/cooperate/gateway.do?_input_charset='.CHARSET;
修改为:
$this->config['gateway_url'] = 'https://mapi.alipay.com/gateway.do?_input_charset='.CHARSET;
第85行:
$verify_result = $this->get_verify('http://notify.alipay.com/trade/notify_query.do?partner=' . $this->config['alipay_partner'] . '¬ify_id=' . $receive_data['notify_id']);
修改为:
$verify_result = $this->get_verify('https://mapi.alipay.com/gateway.do?service=notify_verify&partner=' . $this->config['alipay_partner'] . '¬ify_id=' . $receive_data['notify_id']);
至此,相信大家已经发现了问题所在,是的,主要问题是支付宝新版接口中更换了请求地址。
这个请求地址的更高已经是2013年的事情了,可是到现在仍然没有更新,本人只能对此汗颜了,希望官方尽快更新吧。
另外附上部分当时支付宝开发者平台给出的通知,以便大家了解,因为时间太“久远”很难找到原文地址了,这也是从互联网上找到的:
【公告】于2013年3月20日支付宝接口网关地址切换
尊敬的支付宝用户:
计划于2013年3月20日,支付宝将要停止商户接口访问(https://www.alipay.com/cooperate/gateway.do)。
现在,在此通知各位已经在使用支付宝接口的商户,建议您尽快切换您网站支付宝接口的通知网关。
依据我们提供的代码示例,您只需要更改两处地方:
请求地址——
https://www.alipay.com/cooperate/gateway.do?
替换成:
https://mapi.alipay.com/gateway.do?
通知验证地址——
https://www.alipay.com/cooperate/gateway.do?service=notify_verify&
替换成:
https://mapi.alipay.com/gateway.do?service=notify_verify&
各开发语言具体修改方法如下:
ASP编程语言:
打开class文件夹下的alipay_notify.asp文件,
修改20行代码HTTPS_VERIFY_URL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify&"
为:HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&"
PHP编程语言:
打开lib文件夹下的alipay_notify.class.php文件,
修改22行代码:var $https_verify_url = 'https://www.alipay.com/cooperate/gateway.do?service=notify_verify&';
为:var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
.net编程语言
打开app_code文件夹下的AlipayNotify.cs文件,
修改HTTPS支付宝通知路径:private string Https_veryfy_url = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify&";
为: private string Https_veryfy_url = "https://mapi.alipay.com/gateway.do?service=notify_verify&";
Java编程语言
打开srccomlipayutil下面的 AlipayNotify.java文件,
修改HTTPS形式消息验证地址:private static final String HTTPS_VERIFY_URL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify&";
为:private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do? service=notify_verify&";
以上为各个语言的网关修改方法。
如果您修改后,出现了问题,那么建议您恢复原代码继续使用。
注意:这个修改只针对2012年2月28上午10点半以前已经下载接口包在使用的客户。在此后下载接口包的客户无需做代码修改。