• 微信支付 统一下单 字段 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 方法

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

  • 相关阅读:
    QT5编程入门教程
    bstr_t与BSTR
    Android Studio 更改APP图标
    Indy服务器关闭所有客户端连接
    使用高德地图API
    内网渗透——Hadoop未授权访问getshell
    内网渗透——struts2远程任意代码执行(s2-046)
    工具使用——cobalt strike使用
    工具使用——docker使用
    漏洞复现——weblogic任意文件上传(cve-2018-2894)
  • 原文地址:https://www.cnblogs.com/heyangyi/p/9922866.html
Copyright © 2020-2023  润新知