首先说明一下使用的后端语言为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=201607****045&biz_content={"out_trade_no ": "20200728112327106397754 ","total_amount ": "0.01 ","subject ": "测试test ","timeout_express ": "5 m "}&charset=UTF-8&format=json&method=alipay.trade.precreate&notify_url=http://www.opendocs.alipay.com&sign_type=RSA&timetamp=2020-07-28 11:23:32&version=1.0"
}

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

排查方法:

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

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

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

$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/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 = '2021081722001419121412730660';
$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 = 'https://openapi.alipay.com/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 = '2021081722001419121412730660';
$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支付宝文档中心https://opendocs.alipay.com/support/01ravw

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

小结语:

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

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

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

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

  1. 支付宝:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

    springboot项目,公钥证书方式,进行支付宝退款时,支付宝返回:"验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配".返回值里面,sub_code值是isv.inva ...

  2. 支付宝报错: invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为:xxx

    错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为:xxx https://blog.csdn.net/weix ...

  3. 错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

    错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配 错误信息已经很明显了,就是说验签错误. 之前一度以为是自己的公钥私钥不对,一直在傻傻 ...

  4. python123判断字符串结尾_Python学习教程:在字符串的开头和结尾处做文本匹配

    原标题:Python学习教程:在字符串的开头和结尾处做文本匹配 Python学习教程:在字符串的开头和结尾处做文本匹配 我们需要在字符串的开头和结尾处按照指定的文本模式做检查,例如检查文件的扩展名.U ...

  5. php支付宝退款签名出错,支付宝-验签出错, 未配置对应签名算法的公钥或者证书...

    在对接支付接口-单笔转账到支付宝账户时,一直返回40003错误"验签出错, 未配置对应签名算法的公钥或者证书" 查看sdk AopClient.php 文件,加密类型 signTy ...

  6. 支付宝沙箱调试错误,请回到请求来源地,重新发起请求。错误代码 invalid-signature 错误原因: 验签出错 hutool JSONObject

    调试错误,请回到请求来源地,重新发起请求. 错误代码 invalid-signature 错误原因: 验签出错 我这里的错误的确就是表单里面的value应该是出现了不应该出现的换行符,  然后产生这个 ...

  7. PHP 支付宝SDK加密与解密、签名与验签(含php原生写法)

    1.使用支付宝SDK,本次使用的SDK是老版 支付宝文档:https://opendocs.alipay.com/open/54/103419 首先下载或使用新上线的Web在线加密,生成应用私钥与应用 ...

  8. 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...

    在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...

  9. 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装

    微信支付 V3版本的 签名生成,验签,解密,统一下单的简单封装 V3Base 获取平台证书 回调报文解密 统一下单 暂时看了文档只完成了这部分,感觉封装的不是特别完美,希望有大佬指点一下,想着封装好一 ...

最新文章

  1. RESTful之过滤Filtering
  2. PHP中环境变量的设置
  3. Vuex新手的理解与使用
  4. Spring之高级装配(二)
  5. 数组的foreach方法和jQuery中的each方法
  6. Huffuman树(java)
  7. 算法之【折半插入法】
  8. Normalizing Flows Tutorial(标准化流教程)第一部分
  9. 白话之jsonp跨域原理分析
  10. linux 开机加载的文档,Linux 修改文档“打开方式”
  11. python双线性插值函数_OpenCV ——双线性插值(Bilinear interpolation)
  12. 怎么用C语言程序表白,c语言表白代码 用C语言表白.doc
  13. 炸弹人 炸弹爆炸 c语言_发展恐怖故事–邮件炸弹
  14. 网络规划师学习-二层交换机工作原理和二层交换机为啥不能跨网段通信
  15. Rabbit MQ安装和基本概念
  16. tween.js简介
  17. Android组件化架构实践,成功拿下大厂offer
  18. 华三防火墙Reth链路冗余技术
  19. python自动化测试平台方案_基于Python的软件测试自动化平台研究
  20. MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器

热门文章

  1. C++数组:猴子选大王
  2. java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.update.Update.getTable()Lnet/sf/jsqlparser/
  3. macOS终端颜色的设定方法与说明:CLICOLOR与LSCOLORS
  4. 阿里云服务器被攻击的危害有多大
  5. 一、《跟我学spring3》电子书下载地址:
  6. 设置共享文件夹之Mac技巧
  7. ArrayList源码学习第二天全解
  8. CREStereo: Practical Stereo Matching via Cascaded Recurrent Networkwith Adaptive Correlation-论文阅读
  9. JavaScript 高级程序设计 —— 对象
  10. Python-Django毕业设计航空订票系统(程序+Lw)