支付宝异步验签和同步验签

燃烧的冰2020-05-26  277

开发支付接口时未使用支付宝提供的 demo ,那个SDK一堆的坑,所以手工写的全部代码,未使用支付宝一点代码。支付一切正常,异步通知一切正常,异步验证正常。

 

唯独在查询订单和返回数据两个地方搞了半天,会返回“验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为”。从头到尾检查代码找不到问题,支付宝官方API列表看了又看,都没有问题。于是对比返回的错误数据和查询验签的数据,坑在此处。明明说好 biz_content 请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档。可是支付坑人在这里,实际是 biz_content 不但要作为 json 集合请求参数,还要与公共参数进行合并。

 

第一处坑:

    // 公共请求参数
    $arr = array(
        'app_id' => $config['app_id'],
        'method' => 'alipay.trade.query',
        'format' => 'json',
        'charset' => 'UTF-8',
        'sign_type' => $config['sign_type'],
        'timestamp' => date('Y-m-d H:i:s', $time),
        'version' => '1.0',
        'biz_content' => json_encode($biz_content, JSON_UNESCAPED_UNICODE) // 业务请求参数
    );

    $arr += $biz_content; // 坑在此处,要合并,不然验签会失败

 

第二处坑,主动查询订单状态,对返回数据验签:

如果一切正常的花,返回json数据中包含 alipay_trade_query_response 和 sign 签名,对 json 数据 json_decode 得到数组,坑出现了,我把得到 alipay_trade_query_response 排序转字符串,验签死活都是错误的。因为支付时,要求排序转字符串了,所以此处也就排序转字符串,那么大错特错了。此处得到的 alipay_trade_query_response 数据直接转 json 字串,然后验签才是正确做法。

 

其他说一下,容易搞错的。分清楚:应用私钥、应用公钥、支付宝公钥

应用私钥和应用公钥为支付宝卡房平台开发助手生成,下载地址 https://opendocs.alipay.com/open/291/105971

 

1.应用私钥即为商户私钥,客户端使用,后台或支付宝配置中填写;

2.应用公钥在开放平台 “RSA2(SHA256)密钥(推荐)”处填写,然后返回 支付宝公钥;

3.支付宝公钥需要在客户端配置。

最新回复(0)