H5支付是指商戶在微信客戶端外的移動端網頁展示商品或服務,用戶在前述頁面確認使用微信支付時,商戶發起本服務呼起微信客戶端進行支付。
主要用于觸屏版的手機瀏覽器請求微信支付的場景。可以方便的從外部瀏覽器喚起微信支付。
微信開放平臺上的也只是簡單的介紹了一下邏輯和常見問題,網上查看了很多,說的都不夠具體
首先需要在微信商戶平臺里開通 H5支付
申請入口:登錄商戶平臺-->產品中心-->我的產品-->支付產品-->H5支付
代碼邏輯:
1、用戶在商戶側完成下單,使用微信支付進行支付
2、由商戶后臺向微信支付發起下單請求(調用統一下單接口)注:交易類型trade_type=MWEB
3、統一下單接口返回支付相關參數給商戶后臺,如支付跳轉url(參數名“mweb_url”),商戶通過mweb_url調起微信支付中間頁
4、中間頁進行H5權限的校驗,安全性檢查
5、如支付成功,商戶后臺會接收到微信側的異步通知
6、用戶在微信支付收銀臺完成支付或取消支付,返回商戶頁面(默認為返回支付發起頁面)
7、商戶在展示頁面,引導用戶主動發起支付結果的查詢
8,9、商戶后臺判斷是否接到收微信側的支付結果通知,如沒有,后臺調用我們的訂單查詢接口確認訂單狀態
10、展示最終的訂單支付結果給用戶
我們需要用到的參數:
- AppID(應用ID)
- AppSecret(應用密鑰)
- 微信支付商戶號
- 微信商戶支付密鑰
我這里使用了第三方封裝的SDK。謝謝開發者SDK的幫助。
Senparc.Weixin
獻上地址:https://weixin.senparc.com/
H5支付其實就是生成一個鏈接,點擊后會激活微信APP,彈出支付窗口
所以需要生成一個符合規則的Url,引入SDK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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); //商戶號 packageReqHandler.SetParameter( "nonce_str" , Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr()); packageReqHandler.SetParameter( "body" , "測試商品" ); packageReqHandler.SetParameter( "out_trade_no" , model.OrderID); //訂單號 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" ); //回調地址 packageReqHandler.SetParameter( "trade_type" , "MWEB" ); //這個不可以改。固定為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; |
然后我們會得到下面的Xml
1
2
3
4
5
6
7
8
9
10
11
12
|
< 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>
支付成功之后,在回調地址里處理業務邏輯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/// <summary> /// 支付結果回調地址 /// </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" ); //微信服務器可能會多次推送到本接口,這里需要根據out_trade_no去查詢訂單是否處理,如果處理直接返回:return Content(xml, "text/xml"); 不跑下面代碼 //驗證請求是否從微信發過來(安全) if (payNotifyRepHandler.IsTenpaySign()) { //TO DO } else { } return Content(xml, "text/xml" ); } |
注意:
不要使用此url直接打開,會提示錯誤。
微信官方文檔地址:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/vanteking/p/7275369.html