Alipay SDK for PHP 验签出错问题可能原因

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
)

搞了很长时间才搞明白,说明下原因。

错误原因

支付宝提供了两种加签模式

  • 1、公钥证书模式(推荐)

需要传参:AppID、应用的私钥、应用的公钥证书文件、支付宝公钥证书文件、支付宝根证书文件

  • 2、公钥模式

需要传参: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