/// <summary>
/// 使用微信支付平台证书公钥加密验签
/// https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/qian-ming-yan-zheng
/// </summary>
public class WXPlatform
{
public string PublicKey { get; private set; }
private byte[] _publicKeyBytes { get; set; }
/// <summary>
/// 构造方法
/// </summary>
/// <param name="publickey">-----BEGIN CERTIFICATE----- 开头的string,转为bytes->不需要每次都去</param>
public WXPlatform(string publickey)
{
this.PublicKey = publickey;
this._publicKeyBytes = Encoding.UTF8.GetBytes(publickey);
}
/// <summary>
/// 最终提交请求时,需对敏感信息加密,如身份证、银行卡号。
/// 加密算法是RSA,使用从接口下载到的公钥进行加密,非后台下载到的私钥。
/// </summary>
/// <param name="text">要加密的明文</param>
/// <param name="publicKey"> </param>
/// <returns></returns>
public string Encrypt(string text)
{
var x509 = new X509Certificate2(this._publicKeyBytes);
using (var rsa = (RSACryptoServiceProvider)x509.PublicKey.Key)
{
var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), true);
return Convert.ToBase64String(buff);
}
}
/// <summary>
/// 验证签名
/// </summary>
/// <param name="signedString">私钥加密串-Wechatpay-Signature</param>
/// <param name="signSourceString">验签名串-应答时间戳\n应答随机串\n应答报文主体\n</param>
/// <returns></returns>
public bool VerifySign(string signedString, string signSourceString)
{
var x509 = new X509Certificate2(this._publicKeyBytes);
using (var rsa = (RSACryptoServiceProvider)x509.PublicKey.Key)
{
using (var sha256 = new SHA256CryptoServiceProvider())
{
var b = rsa.VerifyData(Encoding.UTF8.GetBytes(signSourceString), sha256, Convert.FromBase64String(signedString));
return b;
}
}
}
}
大佬,我这个你知道怎么搞吗?公钥是平台证书拿解密拿的,还有开头和换行符在里面,这里报错说无法将RSACng对象转换成RSacyptologyServiceProvider对象
我使用这个验签的方法也是报这个错 asp.net core 3 环境
找到一篇文章,可以看下
我这边为什么回调没有签名?
大佬, 你好, 我想问下, 那个publickey 是通过这个接口(https://api.mch.weixin.qq.com/v3/certificates)获取到的这个字段(ciphertext)的值吗? 我直接用这个值会报错
https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/zheng-shu-he-hui-tiao-bao-wen-jie-mi
有个疑问?就是验证签名哪个方法,是注释写错了吗?
官方文档是说:信支付使用商户证书中的公钥对下行的敏感信息进行加密。开发者应使用商户私钥对下行的敏感信息的密文进行解密。你这个验证签名这个方法是用于解密的吧?
验证签名应该是用公钥验签,官方文档是说:商户的技术人员应使用微信支付平台证书中的公钥验签。
是这样吗?还是我理解错了?
https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/qian-ming-yan-zheng
微信支付API v3使用微信支付的平台私钥(不是商户私钥)进行应答签名。相应的,商户的技术人员应使用微信支付平台证书中的公钥验签。
请问:开发者应使用商户私钥对下行的敏感信息的密文进行解密,这个有对应的方法?