开发支付接口时未使用支付宝提供的 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.支付宝公钥需要在客户端配置。