微信支付body 为中文时签名错误
方案一
如果你是从微信支付官网下载的 .NET C#【微信支付】API对应的SDK 调用示例
查看源码,会发现这个SDK中的 WxPayData 的类的 CalcHMACSHA256Hash 签名方法采用的是 Encoding.Default 编码,如果要编码的字符串为中文,则会出现签名错误
所有需要修改SDK中这个方法的代码:将编码改为UTF8
1 2 3 4 5 6 7 8 9 10 11 12 | private string CalcHMACSHA256Hash( string plaintext, string salt)
{
string result = "" ;
var enc = Encoding.UTF8;
byte []
baText2BeHashed = enc.GetBytes(plaintext),
baSalt=enc.GetBytes(salt);
System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
byte [] baHashedText = hasher.ComputeHash(baText2BeHashed);
result= string .Join( "" , baHashedText.ToList().Select(b => b.ToString( "x2" )).ToArray());
return result;
}
|
方案二
在签名的类型使用 SIGN_TYPE_MD5 方式:
这个时候需要修改下单方法中的 WxPayApi 类 UnifiedOrder 方法
1 2 3 4 | inputObj.SetValue( "sign_type" , WxPayData.SIGN_TYPE_MD5);
inputObj.SetValue( "sign" , inputObj.MakeSign(WxPayData.SIGN_TYPE_MD5));
|
注意客户端中的签名方式也需要跟服务端保持一直,如果下单用的是 SIGN_TYPE_MD5,
则客户端用SIGN_TYPE_MD5,如果客户端用SIGN_TYPE_HMAC_SHA256,
则服务端用SIGN_TYPE_HMAC_SHA256
最后:建议使用方案一,个人觉得 256 签名更难破解,更安全一些!