支付宝扫码
领取余额宝体验金

轻云博客 > C#技术 > 微信支付body 为中文时签名错误

微信支付body 为中文时签名错误

作者:Aisencici / 日期:2019-3-6 11:12:00 / 分类:C#技术 / 浏览:227

微信支付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; //修改Default为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 签名更难破解,更安全一些!


本文标签:微信支付body 为中文时签名错误
From:微信支付
分享到: