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

    最近在搞微信支付,因为以前搞过微信支付所以觉得应该不难,没想到微信支付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);
        }

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

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

posted @ 2022-01-21 15:40  树形图  阅读(791)  评论(0编辑  收藏  举报