php 支付宝回调验证失败,支付宝回调验证签名失败怎么解决?
支付宝回调验证签名失败的解决方法:1、确保使用的验证签名是正确的;2、确保传入的参数是正确的;3、要在支付宝中给你的回调域名授权;3、确保加密解密类型为RSA2。
回调接口是支持扫码支付方式的回调的,最近业务需要又需要支持移动app的支付方式,回调时却签名验证失败。
支付宝回调验证签名失败怎么解决?
签名验证错误的检查顺序(这里是基于使用官方给的demo,自己封装的请绕道):
1:检查一下你使用的验证签名的方法是否正确?
bool signVerified = AlipaySignature.RSACheckV1(dic, alipay_public_key, config.charset);
2:检查一下你传入的参数是否正确?
参数1:dic,把回调的参数保存到key,value集合中Dictionary dic = new Dictionary();
var form = HttpContext.Current.Request.Form;
string str = "异步通知:\r\n";
foreach (var key in form)
{
dic[key.ToString()] = HttpContext.Current.Request.Form[key.ToString()];
var value = HttpContext.Current.Request.Form[key.ToString()];
//记录日志使用
str += $"{key.ToString()}:{value}\r\n";
}
参数2:alipay_public_key
这个参数是 支付宝公钥!! 很多小伙伴都写成了应用公钥,瞎几把写。
参数3:编码格式,UTF-8,这个一般没人会错。
3:检查一下你的环境
沙盒环境还是线上环境,沙盒环境会出错,具体为什么我不知道,百度来的。要在支付宝中给你的回调域名授权,不授权人家懒得回调给你。
4:检查一下你的加密解密类型
我从官网下载下来的demo里面的解密类型默认是RSA,但是官方文档已经明确说明现在都要用RSA2了,所以记得检查demo的源码public static bool RSACheckV1(IDictionary parameters, string publicKeyPem, string charset)
{
string sign = parameters["sign"];
string sign_type = parameters["sign_type"];
parameters.Remove("sign");
parameters.Remove("sign_type");
string signContent = GetSignContent(parameters);
return RSACheckContent(signContent, sign, publicKeyPem, charset, sign_type);
}
sign_type,这个就是解码类型,demo写的好像“RSA”,我这里改成动态获取了,我们在前期配置的地方也会配置加密类型,从哪获取都可以,别弄错了就行。
5:这里不检查了,回忆一下你的支付宝公钥,是直接存在文本中的,还是写在代码里的(区别:公钥.txt,string 公钥 = “巴拉巴拉巴拉一大堆”),一个是文件,一个是直接代码(我就是代码,所以我一直到最后才解决)(下面的解决方案只针对代码保存支付宝公钥的骚年)string alipay_public_key = "-----BEGIN PUBLIC KEY-----\r\n" + config.alipay_public_key + "-----END PUBLIC KEY-----\r\n\r\n";
bool signVerified = AlipaySignature.RSACheckV1(dic, alipay_public_key, config.charset);
如果是直接写在代码中的,要给支付宝公钥的头跟尾加上标识,具体标识看我贴出来的代码,如果是文件,请自动忽略
还没结束,官方给的demo也是默认找的文件,可是我用的代码存的,哪有文件,所以找不到文件是会报错的,报错直接返回false了,在修改一下源码(自己到AlipaySignature这个类里面去找)public static bool RSACheckContent(string signContent, string sign, string publicKeyPem, string charset, string signType)
{
try
{
if (string.IsNullOrEmpty(charset))
{
charset = DEFAULT_CHARSET;
}
if ("RSA2".Equals(signType))
{
//这里就是要改的地方
//从参数获取
string sPublicKeyPEM = publicKeyPem;
//从文件获取
//string sPublicKeyPEM = File.ReadAllText(publicKeyPem);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.PersistKeyInCsp = false;
RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsa, sPublicKeyPEM);
bool bVerifyResultOriginal = rsa.VerifyData(Encoding.GetEncoding(charset).GetBytes(signContent), "SHA256", Convert.FromBase64String(sign));
return bVerifyResultOriginal;
}
else
{
//这里就是要改的地方
//从参数获取
string sPublicKeyPEM = publicKeyPem;
//从文件获取
//string sPublicKeyPEM = File.ReadAllText(publicKeyPem);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.PersistKeyInCsp = false;
RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsa, sPublicKeyPEM);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
bool bVerifyResultOriginal = rsa.VerifyData(Encoding.GetEncoding(charset).GetBytes(signContent), sha1, Convert.FromBase64String(sign));
return bVerifyResultOriginal;
}
}
catch (Exception e)
{
NLogGetter.NLog.ErrorLog(e);
return false;
}
}
好了,差不多就总结了这么多,基本上可以让你签名验证成功了。
更多相关知识,请访问 PHP中文网!!
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
php 支付宝回调验证失败,支付宝回调验证签名失败怎么解决?相关推荐
- AndroidKiller之APK 编译失败,无法继续下一步签名【BUG解决】【App反向解析】
文章目录 一,AndroidKille解析报错如下: 二,问题描述 三,报错原因分析: 四,解决方案:BUG解决 一,AndroidKille解析报错如下: AndroidKiller: 在反向解析A ...
- 支付宝回调验证签名失败
回调接口是支持扫码支付方式的回调的,最近业务需要又需要支持移动app的支付方式,回调时却签名验证失败.在排除代码.参数.编码格式等问题后,最终确定是支付宝这两种支付方式回调使用的支付宝公钥不一样导致的 ...
- ios支付宝支付失败不回调_iOS支付宝H5支付无法返回APP解决方案
本文只讨论你已经成功实现客户端->支付宝支付流程,仅仅是支付完成后无法返回自己的APP的问题. 如果你的支付流程是客户端->Safari->支付宝不在本文讨论范围之类. iOS支付宝 ...
- ios支付宝支付失败不回调_为什么 iOS 支付成功后能回到 APP ,但是没有回调?...
接入 客户端从服务器端拿到 charge 对象后,调用下面的方法[Pingpp createPayment:charge viewController:viewController appURLSch ...
- php中接口验证失败,支付宝手机接口,服务端PHP验证失败,求助
本帖最后由 js14654952 于 2013-01-16 17:12:11 编辑 最近做支付宝手机接口郁闷死了 求大神们帮忙~! 问题1:手机端安卓自然是JAVA,而服务端是PHP,在做支付宝异步验 ...
- 支付宝扫码支付,回调和退款(沙箱环境配置和完整代码)
支付宝扫码支付 最近重构项目时,负责了支付模块,微信扫码支付(NATIVE)和 支付宝扫码支付,也是第一次接触,虽然根据官方文档和一些博客写出来了,但是遇到的问题却很多,走了很多弯路,浪费了很多精力和 ...
- 支付宝java代码_支付宝回调JAVA版代码
支付宝回调: 1 //这个是支付宝回调的信息 2 @RequestMapping("alipay_callback.do") 3 @ResponseBody 4 public Ob ...
- php支付回调怎么写_php如何接入微信支付回调接口?PHP如何验证微信支付签名?PHP处理微信支付回调的函数...
需求: 安卓,ios端集成微信支付,PHPer(我)要提供一个接口给微信调用,(支付完成后调用),若是成功,就返回success,若是失败就返回fail,php 环境说明:thinkphp 框架开发 ...
- PHP微信支付回调接口下单,如何验证微信支付签名 ,处理异步回调(验证的坑)
在写这之前 看了好多文档,有好多坑在里面,通过多半天的努力终于把验证的问题搞出来了我也不理解微信官网文档写的那么不清晰,一个简单的介绍就能介绍明白,弄一大堆还没写明白,下面直接把我实操的验证贴上,供 ...
最新文章
- php 网站速度慢,php – 个人用户网站速度慢,但他们可以切换浏览器?
- matlab 集成学习方法,将simulink集成到matlab脚本中
- unit类型是什么?_项目中有用过锁吗?能解释一下什么是AQS(AbstractQueuedSynchronizer)吗?...
- php 三元预算? :_项目预算:一种反模式
- 解决chrome在docky上的图标模糊或不能锁定的问题
- linux是不是显示不了中文版,Linux为什么OpenOffice下不能显示中文
- ddmmyy日期格式是多少_DDMMYY什么意思?
- UI自动化测试工具-AirTest
- JavaWeb - 常用的HTTP请求头与响应头
- 【图片】 3D打印的一些小东西 暗黑
- java页面标签span_span标签跳转新页面
- Windows 10 数据恢复与预防数据丢失指南
- vscode 登陆leetcode 报错:Accessing non-existent property ‘padLevels‘ of module
- 腾讯云函数免费搭建onedrive网盘
- java值面向对象2
- 十九、 指派问题 - 匈牙利法 (0-1 整数规划)
- 不使用redis,在前后端分离项目的条件下将验证码进行储存
- win10 iso安装包中的两个setup.exe如何使用
- 横向TableVIew的实现
- 【5G核心网】5G概念之-MICO Mode