若是你是從微信支付官網下載的 .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