1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 支付宝:验签出错 建议检查签名字符串或私钥与应用公钥是否匹配 网关生成的验签字符

支付宝:验签出错 建议检查签名字符串或私钥与应用公钥是否匹配 网关生成的验签字符

时间:2019-12-30 08:22:04

相关推荐

支付宝:验签出错 建议检查签名字符串或私钥与应用公钥是否匹配 网关生成的验签字符

首先说明一下使用的后端语言为php.其它语言可以遇到该问题的话可以参考一下该思路.

先说一下所遇到的问题:

在对接阿里云的 alipay.trade.refund(统一收单交易退款接口)时,按照demo填写下完参数之后,提交到阿里这边返回

{"code": "40002","msg": "Invalid Arguments","sub_code": "isv.invalid-signature","sub_msg": "验签出错,建议检查签名字符串或私钥与应用公钥是否匹配,网关生成的验签字符串为:alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=07****045&biz_content={"out_trade_no ": "2028112327106397754 ","total_amount ": "0.01 ","subject ": "测试test ","timeout_express ": "5 m "}&charset=UTF-8&format=json&method=alipay.trade.precreate&notify_url=http://www.&sign_type=RSA&timetamp=-07-28 11:23:32&version=1.0"}

不管怎么换参数, 得到的结果都大同小异.

排查方法:

密钥不匹配编码格式不统一请求参数数据有误SDK 调用的提交方法有误SDK 运行环境有误接口调用加签方式和应用上选择的加签方式不对应

发现是最后一个问题 "接口调用加签方式和应用上选择的加签方式不对应" 的原因.

原来文档的domo是有误的.原demo是:

$aop = new AopClient ();$aop->gatewayUrl = '/gateway.do';$aop->appId = 'your app_id';$aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';$aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';$aop->apiVersion = '1.0';$aop->signType = 'RSA2';$aop->postCharset='GBK';$aop->format='json';$object = new stdClass();$object->trade_no = '081722001419121412730660';$object->refund_amount = 0.01;$object->out_request_no = 'HZ01RF001';返回参数选项,按需传入//$queryOptions =[// 'refund_detail_item_list'//];//$object->query_options = $queryOptions;$json = json_encode($object);$request = new AlipayTradeRefundRequest();$request->setBizContent($json);$result = $aop->execute ( $request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";$resultCode = $result->$responseNode->code;if(!empty($resultCode)&&$resultCode == 10000){echo "成功";} else {echo "失败";}

应该改为:

require_once './aop/AopCertClient.php';require_once './aop/request/AlipayTradeRefundRequest.php';$aop = new AopCertClient ();$aop->gatewayUrl = '/gateway.do';$aop->appId = 'your app_id';$aop->rsaPrivateKey = '请填写应用公钥,一行字符串,例如:MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCQJAsjOjq5UUJVKvWkfyINN6NrKwU5nr.......CEB0GJxspSiTWRtV307kLcnZNRM8Ke54k8jPSWNWScnlkvlPI3yWPBvoc=';$aop->alipayrsaPublicKey = '请填写应用私钥,一行字符串,例如:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkCQLIzo6uVFCVSr1pH8iDTejaysFOZ6/....../WACODDbkjv1FwIDAQAB';$aop->apiVersion = '1.0';$aop->signType = 'RSA2';$aop->postCharset='UTF-8';$aop->format='json';$aop->charset = 'UTF-8';//是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内$aop->isCheckAlipayPublicCert = true;//应用证书地址$aop->appCertSN = $aop->getCertSN(应用证书地址);//支付宝公钥证书地址$aop->alipayCertSN = $aop->getCertSN(支付宝公钥证书地址);//从支付宝根证书地址$aop->alipayRootCertSN = $aop->getCertSN(从支付宝根证书地址);$object = new stdClass();$object->trade_no = '081722001419121412730660';$object->refund_amount = 0.01;$object->out_request_no = 'HZ01RF001';返回参数选项,按需传入//$queryOptions =[// 'refund_detail_item_list'//];//$object->query_options = $queryOptions;$json = json_encode($object);$request = new AlipayTradeRefundRequest();$request->setBizContent($json);$result = $aop->execute ( $request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";$resultCode = $result->$responseNode->code;if(!empty($resultCode)&&$resultCode == 10000){echo "成功";} else {echo "失败";}

其实就是给出来的php代码示例的加密方式不对,官方文档:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配 | 技术支持 & 案例 FAQy支付宝文档中心/support/01ravw

以上的官方文档也没有给出相应的php代码示例, 我这里记录下来方便以后解决问题

小结语:

解决这个问题花费了我好长时间,刚刚开始以为是我的秘钥没有用对,因为文档描述的是:

$aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';$aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';

我就很纳闷,开发者私钥和应用私钥会不会是不相同的呢?毕竟阿里这么大的一个企业,文字的严谨性应该要求很高,不同的名称应该代表不一样的东西.然后就疯狂找秘钥,疯狂问阿里技术同学,问多了自己也不好意思,最后得出的结论是'接口调用加签方式和应用上选择的加签方式不对应' ,但是又没有demo,只能自己写一下.

支付宝:验签出错 建议检查签名字符串或私钥与应用公钥是否匹配 网关生成的验签字符串为...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。