欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信支付 统一下单 字段 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 签名更难破解,更安全一些!