微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)

方案一

若是你是从微信支付官网下载的 .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 方法blog

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 签名更难破解,更安全一些!input

相关文章
相关标签/搜索