天天看點

mvc 微信公衆号支付

公衆号支付具體流程和安裝都不說了,大家都可以去看文檔,具體代碼實作,頁面因為是例子就一個按鈕

微信回調也是這個頁面

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>微信支付</title>
</head>
<body>
    <div class="line">
        <input type="button" class="btn" value="立即充值" onclick="fCharge()" style="margin-top: 20px;" />
    </div>
    <script src="~/Scripts/jquery-1.7.1.intellisense.js"></script>
    <script src="~/Scripts/jquery-1.7.1.js"></script>
    <script src="~/Scripts/jquery-1.7.1.min.js"></script>
    <script type="text/javascript">
    $(function () {
        var vCode = getQueryString("code");
        if (vCode != "" && vCode != null) {
            //alert(vCode);
            $.ajax({
                type: 'post',
                data: {
                    code: vCode
                },
                url: '/WeiChat/getWxInfo',
                success: function (sjson) {
                    alert(sjson);
                    var vData = JSON.stringify(sjson);
                    alert(vData);
        
                }
            })
        }
        else {
            $.ajax({
                type: 'post',
                url: '/WeiChat/getCode',
                success: function (sjson) {
                    //alert(sjson);
                    location.href = sjson;
                }
            })
        }
    })
    //擷取url的參數
    function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]); return null;
    }





    //初始化微信支付環境
    function fCharge() {
        if (typeof WeixinJSBridge == "undefined") {
            if (document.addEventListener) {
                document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
            } else if (document.attachEvent) {
                document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
                document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
            }
        } else {
            fPostCharge();
        }
    }
    //送出充值資料
    function fPostCharge() {
            $.ajax({
                type: "post",
                data: "totalfee=1",
                url: "/WeiChat/WeChat_Wap",
                success: function (json) {
                    console.log(json);
                    var jsnStr = JSON.parse(json);
                    onBridgeReady(jsnStr);
                },
                error: function () {
      
                   alert("提示", '調用微信支付子產品失敗,請稍後再試。', 'info')
                }
            })
    }
    //調用微信支付子產品
    function onBridgeReady(json) {
        WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId": json.appId,     //公衆号名稱,由商戶傳入
           "timeStamp": json.timeStamp,         //時間戳,自1970年以來的秒數
           "nonceStr": json.nonceStr, //随機串
           "package": json.package,
           "signType": "MD5",         //微信簽名方式:
           "paySign": json.paySign //微信簽名
       },
       function (res) {
           if (res.err_msg == "get_brand_wcpay_request:ok") {
               alert("支付成功,請稍後查詢餘額,如有疑問,請聯系管理者.");
               fAlreadyPay();
           }     // 使用以上方式判斷前端傳回,微信團隊鄭重提示:res.err_msg将在使用者支付成功後傳回    ok,但并不保證它絕對可靠。
       }
        );
    }
    </script>
</body>
</html>
           

控制器

using LitJson;
using Smile.Framework.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using WxPayAPI.lib;

namespace WxPayAPI.Controllers
{
    public class WeiChatController : Controller
    {

        JsApiPay jsApiPay = new JsApiPay();

        #region 視圖頁面
        /// <summary>
        /// 微信支付頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult WeChat()
        {
            if (Session["openid"] == null)
            {
                try
                {
                    GetOpenidAndAccessToken();

                }
                catch (Exception ex)
                {
                }
            }
            return View();
        }

         #endregion

        #region  20170330 gaosheng  微信支付
        /**
        //* 網頁授權擷取使用者基本資訊的全部過程
        //* 詳情請參看網頁授權擷取使用者基本資訊:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
        //* 第一步:利用url跳轉擷取code
        //* 第二步:利用code去擷取openid和access_token
        //*/
        public void GetOpenidAndAccessToken()
        {  
            if (Session["code"] != null)
            {
                //擷取code碼,以擷取openid和access_token
                string code = Session["code"].ToString();
                Log.Debug(this.GetType().ToString(), "Get code : " + code);
                jsApiPay.GetOpenidAndAccessTokenFromCode(code);
            }
            else
            {
                //構造網頁授權擷取code的URL
                string host = Request.Url.Host;
                string path = Request.Path;
                string redirect_uri = HttpUtility.UrlEncode(WxPayConfig.NOTIFY_URL);
                //string redirect_uri = HttpUtility.UrlEncode("http://gzh.lmx.ren");
                WxPayData data = new WxPayData();
                data.SetValue("appid", WxPayConfig.APPID);
                data.SetValue("redirect_uri", redirect_uri);
                data.SetValue("response_type", "code");
                data.SetValue("scope", "snsapi_base");
                data.SetValue("state", "STATE" + "#wechat_redirect");
                string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
                Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url);
                Session["url"] = url;
            }
        }

 
        /// <summary>
        /// 擷取code
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ActionResult getCode()
        {
            object objResult = "";
            if (Session["url"] != null)
            {
                objResult = Session["url"].ToString();
            }
            else
            {
                objResult = "url為空。";
            }
            return Json(objResult);
        }

