调用api-v3时需注意请求头加入证书签名
官方文档链接:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml
https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/qian-ming-sheng-cheng

当前方法支持为

提供额外解决方案 - 转载
https://www.cnblogs.com/bzmy/p/11504413.html
public static string RSAPrivateKeyJava2DotNet(string privateKey){RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));}public static string Sign(string contentForSign, string privateKey){//转换成适用于.Net的秘钥var netKey = RSAPrivateKeyJava2DotNet(privateKey);var rsa = new RSACryptoServiceProvider();rsa.FromXmlString(netKey);//创建一个空对象var rsaClear = new RSACryptoServiceProvider();var paras = rsa.ExportParameters(true);rsaClear.ImportParameters(paras);//签名返回using (var sha256 = new SHA256CryptoServiceProvider()){var signData = rsa.SignData(Encoding.UTF8.GetBytes(contentForSign), sha256);return BytesToHex(signData);}}public static string BytesToHex(byte[] data){StringBuilder sbRet = new StringBuilder(data.Length * 2);for (int i = 0; i < data.Length; i++){sbRet.Append(Convert.ToString(data[i], 16).PadLeft(2, '0'));}return sbRet.ToString();}
调用
string rsaSecret = @"秘钥";string signDataString = Sign("Hello World!", rsaSecret);
访问v3请求最终选择方案
