mvc 微信公众号支付

来源:互联网 发布:用的什么java工具 编辑:程序博客网 时间:2024/06/05 14:16

公众号支付具体流程和安装都不说了,大家都可以去看文档,具体代码实现,页面因为是例子就一个按钮

微信回调也是这个页面

@{    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    }    }
可以给微信的例子下下来,对于我们小白来说看看根据例子改改,加上页面与控制器就可以了

最后记得给控制器路径加入到微信支付授权目录的白名单,在手机上测试就可以啦


原创粉丝点击