C# 微信支付 wx.chooseWXPay 签名错误的解决方法
本着安全第一慎用第三方代码的原则,决定自己根据微信支付SDK写支付过程,从统一下单开始一切还算顺利,到最后JS发起支付调用时抛出“支付签名错误”,下面将给出正确签名方法
这里整理出的签名函数实际是通用的,在统一下单时或支付返回验证时都可以调用
重点是非空参数才参与签名,参数名称区分大小写,排序要按照ASC顺序排列,key(密匙)永远放在最后一位
以下是原函数说明:
wx.chooseWXPay({ timestamp:0,//支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr:'',//支付签名随机串,不长于32位 package:'',//统一支付接口返回的prepay\_id参数值,提交格式如:prepay\_id=\*\*\*) signType:'',//签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign:'',//支付签名 success:function(res){ //支付成功后的回调函数 } });
备注:prepay_id通过微信支付统一下单接口拿到,paySign采用统一的微信支付Sign签名生成方法,注意这里appId也要参与签名,appId与config中传入的appId一致,即最后参与签名的参数有appId,timeStamp,nonceStr,package,signType。
签名通用函数:
publicstaticstringGenSign(IDictionarydata,stringsign_type,stringkey) { varsign=string.Join("&",data.Where(m=>!m.Key.EqualsIgnoreCase("sign")&&m.Value!=null&&(m.Valueasstring)!="").OrderBy(m=>m.Key).Select(m=>m.Key+"="+m.Value))+"&key="+key; returnsign_type=="HMAC-SHA256"?sign.HashSHA256():sign.HashMD5(); } publicstaticstringHashSHA256(thisstrings) { using(varsha=SHA256.Create()) { vardata=sha.ComputeHash(Encoding.UTF8.GetBytes(s)); varsb=newStringBuilder(); foreach(variindata)sb.Append(i.ToString("X2")); returnsb.ToString(); } } publicstaticstringHashMD5(thisstrings) { using(varmd5=MD5.Create()) { vardata=md5.ComputeHash(Encoding.UTF8.GetBytes(s)); varsb=newStringBuilder(); foreach(variindata)sb.Append(i.ToString("X2")); returnsb.ToString(); } }
正确签名方法(注意大小写):
vardata=newDictionary(); data.Add("timeStamp",(DateTime.Now.ToUniversalTime().Ticks-621355968000000000)/10000000); data.Add("nonceStr",Guid.NewGuid().ToString("N")); data.Add("package",/*统一下单得到的预支付交易会话标识*/); data.Add("signType","MD5"); varpaySign=GenSign(data,"MD5",/*你的微信支付密钥*/);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。