调用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

微信调用api-v3注意事项 - 图1

当前方法支持为

微信调用api-v3注意事项 - 图2

微软文档链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.rsa.importpkcs8privatekey?view=net-6.0&viewFallbackFrom=netframework-4.6

提供额外解决方案 - 转载

https://www.cnblogs.com/bzmy/p/11504413.html

  1. public static string RSAPrivateKeyJava2DotNet(string privateKey)
  2. {
  3. RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
  4. 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>",
  5. Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
  6. Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
  7. Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
  8. Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
  9. Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
  10. Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
  11. Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
  12. Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
  13. }
  14. public static string Sign(string contentForSign, string privateKey)
  15. {
  16. //转换成适用于.Net的秘钥
  17. var netKey = RSAPrivateKeyJava2DotNet(privateKey);
  18. var rsa = new RSACryptoServiceProvider();
  19. rsa.FromXmlString(netKey);
  20. //创建一个空对象
  21. var rsaClear = new RSACryptoServiceProvider();
  22. var paras = rsa.ExportParameters(true);
  23. rsaClear.ImportParameters(paras);
  24. //签名返回
  25. using (var sha256 = new SHA256CryptoServiceProvider())
  26. {
  27. var signData = rsa.SignData(Encoding.UTF8.GetBytes(contentForSign), sha256);
  28. return BytesToHex(signData);
  29. }
  30. }
  31. public static string BytesToHex(byte[] data)
  32. {
  33. StringBuilder sbRet = new StringBuilder(data.Length * 2);
  34. for (int i = 0; i < data.Length; i++)
  35. {
  36. sbRet.Append(Convert.ToString(data[i], 16).PadLeft(2, '0'));
  37. }
  38. return sbRet.ToString();
  39. }

调用

  1. string rsaSecret = @"秘钥";
  2. string signDataString = Sign("Hello World!", rsaSecret);

访问v3请求最终选择方案

https://www.freetechs.cn/archives/1075