asp.net mvc下實現微信公衆號(JsApi)支付介紹

本文主要講解asp.net mvc框架下公衆號支付如何實現,公衆號支付主要包括三個核心代碼,前臺調起支付js代碼、對應js調用參數參數生成代碼、支付成功處理代碼。html

1、微信支付方式介紹

微信提供了各類支付方式,試用於各類不一樣的支付場景,主要有以下幾種:前端

一、刷卡支付ajax

刷卡支付是用戶展現微信錢包內的「刷卡條碼/二維碼」給商戶系統掃描後直接完成支付的模式。主要應用線下面對面收銀的場景。json

二、掃碼支付

掃碼支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信「掃一掃」完成支付的模式。該模式適用於PC網站支付、實體店單品或訂單支付、媒體廣告支付等場景。api

三、公衆號支付

公衆號支付是用戶在微信中打開商戶的H5頁面,商戶在H5頁面經過調用微信支付提供的JSAPI接口調起微信支付模塊完成支付。應用場景有:瀏覽器

  1. ◆ 用戶在微信公衆帳號內進入商家公衆號,打開某個主頁面,完成支付
  2. ◆ 用戶的好友在朋友圈、聊天窗口等分享商家頁面鏈接,用戶點擊連接打開商家頁面,完成支付
  3. ◆ 將商戶頁面轉換成二維碼,用戶掃描二維碼後在微信瀏覽器中打開頁面後完成支付

四、APP支付

APP支付又稱移動端支付,是商戶經過在移動端應用APP中集成開放SDK調起微信支付模塊完成支付的模式。微信

五、H5支付mvc

H5支付用於在手機端微信外瀏覽器進行支付,筆者的測試本支付方式在微信內不能使用。框架

具體相關代碼以下:asp.net

2、前端js調起代碼
var _wxJsApiParam;
            function callpay() {
                if (typeof WeixinJSBridge == "undefined") {
                    if (document.addEventListener) {
                        document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
                    }
                    else if (document.attachEvent) {
                        document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                        document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
                    }
                }
                else {
                    jsApiCall();
                }
            }
            //調用微信JS api 支付
            function jsApiCall() {
                WeixinJSBridge.invoke('getBrandWCPayRequest', _wxJsApiParam,
                  function (res) {
                      if (res.err_msg == "get_brand_wcpay_request:cancel") {
                          $.messager.alert('提示信息', '支付已經取消!', 'info');
                          return false;
                      } else if (res.err_msg == "get_brand_wcpay_request:ok") {
                          //支付成功
                          $.messager.alert('提示信息', '支付成功!', 'info');
                      }
                  });
            }
            $(function () {
                $("#buyBtn").click(function () {
                    //調起微信公衆號JsApi支付
                    $.ajax({
                        url: "/Pay/GenerateOrder",
                        type: 'post',
                        cache: false,
                        dataType: 'html',
                        data: {
                            OBJECTID: $("#OBJECTID").val()
                        },
                        success: function (data) {
                            if (data != "Error") {
                                _wxJsApiParam = eval('(' + data + ')');
                                callpay();
                            }
                            else $.messager.alert('提示信息', '生成訂單失敗!', 'info');
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert(textStatus); return;
                        }
                    });
                });
            });

 

3、Js參數生成代碼
/// <summary>
        /// 生成訂單及JSAPI提交參數
        /// </summary>
        /// <param name="tmpModel"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult GenerateOrder()
        {
            try
            {
                //調用支付
                JsApiPay jsApiPay = new JsApiPay();
                jsApiPay.bodyStr = "商品名稱";
                jsApiPay.attachStr = "附加信息";
                jsApiPay.orderId = "訂單編號";
                jsApiPay.openid = "OpenId";
                jsApiPay.total_fee = 1;//測試 訂單金額(1表示分,正式金額要*100)
                //JSAPI支付預處理
                //調用統一下單,得到下單結果
                WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult();
                //從統一下單成功返回的數據中獲取微信瀏覽器調起jsapi支付所需的參數
                var wxJsApiParam = jsApiPay.GetJsApiParameters(); //獲取到的是json格式字符串
                return Content(wxJsApiParam);
            }
            catch (Exception e)
            {
                return Content("Error");
            }
        }

 

4、成功支付處理代碼
/// <summary>
/// 支付成功後臺處理方法
/// </summary>
/// <returns></returns>
[HttpPost]
public virtual ActionResult JsApiNotifyUrl()
{
    WxPayData notifyData = GetNotifyData();
    //檢查支付結果中transaction_id是否存在
    if (!notifyData.IsSet("transaction_id"))
    {
        //若transaction_id不存在,則當即返回結果給微信支付後臺
        WxPayData res = new WxPayData();
        res.SetValue("return_code", "FAIL");
        res.SetValue("return_msg", "支付結果中微信訂單號不存在");
        Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
        return Content("支付結果中微信訂單號不存在");
    }
    string transaction_id = notifyData.GetValue("transaction_id").ToString();
    string trade_no = notifyData.GetValue("out_trade_no").ToString();//訂單號
    //查詢訂單,判斷訂單真實性
    if (!QueryOrder(transaction_id))
    {
        //若訂單查詢失敗,則當即返回結果給微信支付後臺
        WxPayData res = new WxPayData();
        res.SetValue("return_code", "FAIL");
        res.SetValue("return_msg", "訂單查詢失敗");
        Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
        return Content("訂單查詢失敗");
    }
    //查詢訂單成功
    else
    {
        WxPayData res = new WxPayData();
        res.SetValue("return_code", "SUCCESS");
        res.SetValue("return_msg", "OK");
        Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
        //更新支付狀態
         
        return Content("支付成功" + res.ToXml());
    }
}

 

5、源碼下載地址:http://www.kwstu.com/ResourcesView/weixin_201710301110519827

聯繫QQ:806693619

相關文章
相關標籤/搜索