支付宝异步回调验证签名的那些走过的坑

liuqiwang 2018-06-22 原文

支付宝异步回调验证签名的那些走过的坑

今天做支付宝接口回调这块,不得不说,弄的我焦头烂额,翻了很多陈年旧帖,试了无数种解决坑的方案,在我成功解决的一瞬间,觉得非常有必要记录一下这些坑。

签名验证错误的检查顺序(这里是基于使用官方给的demo,自己封装的请绕道):

1:检查一下你使用的验证签名的方法是否正确?

bool signVerified = AlipaySignature.RSACheckV1(dic, alipay_public_key, config.charset);

2:检查一下你传入的参数是否正确?

参数1:dic,把回调的参数保存到key,value集合中

Dictionary<string, string> dic = new Dictionary<string, string>();
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<string, string> 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;
    }

}

好了,差不多就总结了这么多,基本上可以让你签名验证成功了。

版权声明:本文为liuqiwang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liuqiwang/p/9213502.html

支付宝异步回调验证签名的那些走过的坑的更多相关文章

  1. 在区块链的冬天,也许瑞波模式更值得借鉴

    首先,这篇文章不作为任何投资建议。 我只是深入研究了一下瑞波,因为不久前,瑞波币(XRP)的市值超过了以太坊。 […]...

  2. 基于.NET的APP开发和Windows开发,异步回调差别

      在Smobiler的开发中,控件或组件及客户端功能都是通过事件或委托来进行处理的。   Smobiler是 […]...

  3. 仿支付宝首页头部伸缩效果

    仿支付宝首页头部伸缩效果 原文链接:https://mp.weixin.qq.com/s/GegMt7GDBC […]...

  4. 支付宝 单笔转账到支付宝账户接口 – 提现

    实现用户提现 资金自动到账 如果能够实现到提现这一步,前期的配置什么的都应该做好了,这里就不赘述了。 当前开发 […]...

  5. 新增秒杀功能、优惠券、支付宝、Docker,newbee-mall升级版开源啦!

    新蜂商城升级版本newbee-mall-plus开源啦! 最近是非常非常非常忙,一方面是公司的事情比较多,另外 […]...

  6. 基于xposed逆向微信、支付宝、云闪付来实现个人免签支付功能

      我的个人网站如何实现支付功能?   想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件 […]...

  7. Future 异步回调 大起底之 Java Future 与 Guava Future

    疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -17【 博客园 总入口 】 目录 写在前面 源码 […]...

  8. iOS银联,支付宝,微信,ping++开发文档

    iOS支付宝,银联,微信,ping++开发文档 银联支付 银联支付目测只需两个参数 1.tn 其实就是订单号 […]...

随机推荐

  1. Linux系统(十):WEB项目部署(2021最新最详细)

    Linux系统发行版ContOS7演示部署WEB项目 为防止操作权限不足,建议切换root用户,当然如果你对L […]...

  2. Mac终端 常用命令

    OSX 的文件系统  OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Window […]...

  3. 用abp vNext快速开发Quartz.NET定时任务管理界面

    今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来 […]...

  4. [转]华为开发者联盟开放的服务 – freeliver54

    [转]华为开发者联盟开放的服务 本文转自:https://developer.huawei.com/consu […]...

  5. Quartz 和 springboot schedule中的cron表达式关于星期(周几)的不同表示

    Quartz 和 springboot schedule中的cron表达式关于星期(周几)的不同表示 一.Qu […]...

  6. 微信无法打开压缩文件的2种解决方法(以苹果手机为例)

    微信无法打开压缩文件的2种解决方法(以苹果手机为例)       前言   最近遇到一个问题,同事微信发我一个 […]...

  7. Mac用户如何借助BetterZip提取压缩文件?

    Mac用户如何借助BetterZip提取压缩文件? 小编了解到很多入手Mac的朋友们都会有产生这样的困扰:如何 […]...

  8. LoadRunner 思考时间与事务响应时间的区别与关系

      LoadRunner 思考时间与事务响应时间的区别与关系   思考时间lr_think_time 就是一个 […]...

展开目录

目录导航