zoukankan      html  css  js  c++  java
  • asp.net mvc下实现微信公众号(JsApi)支付介绍

    本文主要讲解asp.net mvc框架下公众号支付如何实现,公众号支付主要包括三个核心代码,前台调起支付js代码、对应js调用参数参数生成代码、支付成功处理代码。

    一、微信支付方式介绍

    微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种:

    1、刷卡支付

    刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。

    2、扫码支付

    扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

    3、公众号支付

    公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

    1. ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
    2. ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
    3. ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

    4、APP支付

    APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

    5、H5支付

    H5支付用于在手机端微信外浏览器进行支付,笔者的测试本支付方式在微信内不能使用。

    具体相关代码如下:

    二、前端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;
                            }
                        });
                    });
                });
    三、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");
                }
            }
    四、成功支付处理代码
    /// <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());
        }
    }

    五、源码下载地址:http://www.kwstu.com/ResourcesView/weixin_201710301110519827

    联系QQ:806693619

  • 相关阅读:
    Python Day14
    Python Day13
    Python Day12
    Python Day11
    Python Day10
    Python Day9
    Python Day8
    Python Day7
    Python Day6
    Python Day5
  • 原文地址:https://www.cnblogs.com/kwstu/p/7797400.html
Copyright © 2011-2022 走看看