您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)ASP.NET MVC開發(fā)微信支付Html5的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
H5支付是指商戶在微信客戶端外的移動(dòng)端網(wǎng)頁展示商品或服務(wù),用戶在前述頁面確認(rèn)使用微信支付時(shí),商戶發(fā)起本服務(wù)呼起微信客戶端進(jìn)行支付。
主要用于觸屏版的手機(jī)瀏覽器請求微信支付的場景??梢苑奖愕膹耐獠繛g覽器喚起微信支付。
微信開放平臺(tái)上的也只是簡單的介紹了一下邏輯和常見問題,網(wǎng)上查看了很多,說的都不夠具體
首先需要在微信商戶平臺(tái)里開通 H5支付
申請入口:登錄商戶平臺(tái)-->產(chǎn)品中心-->我的產(chǎn)品-->支付產(chǎn)品-->H5支付
代碼邏輯:
1、用戶在商戶側(cè)完成下單,使用微信支付進(jìn)行支付
2、由商戶后臺(tái)向微信支付發(fā)起下單請求(調(diào)用統(tǒng)一下單接口)注:交易類型trade_type=MWEB
3、統(tǒng)一下單接口返回支付相關(guān)參數(shù)給商戶后臺(tái),如支付跳轉(zhuǎn)url(參數(shù)名“mweb_url”),商戶通過mweb_url調(diào)起微信支付中間頁
4、中間頁進(jìn)行H5權(quán)限的校驗(yàn),安全性檢查
5、如支付成功,商戶后臺(tái)會(huì)接收到微信側(cè)的異步通知
6、用戶在微信支付收銀臺(tái)完成支付或取消支付,返回商戶頁面(默認(rèn)為返回支付發(fā)起頁面)
7、商戶在展示頁面,引導(dǎo)用戶主動(dòng)發(fā)起支付結(jié)果的查詢
8,9、商戶后臺(tái)判斷是否接到收微信側(cè)的支付結(jié)果通知,如沒有,后臺(tái)調(diào)用我們的訂單查詢接口確認(rèn)訂單狀態(tài)
10、展示最終的訂單支付結(jié)果給用戶
我們需要用到的參數(shù):
AppID(應(yīng)用ID)
AppSecret(應(yīng)用密鑰)
微信支付商戶號(hào)
微信商戶支付密鑰
我這里使用了第三方封裝的SDK。謝謝開發(fā)者SDK的幫助。
Senparc.Weixin
獻(xiàn)上地址:https://weixin.senparc.com/
H5支付其實(shí)就是生成一個(gè)鏈接,點(diǎn)擊后會(huì)激活微信APP,彈出支付窗口
所以需要生成一個(gè)符合規(guī)則的Url,引入SDK
Com.Wxpay.WxPayConfig wxConfig = new Com.Wxpay.WxPayConfig(); Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null); packageReqHandler.SetParameter("appid", wxConfig.appid);//APPID packageReqHandler.SetParameter("mch_id", wxConfig.mchid);//商戶號(hào) packageReqHandler.SetParameter("nonce_str", Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr()); packageReqHandler.SetParameter("body", "測試商品"); packageReqHandler.SetParameter("out_trade_no", model.OrderID);//訂單號(hào) packageReqHandler.SetParameter("total_fee", cost.ToString()); //金額,以分為單位 packageReqHandler.SetParameter("spbill_create_ip", Request.UserHostAddress);//IP packageReqHandler.SetParameter("notify_url", "http://" + HttpContext.Request.Url.Host + "/WxPay/PayNotifyUrl"); //回調(diào)地址 packageReqHandler.SetParameter("trade_type", "MWEB");//這個(gè)不可以改。固定為Mweb packageReqHandler.SetParameter("sign", packageReqHandler.CreateMd5Sign("key", wxConfig.key)); string data = packageReqHandler.ParseXML(); var urlFormat = "https://api.mch.weixin.qq.com/pay/unifiedorder"; var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data); MemoryStream ms = new MemoryStream(); ms.Write(formDataBytes, 0, formDataBytes.Length); ms.Seek(0, SeekOrigin.Begin); var result = RequestUtility.HttpPost(urlFormat, null, ms); var res = System.Xml.Linq.XDocument.Parse(result); string mweb_url = res.Element("xml").Element("mweb_url").Value;
然后我們會(huì)得到下面的Xml
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx***********]]></appid> <mch_id><![CDATA[1*******]]></mch_id> <nonce_str><![CDATA[4rN3Sy63EsAErTq7]]></nonce_str> <sign><![CDATA[0E34B9B750778540436A5CDF005212CF]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201********************************]]></prepay_id> <trade_type><![CDATA[MWEB]]></trade_type> <mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9]]></mweb_url> </xml>
提取到 mweb_url,綁定到href上即可。
<a href="https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9" rel="external nofollow" >立即支付</a>
支付成功之后,在回調(diào)地址里處理業(yè)務(wù)邏輯
/// <summary> /// 支付結(jié)果回調(diào)地址 /// </summary> /// <returns></returns> [HttpPost] public virtual ActionResult PayNotifyUrl() { Com.Wxpay.WxPayConfig wxConfig = new Com.Wxpay.WxPayConfig(); Senparc.Weixin.MP.TenPayLibV3.ResponseHandler payNotifyRepHandler = new Senparc.Weixin.MP.TenPayLibV3.ResponseHandler(null); payNotifyRepHandler.SetKey(wxConfig.key); string return_code = payNotifyRepHandler.GetParameter("return_code"); string return_msg = payNotifyRepHandler.GetParameter("return_msg"); string xml = string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg); if (return_code.ToUpper() != "SUCCESS") { return Content(xml, "text/xml"); } string out_trade_no = payNotifyRepHandler.GetParameter("out_trade_no"); //微信服務(wù)器可能會(huì)多次推送到本接口,這里需要根據(jù)out_trade_no去查詢訂單是否處理,如果處理直接返回:return Content(xml, "text/xml"); 不跑下面代碼 //驗(yàn)證請求是否從微信發(fā)過來(安全) if (payNotifyRepHandler.IsTenpaySign()) { //TO DO } else { } return Content(xml, "text/xml"); }
注意:
不要使用此url直接打開,會(huì)提示錯(cuò)誤。
感謝各位的閱讀!關(guān)于“ASP.NET MVC開發(fā)微信支付Html5的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。