微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)
程序员文章站
2022-04-14 10:15:48
方案一 如果你是从微信支付官网下载的 .NET C#【微信支付】API对应的SDK 调用示例 查看源码,会发现这个SDK中的 WxPayData 的类的 CalcHMACSHA256Hash 签名方法采用的是 Encoding.Default 编码,如果要编码的字符串为中文,则会出现签名错误 所有需 ......
方案一
如果你是从微信支付官网下载的 .net c#【微信支付】api对应的sdk 调用示例
查看源码,会发现这个sdk中的 wxpaydata 的类的 calchmacsha256hash 签名方法采用的是 encoding.default 编码,如果要编码的字符串为中文,则会出现签名错误
所有需要修改sdk中这个方法的代码:将编码改为utf8
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 方法
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 签名更难破解,更安全一些!
下一篇: C#调用大漠插件,发送QQ和微信消息