Alipay SDK for PHP 源码仓库地址
这几天在对接APP支付宝登录时一直报验签错误,报错信息如下:
stdClass Object
(
[error_response] => stdClass Object
(
[code] => 40002
[msg] => Invalid Arguments
[sub_code] => isv.invalid-signature
[sub_msg] => 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为:xxxxxxxxxxxxxxx
)
[sign] => xxxxxxxxx
)
搞了很长时间才搞明白,说明下原因。
支付宝提供了两种加签模式
需要传参:AppID、应用的私钥、应用的公钥证书文件、支付宝公钥证书文件、支付宝根证书文件
需要传参:AppId、应用的私钥、应用的公钥、支付宝公钥
但官方文档中给的代码样例只有公钥模式,而且也没有说明两种模式的对接不一样。
我的支付宝接口加签方式选择的是公钥证书模式,而对接是按照公钥模式对接的,所以就报错了。为了获取支付宝公钥,我还尝试了用支付宝的工具将支付宝公钥证书转成了公钥,都不行。
最终捋了下 Alipay SDK 的源码才发现它提供了AopCertClient
类来处理 公钥证书模式的操作,区别于原来的 AopClient
类的公钥模式。
将验签改为 公钥证书模式 就好了。具体实例可看一下 SDK 中提供的测试样例
[1]
Alipay SDK for PHP: https://github.com/alipay/alipay-sdk-php-all/[2]
官方文档: https://opendocs.alipay.com/open/02ailc[3]
`AopCertClient`: https://github.com/alipay/alipay-sdk-php-all/blob/master/aop/AopCertClient.php[4]
`AopClient`: https://github.com/alipay/alipay-sdk-php-all/blob/master/aop/AopClient.php[5]
测试样例: https://github.com/alipay/alipay-sdk-php-all/tree/master/aop/test