ASP.NET MVC 開發微信支付H5(外置瀏覽器支付)

H5支付是指商戶在微信客戶端外的移動端網頁展現商品或服務,用戶在前述頁面確認使用微信支付時,商戶發起本服務呼起微信客戶端進行支付。php

主要用於觸屏版的手機瀏覽器請求微信支付的場景。能夠方便的從外部瀏覽器喚起微信支付。 web

 

微信開放平臺上的也只是簡單的介紹了一下邏輯和常見問題,網上查看了不少,說的都不夠具體api

首先須要在微信商戶平臺裏開通 H5支付瀏覽器

申請入口:登陸商戶平臺-->產品中心-->個人產品-->支付產品-->H5支付安全

 

代碼邏輯:服務器

 

一、用戶在商戶側完成下單,使用微信支付進行支付微信

 

二、由商戶後臺向微信支付發起下單請求(調用統一下單接口)注:交易類型trade_type=MWEBapp

 

三、統一下單接口返回支付相關參數給商戶後臺,如支付跳轉url(參數名「mweb_url」),商戶經過mweb_url調起微信支付中間頁異步

 

四、中間頁進行H5權限的校驗,安全性檢查測試

 

五、如支付成功,商戶後臺會接收到微信側的異步通知

 

六、用戶在微信支付收銀臺完成支付或取消支付,返回商戶頁面(默認爲返回支付發起頁面)

 

七、商戶在展現頁面,引導用戶主動發起支付結果的查詢

 

8,九、商戶後臺判斷是否接到收微信側的支付結果通知,如沒有,後臺調用咱們的訂單查詢接口確認訂單狀態

 

十、展現最終的訂單支付結果給用戶

 

-------------------------------------------------------------------------------------------------------------------------------------------

 

咱們須要用到的參數:

AppID(應用ID)
AppSecret(應用密鑰)
微信支付商戶號 
微信商戶支付密鑰 

我這裏使用了第三方封裝的SDK。謝謝開發者SDK的幫助。

Senparc.Weixin

獻上地址:https://weixin.senparc.com/

 

-------------------------------------------------------------------------------------------------------------------------------------------

H5支付其實就是生成一個連接,點擊後會激活微信APP,彈出支付窗口

因此須要生成一個符合規則的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);//商戶號
                    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

<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">當即支付</a>

支付成功以後,在回調地址裏處理業務邏輯

        /// <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

相關文章
相關標籤/搜索