微信支付微信回调通知验签
最近在搞微信支付,因为以前搞过微信支付所以觉得应该不难,没想到微信支付v3版本还挺复杂,其中大部分都可以在网上找到解决方法。但是微信通知回调验签却没有任何文章介绍,特别是.net core 。微信官方文档也是写的莫名奇妙走了不少弯路。也有很多人不做验签直接接收数据解密,这样做完全不符合V3的安全要求。官方特别提醒必须做通知验签,并且是字体加粗必须要做验签!
验签方法
特别注意:回调验签使用的是商户平台证书并不是API证书
商户平台证书需要通过接口获取,接口地址:微信支付-开发者文档 (qq.com),也可以通过证书下载工具获取:GitHub - wechatpay-apiv3/CertificateDownloader: Java 微信支付 APIv3 平台证书的命令行下载工具
因为证书有有效期所以推荐大家使用接口获取证书并持久化保存,每天请求一次以保证证书是最新的证书。
通过工具获得的证书是 pem格式的,下面提供两个验签方式分别支持直接读取证书内容和读取pem文件验签
///
/// 公钥验证签名
///
///
///
///
///
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);
}
///
/// 公钥验证签名 微信通知头验签 平台证书
///
///
///
/// 证书内容string,方法会自动转为byte
/// 默认商户号
///
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);
}
最后根据官方文档拼接数据验签就可以了。
如果此文有帮到你的话请点个赞吧!!