       /// <summary>
       /// 通過code換取網頁授權access_token和openid的傳回資料
       /// </summary>
       /// <returns></returns>
       [HttpPost]
        public ActionResult getWxInfo()
        {
            object objResult = "";
            string strCode = Request.Form["code"];
            JsonData jd = null;
            if (Session["access_token"] == null || Session["openid"] == null)
            {
               jd= jsApiPay.GetOpenidAndAccessTokenFromCode(strCode);
               Session["access_token"] = jd["access_token"];
               Session["openid"] = jd["openid"];
            }

            string strAccess_Token = Session["access_token"].ToString();
            string strOpenid = Session["openid"].ToString();
            objResult = new { openid = strOpenid, access_token = strAccess_Token };
            return Json(objResult);
        }







 
        /// <summary>
        /// 點選支付進入,對微信端進行下單
        /// </summary>
        /// <param name="id"></param>
        /// <param name="return_url"></param>
        /// <returns></returns>
        public ActionResult WeChat_Wap()
        {
            try
            {
                //T_Order order = null;
                //var orderid = Base64Help.base64ToString(id);
                //var OrderBll = new T_OrderManager();
                //var exist = OrderBll.ExistOrder(orderid, out order);
                //if (!exist)
                //{
                //    throw new Exception("缺少需要驗證支付狀态的必要條件");
                //}
                //if (order.OrderType != (int)OrderTypeEnum.Create)
                //{
                //    throw new Exception("訂單支付類型錯誤");
                //}
                //if (order.OrderState == (int)OrderStateEnum.Successful)
                //{

                //    return Json("訂單已支付,請勿重複送出");
                //}
                //生成訂單号
                //OrderBll.UpdateOrderNumber(orderid, out order);
                //調用手機網站支付接口
                //SetAliPay_Wap(order.OrderNumber, return_url);
                var model = SetWeChat_Wap().ToJson().Replace("\\", "");
                return Json(model);
            }
            catch (Exception ex)
            {
                return Json("");
            }
        }

        /// <summary>
        /// 調用微信下單接口 傳回調微信支付的參數
        /// </summary>
        /// <param name="no">訂單編号</param>
        private WxPayData SetWeChat_Wap()
        {
            #region 傳回調用app接口的參數


            Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");
            string strAccess_Token = Session["access_token"].ToString();
            string strOpenid = Session["openid"].ToString();
            WxPayData data = new WxPayData();
            data.SetValue("body", "測試商品資料");//商品描述
            data.SetValue("attach", "test");//附加資料
            data.SetValue("out_trade_no", "123456");//随機字元串
            data.SetValue("total_fee", Convert.ToInt32(0.01 * 100));//總金額
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時間
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易結束時間
            data.SetValue("goods_tag", "自學檢測付費訂單");//商品标記
            data.SetValue("trade_type", "JSAPI");//交易類型
            data.SetValue("product_id", "a11878d2-2c35-49fb-a31f-9d9e922af32e");//商品ID
            data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//異步通知位址
            data.SetValue("openid", strAccess_Token);//異步通知位址
            //data.SetValue("access_token", strOpenid);//異步通知位址
            WxPayData result = WxPayApi.UnifiedOrder(data); //調用統一下單接口

            string prepayid = result.GetValue("prepay_id").ToString(); //獲得統一下單接口傳回的支付交易會話ID

            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
            data = new WxPayData();                                        //調App接口參數
            data.SetValue("appId", WxPayConfig.APPID);//公衆賬号ID
            //data.SetValue("partnerid", WxPayConfig.MCHID);//商戶号
            data.SetValue("package", "prepay_id="+ prepayid);//支付交易會話ID	  	    
            data.SetValue("nonceStr", WxPayApi.GenerateNonceStr());//随機字元串
            //data.SetValue("package", "Sign=WXPay");//擴充字段
            data.SetValue("timeStamp", timestamp);//時間戳	 
            data.SetValue("signType", "MD5");//簽名
            data.SetValue("paySign", data.MakeSign());//簽名
            return data;              //調用app接口參數
            #endregion
        }






        #endregion
    }
    }
           

可以給微信的例子下下來,對于我們小白來說看看根據例子改改,加上頁面與控制器就可以了

最後記得給控制器路徑加入到微信公衆号支付》支付授權目錄的白名單,在手機上測試就可以啦

繼續閱讀