1. 程式人生 > >微信支付 統一下單 字段 body 為中文時 報【簽名錯誤】解決方案(C# SDK)

微信支付 統一下單 字段 body 為中文時 報【簽名錯誤】解決方案(C# SDK)

def salt ext var pri utf8 () rap vat

方案一

如果你是從微信支付官網下載的 .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 簽名更難破解,更安全一些!

微信支付 統一下單 字段 body 為中文時 報【簽名錯誤】解決方案(C# SDK)