這篇文章主要為大家展示了“微信JSAPI支付操作需要注意的細(xì)節(jié)有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“微信JSAPI支付操作需要注意的細(xì)節(jié)有哪些”這篇文章吧。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),大渡口網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:大渡口等地區(qū)。大渡口做網(wǎng)站價(jià)格咨詢:028-86922220首先介紹一下我在調(diào)用微信支付接口使用的是 weixin.senparc SDK,非常方便好用開(kāi)源的一個(gè)微信開(kāi)發(fā)SDK。
weixin.senparc SDK 官網(wǎng):http://weixin.senparc.com/
先去下載下來(lái)Senparc.Weixin SDK。
在調(diào)起支付接口之前,需要先要調(diào)用統(tǒng)一下單接口,商戶系統(tǒng)先調(diào)用該接口在微信支付服務(wù)后臺(tái)生成預(yù)支付交易單,返回正確的預(yù)支付交易回話標(biāo)識(shí)后再在APP里面調(diào)起支付。
微信 JsApi支付 在這個(gè)目錄下 Senparc.Weixin.MP.Sample.Controllers 找到JsApi支付。
public ActionResult JsApi(string code, string state) { if (string.IsNullOrEmpty(code)) { return Content("您拒絕了授權(quán)!"); } if (!state.Contains("|")) { //這里的state其實(shí)是會(huì)暴露給客戶端的,驗(yàn)證能力很弱,這里只是演示一下 //實(shí)際上可以存任何想傳遞的數(shù)據(jù),比如用戶ID,并且需要結(jié)合例如下面的Session["OAuthAccessToken"]進(jìn)行驗(yàn)證 return Content("驗(yàn)證失?。≌?qǐng)從正規(guī)途徑進(jìn)入!1001"); } try { //獲取產(chǎn)品信息 var stateData = state.Split('|'); int productId = 0; ProductModel product = null; if (int.TryParse(stateData[0], out productId)) { int hc = 0; if (int.TryParse(stateData[1], out hc)) { var products = ProductModel.GetFakeProductList(); product = products.FirstOrDefault(z => z.Id == productId); if (product == null || product.GetHashCode() != hc) { return Content("商品信息不存在,或非法進(jìn)入!1002"); } ViewData["product"] = product; } } //通過(guò),用code換取access_token var openIdResult = OAuthApi.GetAccessToken(TenPayV3Info.AppId, TenPayV3Info.AppSecret, code); if (openIdResult.errcode != ReturnCode.請(qǐng)求成功) { return Content("錯(cuò)誤:" + openIdResult.errmsg); } string sp_billno = Request["order_no"]; if (string.IsNullOrEmpty(sp_billno)) { //生成訂單10位序列號(hào),此處用時(shí)間和隨機(jī)數(shù)生成,商戶根據(jù)自己調(diào)整,保證唯一 sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId, DateTime.Now.ToString("yyyyMMdd"), TenPayV3Util.BuildRandomStr(10)); } else { sp_billno = Request["order_no"]; } var timeStamp = TenPayV3Util.GetTimestamp(); var nonceStr = TenPayV3Util.GetNoncestr(); var body = product == null ? "test" : product.Name; var price = product == null ? 100 : product.Price * 100; var xmlDataInfo = new TenPayV3UnifiedorderRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, body, sp_billno, price, Request.UserHostAddress, TenPayV3Info.TenPayV3Notify, TenPayV3Type.JSAPI, openIdResult.openid, TenPayV3Info.Key, nonceStr); var result = TenPayV3.Unifiedorder(xmlDataInfo);//調(diào)用統(tǒng)一訂單接口 //JsSdkUiPackage jsPackage = new JsSdkUiPackage(TenPayV3Info.AppId, timeStamp, nonceStr,); var package = string.Format("prepay_id={0}", result.prepay_id); ViewData["appId"] = TenPayV3Info.AppId; ViewData["timeStamp"] = timeStamp; ViewData["nonceStr"] = nonceStr; ViewData["package"] = package; ViewData["paySign"] = TenPayV3.GetJsPaySign(TenPayV3Info.AppId, timeStamp, nonceStr, package, TenPayV3Info.Key); return View(); } catch (Exception ex) { var msg = ex.Message; msg += "
" + ex.StackTrace; msg += "
==Source==
" + ex.Source; if (ex.InnerException != null) { msg += "
===InnerException===
" + ex.InnerException.Message; } return Content(msg); } }
先在微信服務(wù)后臺(tái)生成預(yù)支付交易單,獲得預(yù)支付訂單號(hào)。
先說(shuō)說(shuō)在統(tǒng)一下單這里遇到的坑。
1.在統(tǒng)一下單的時(shí)候解析返回結(jié)果,一直出現(xiàn)以下問(wèn)題:您沒(méi)有JSAPI支付權(quán)限
1)先看看你的公眾號(hào)微信支付設(shè)置是否正確。
關(guān)于如何配置微信支付:可以參考這個(gè) http://jingyan.baidu.com/article/77b8dc7fef360d6174eab690.html
2)檢查你的授權(quán)目錄是否正確,格式要這樣,后面記得別漏了一個(gè)/ 例如:http://test.cn/u/
3)檢查需要傳過(guò)去的賬戶參數(shù),上公眾號(hào)還有商戶號(hào)檢查你的賬戶參數(shù)是否正確。我在開(kāi)發(fā)當(dāng)中就出現(xiàn),微信公眾號(hào)商戶號(hào),appid 是分別不同兩個(gè)公眾號(hào)的,坑啊,找了好久,覺(jué)得不對(duì)勁,原來(lái)是給的配置參數(shù)密鑰不對(duì)。
這里詳細(xì)說(shuō)一下對(duì)應(yīng)的參數(shù):
MCHID:商戶號(hào)(必須配置,開(kāi)戶郵件中可查看),商戶申請(qǐng)微信支付后,由微信支付分配的商戶收款賬號(hào)。
APPID:微信開(kāi)放平臺(tái)審核通過(guò)的應(yīng)用APPID,appid是微信公眾賬號(hào)或開(kāi)放平臺(tái)APP的唯一標(biāo)識(shí),在公眾平臺(tái)申請(qǐng)公眾賬號(hào)或者在開(kāi)放平臺(tái)申請(qǐng)APP賬號(hào)后,微信會(huì)自動(dòng)分配對(duì)應(yīng)的appid用于標(biāo)識(shí)該應(yīng)用??稍谖⑿殴娖脚_(tái)-->開(kāi)發(fā)者中心查看,商戶的微信支付審核通過(guò)郵件中也會(huì)包含該字段值.
KEY:商戶支付密鑰,參考開(kāi)戶郵件設(shè)置(必須配置,登錄商戶平臺(tái)自行設(shè)置),交易過(guò)程生成簽名的密鑰,僅保留在商戶系統(tǒng)和微信支付后臺(tái),不會(huì)在網(wǎng)絡(luò)中傳播。商戶妥善保管該Key,切勿在網(wǎng)絡(luò)中傳輸,不能在其他客戶端中存儲(chǔ),保證key不會(huì)被泄漏。商戶可根據(jù)郵件提示登錄微信商戶平臺(tái)進(jìn)行設(shè)置。也可按一下路徑設(shè)置:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置.
APPSECRET:公眾帳號(hào)secert(僅JSAPI支付的時(shí)候需要配置, 登錄公眾平臺(tái),進(jìn)入開(kāi)發(fā)者中心可設(shè)置)
2.在統(tǒng)一下單,解析返回來(lái)的結(jié)果我出現(xiàn)了商戶號(hào)mch_id與appid不匹配這個(gè)問(wèn)題
原因是我拿到的商戶號(hào)不是這個(gè)公眾號(hào)的。一定要檢查是不是這個(gè)公眾號(hào)的商戶號(hào)。
3.在統(tǒng)一下單,解析返回來(lái)的結(jié)果出現(xiàn) appid and openid not match,appid和openid不匹配。
原因是我這個(gè)用戶的openid 不是這個(gè)公眾號(hào)的
4.在統(tǒng)一下單,解析返回來(lái)的結(jié)果出現(xiàn) CDATA[openid is invalid],openid無(wú)效
原因是,傳過(guò)去不是有效的opendid。不小心看錯(cuò)了,把用戶id 當(dāng)做openid傳過(guò)去了。
當(dāng)統(tǒng)一下單成功,會(huì)返回以下格式的參數(shù)
解析獲得預(yù)支付單號(hào):
string prepayId = res.Element("xml").Element("prepay_id").Value; //獲取預(yù)支付訂單號(hào)
給頁(yè)面對(duì)應(yīng)地參數(shù)
ViewData["appId"] = TenPayV3Info.AppId; ViewData["timeStamp"] = timeStamp; ViewData["nonceStr"] = nonceStr; ViewData["package"] = package; ViewData["paySign"] = TenPayV3.GetJsPaySign(TenPayV3Info.AppId, timeStamp, nonceStr, package, TenPayV3Info.Key);
靜態(tài)頁(yè)面js調(diào)用:
wx.chooseWXPay({ timestamp: 0, // 支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫(xiě)。但最新版的支付后臺(tái)生成簽名使用的timeStamp字段名需大寫(xiě)其中的S字符 nonceStr: '', // 支付簽名隨機(jī)串,不長(zhǎng)于 32 位 package: '', // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=***) signType: '', // 簽名方式,默認(rèn)為'SHA1',使用新版支付需傳入'MD5' paySign: '', // 支付簽名 success: function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") {//支付成功 } else { //支付失敗 } // 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對(duì)可靠。 } });
以上是“微信JSAPI支付操作需要注意的細(xì)節(jié)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。