統一下單已通過,也設定了sign_type是 MD5,并且獲取到了 prepay_id,然后將引數傳遞到前段js,就提示驗證簽名失敗。請高手指點下。
C# 后端代碼:
WxPayData data = new WxPayData();
//string device_info = "gotophi.cn";
//data.SetValue("device_info", device_info);//設備號
string S_body = "GoTopHi";
data.SetValue("body", S_body);//商品描述
//data.SetValue("attach", "WXpay");//附加資料
data.SetValue("out_trade_no", strProductID);//商戶訂單號
data.SetValue("total_fee", total_amout);//總金額,單位為 “分”,必須為整數。
data.SetValue("notify_url", "http://www.gotophi.com/WX_pay/");//異步接收微信支付結果通知的回呼地址
data.SetValue("trade_type", "JSAPI");//交易型別
data.SetValue("openid", s_openid);//用戶標識
string nonceStr = GenerateNonceStr();
data.SetValue("nonce_str", nonceStr);//隨機字串
//終端ip
string spbill_create_ip = GetLoginIp();
data.SetValue("spbill_create_ip", spbill_create_ip);
string appid = WxPayConfig.GetConfig().GetAppID();
string mch_id = WxPayConfig.GetConfig().GetMchID();
WxPayData result = WxPayApi.UnifiedOrder(data);//呼叫統一下單介面
string S_return_code = result.GetValue("return_code").ToString();
//return Content(S_return_code);
if (S_return_code == "SUCCESS")
{
string timeStamp = ConvertDateTimeInt(DateTime.Now).ToString();
ViewData["timeStamp"] = timeStamp;
string prepay_id = result.GetValue("prepay_id").ToString();
ViewData["prepay_id"] = prepay_id;
string S_return_code_appid = result.GetValue("appid").ToString();
ViewData["appid"] = S_return_code_appid;
string S_return_code_nonceStr = result.GetValue("nonce_str").ToString();
//string S_return_code_nonceStr = nonceStr;
ViewData["nonceStr"] = S_return_code_nonceStr;
string S_key = WxPayConfig.GetConfig().GetKey();
//string pay_stringA = "appId=" + S_return_code_appid + "&timeStamp=" + timeStamp + "&nonceStr=" + S_return_code_nonceStr + "&package=prepay_id=" + prepay_id + "&signType=MD5";
string pay_stringA = "appId=" + S_return_code_appid + "&timeStamp=" + timeStamp +"&nonceStr=" + S_return_code_nonceStr + "&package=prepay_id=" + prepay_id + "&signType=HMAC-SHA256";
string pay_SignTemp = pay_stringA + "&key=" + S_key;
ViewData["S_sign"] = pay_SignTemp + "***" + s_openid;
//return Content(pay_SignTemp);
string S_paySign = MakeSign(pay_stringA, S_key);
ViewData["S_paySign"] = S_paySign;
}
else
{
Response.Redirect("/error/?s_err=" + HttpUtility.UrlEncode("支付失敗。"));
Response.End();
}
前端JS代碼:
<script type="text/javascript">
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"@ViewData["appid"]", //公眾號名稱,由商戶傳入
"timeStamp":"@ViewData["timeStamp"]", //時間戳,自1970年以來的秒數
"nonceStr":"@ViewData["nonceStr"]", //隨機串
"package":"prepay_id=@ViewData["prepay_id"]",
"signType": "HMAC-SHA256", //微信簽名方式:
"paySign": "@ViewData["S_paySign"]" //微信簽名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判斷前端回傳,微信團隊鄭重提示:
//res.err_msg將在用戶支付成功后回傳ok,但并不保證它絕對可靠。
}
});
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
</script>
介面除錯工具https://pay.weixin.qq.com/wiki/tools/signverify/ 也檢測過二次簽名的 Sign 是正確的。就不明白了,為什么一直提示“驗證簽名失敗”。
nonceStr 的數值也是統一下單時回傳的字串。
key 也沒有問題,做NATIVE支付時是成功的。
請各位前輩指教……。
uj5u.com熱心網友回復:
請各位前輩指教……轉載請註明出處,本文鏈接:https://www.uj5u.com/net/113460.html
標籤:C#
上一篇:MVC 網站運行正常,現在需要關閉一個控制器,要如何做呢?
下一篇:C#服務端和客戶端開發及通信
