• 微信支付微信回调通知验签


        最近在搞微信支付,因为以前搞过微信支付所以觉得应该不难,没想到微信支付v3版本还挺复杂,其中大部分都可以在网上找到解决方法。但是微信通知回调验签却没有任何文章介绍,特别是.net core 。微信官方文档也是写的莫名奇妙走了不少弯路。也有很多人不做验签直接接收数据解密,这样做完全不符合V3的安全要求。官方特别提醒必须做通知验签,并且是字体加粗必须要做验签!
      

        验签方法

        特别注意:回调验签使用的是商户平台证书并不是API证书

        商户平台证书需要通过接口获取,接口地址:微信支付-开发者文档 (qq.com),也可以通过证书下载工具获取:GitHub - wechatpay-apiv3/CertificateDownloader: Java 微信支付 APIv3 平台证书的命令行下载工具

        因为证书有有效期所以推荐大家使用接口获取证书并持久化保存,每天请求一次以保证证书是最新的证书。

        通过工具获得的证书是 pem格式的,下面提供两个验签方式分别支持直接读取证书内容和读取pem文件验签

        

    /// <summary>
            /// 公钥验证签名
            /// </summary>
            /// <param name="data"></param>
            /// <param name="certPah"></param>
            /// <param name="certPwd"></param>
            /// <returns></returns>
            public static bool PubVerifyData(string data,string sign,  string pemFilePath,string password)
            {
              
              
                var pc = new X509Certificate2(pemFilePath, password, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);;
    
    
                var pub = (RSACng)pc.PublicKey.Key;
              return  pub.VerifyData(System.Text.Encoding.Default.GetBytes(data), Convert.FromBase64String(sign), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
            }
            /// <summary>
            /// 公钥验证签名 微信通知头验签 平台证书
            /// </summary>
            /// <param name="data"></param>
            /// <param name="sign"></param>
            /// <param name="pubKey">证书内容string,方法会自动转为byte</param>
            /// <param name="password">默认商户号</param>
            /// <returns></returns>
            public static bool PubVerifyDataByte(string data, string sign, string pubKey, string password)
            {
    
                byte[] pubByte = System.Text.Encoding.Default.GetBytes(pubKey);
                var pc = new X509Certificate2(pubByte, password, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet); ;
    
    
                var pub = (RSA)pc.PublicKey.Key;
                return pub.VerifyData(System.Text.Encoding.Default.GetBytes(data), Convert.FromBase64String(sign), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
            }

    最后根据官方文档拼接数据验签就可以了。

    如果此文有帮到你的话请点个赞吧!!

  • 相关阅读:
    ssh 的参数 -o + 检查是否是无密码访问
    Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号
    Linux 下jJKD,Tomcat部署
    [转]深入理解Java的接口和抽象类
    Java 培训笔记
    十三、MySQL性能优化
    十二、MySQL用户管理
    十一、MySQL触发器
    十、MySQL视图
    九、MySQL存储过程和函数
  • 原文地址:https://www.cnblogs.com/weiwin/p/15830501.html
Copyright © 2020-2023  润新知