java 支付宝回调校验签名_支付宝异步回调验证签名
今天做支付宝接口回调这块,不得不说,弄的我焦头烂额,翻了很多陈年旧帖,试了无数种解决坑的方案,在我成功解决的一瞬间,觉得非常有必要记录一下这些坑。
签名验证错误的检查顺序(这里是基于使用官方给的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;
}
}
好了,差不多就总结了这么多,基本上可以让你签名验证成功了。
java 支付宝回调校验签名_支付宝异步回调验证签名相关推荐
- ios不行安卓可以 微信签名_微信支付-支付验证签名失败(iOS)
在项目中添加微信支付,iOS端的所有东西都已经按照文档搞好了,可就是跳转到微信的时候显示"支付验证签名失败",可是安卓端的都没有问题,就很郁闷了. 后来在对文档的时候发现... 6 ...
- 签名别人的公钥以及验证签名的公钥
签名别人的公钥以及验证签名的公钥 (1)suse13b给suse13a的公钥签名 (2)suse13b导出(自己签过名的)suse13a的公钥 (3)suse13c上导入来自suse13b的suse1 ...
- PHP微信支付回调接口下单,如何验证微信支付签名 ,处理异步回调(验证的坑)
在写这之前 看了好多文档,有好多坑在里面,通过多半天的努力终于把验证的问题搞出来了我也不理解微信官网文档写的那么不清晰,一个简单的介绍就能介绍明白,弄一大堆还没写明白,下面直接把我实操的验证贴上,供 ...
- WPF如何获得变量异步回调函数时产生的异步回调
有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...
- python异步回调实现原理_JS基础——异步回调
前言 一个刚入前端的小菜,虽然以前看到过关于回调的文章,但是呢,理解起来有点费劲啊.当时的脑海里就一个概念. 回调:大多出现在Ajax请求,用于处理收到的请求结果. 嘿嘿,当时真的就是这一个想法啊.现 ...
- java数字签名(签名生成,用证书验证签名)
部分签名原理 http://blog.csdn.net/lijiecong/archive/2010/12/24/6096289.aspx (转载序:网上找的好文章,一篇就把我找了几天的所有东西都概括 ...
- java获取芝麻信用授权_支付宝授权获取芝麻信用分数
貌似好久没写文章了,今天来记录下最近用支付宝SDK获取芝麻信用分数的过程,以及踩过的坑. 个人感觉接芝麻信用分数时还是很简单的,基本都是服务端的任务,我们这边只需要将从支付宝授权获取的auth_cod ...
- java支付宝当面付接口_支付宝当面付秘钥生成教程(加对接案例)
总是有小伙伴犯愁支付宝当面付的秘钥生成,看着挺高大上,实际上不是很麻烦,给大家分享一下生成过程,以及对接我们伟大的sspanel的方法 准备 开通了支付宝当面付的账号一枚(本人代开,50大洋,地址:联 ...
- java app后台开发实例_支付宝app-java后台
@ApiOperation(value= "支付宝预支付", httpMethod= "POST") @PostMapping(value= "/al ...
最新文章
- esc pos java打印图片_android 调用蓝牙打印机(ESC/POS 热敏打印机)打印小票和图片...
- 如何避免死锁,我们有什么套路可循?
- javaScript 里面的cookies
- Oracle SQL Access Advisor 说明
- android studio adil位置,在Android Studio 中正确使用adil ”绝对经典“
- JDK 9已完成功能!
- java: 程序包lombok不存在_Java开发神器:Lombok 学习指南
- Java 8实战 第一章笔记
- Java中判断一个字符串全为数字和字母
- python描述对象静态特性的数据为_下列各项中,能同时影响资产和负债发生变化的是( )。...
- php批量mp3转换,flac转mp3软件,支持批量flac转mp3
- 光子晶体和深度学习结合进行多相流检测
- 【Machine Learning】模型融合之Stacking
- 必应暗藏戏精模式,拿捏名人说话语气口头禅!官方还自推三种个性供挑选
- maven仓库镜像改为阿里巴巴
- 在Nignx增加http2模块顺便聊聊HTTP的八卦
- C语言统计一个字符串(包含空格)中字母的种类(不是个数)
- FL Studio 教程之显示按钮简介
- 坐标旋转公式-- 角度和弧度
- 万维考试系统python_万维考试学生客户端