为了账号安全,请及时绑定邮箱和手机立即绑定

.net微信JSAPIPay记录

标签:
C#

本人开发时已有微信公众平台和微信商户平台的账号和密码,申请这些账号的步骤宝宝就省啦
一.前期准备
1.微信公众平台: 接口权限-网页授权-下设置网页授权域名
图片描述

2.我只写到域名,下载下来的文件放在网站根目录下
图片描述

3.微信公众平台:获取APPID、设置AppSecret
图片描述

4.在微信商户平台-账户中心-API安全设置API秘钥-key
图片描述
5.微信公众平台 设置微信支付授权目录,MVC项目一定要写到具体的控制器,否则会出现当前url未注册问题
图片描述

下载了微信支付.net C#的SDK
宝宝是MVC项目,和demo大同小异,对于理解微信支付的过程是很有帮助的
https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_CS_v3.zip
其中主要用到的就是这几个文件
HttpServices.cs
Log.cs
WxPayException.cs
WxPayApi.cs:
-------------以上四个文件可以直接使用,以下三个文件需要修改--------------
JsApiPay.cs:
这个文件里GetUnifiedOrderResult()这个方法是用来下单的,其中很多参数都是test,需要自己传入参数
WXPayConfig.cs:
这个配置文件主要是信息,比如APPID,key之类的全部修改成自己的
WxPayData.cs:
WxPayData()这个方法注释掉,这个文件的方法主要是将参数设置值、格式、排序,微信的接口接收参数一定要是A-Z排序的
这些文件里出现的Page都去掉,MVC木有的啦,
MVC获取路径的方法和demo的方法也有所不同,应该明白的,修改一下就ok

整个过程简单说就是
1.获取用户的openid,
2.然后通过统一下单接口下个单得到prepay_id,
3.将一些参数传到前台,js调用微信浏内置的微信支付请求的方法

//访问这个页面的时候获取openID等信息
#region 产品页 
   public ActionResult Product()
        {
        //调用【网页授权获取用户信息】接口获取用户的openid和access_token
            JsApiPay jsApi = new JsApiPay();
            jsApi.GetOpenidAndAccessToken();

            //获取收货地址js函数入口参数
            ViewData["openid"] = jsApi.openid;
            ViewData["wxEditAddrParam"] = jsApi.GetEditAddressParameters();
            return View();
        }
#endregion
//Product 页面主要的JS 
  <script type="text/javascript">

           //获取共享地址
           function editAddress()
           {
               WeixinJSBridge.invoke(
                   'editAddress',
                   '@ViewData["wxEditAddrParam"]',//josn串
                   function (res)
                   {
                       var addr1 = res.proviceFirstStageName;
                       var addr2 = res.addressCitySecondStageName;
                       var addr3 = res.addressCountiesThirdStageName;
                       var addr4 = res.addressDetailInfo;
                       var tel = res.telNumber;
                       var addr = addr1 + addr2 + addr3 + addr4;
                       //alert(addr + ":" + tel);
                   }
               );
         }

         window.onload = function ()
         {
             if (typeof WeixinJSBridge == "undefined")
             {
                 if (document.addEventListener)
                 {
                     document.addEventListener('WeixinJSBridgeReady', editAddress, false);
                 }
                 else if (document.attachEvent)
                 {
                     document.attachEvent('WeixinJSBridgeReady', editAddress);
                     document.attachEvent('onWeixinJSBridgeReady', editAddress);
                 }
             }
             else
             {
                 editAddress();
             }
         };
//这个产品页面点击立即购买的时候到WXPay页面
         function Button1_Click()
         {
            var openid = "@ViewData["openid"]";
             window.location.href = "WXPay?oID=" + openid + "&fee=1";          

         }
        </script>

<button onclick="Button1_Click()" type="button">立即购买</button>

#region WXPay
        //oID是我传到前台页面传回来的openID  

        public ActionResult  WXPay(string oID,,string fee)
        {  
            JsApiPay jsapi = new JsApiPay();
            jsapi.openid = oID;
           jsapi.total_fee = int.Parse(fee);
            //检测是否给当前页面传递了相关参数
            if (string.IsNullOrEmpty(oID) )
            {
                Response.Write("<span style='color:#FF0000;font-size:20px'>" + "页面传参出错,请返回重试" + "</span>");
                Log.Error(this.GetType().ToString(), "This page have not get params, cannot be inited, exit...");

            }
                 //微信只接收整数的金钱,且单位为分,所以1元要传100给微信哦
            jsapi.total_fee =Convert.ToInt32(1*100);
           //JSAPI支付预处理
            try
            {
       /*GetUnifiedOrderResult 这个方法我是自己处理过的 ,
           传了一个产品名称过去,因为我们后台数据需要,我就把传到微信的订单号获取了,
         其实也可以在这里先设置订单号然后传过去也是一样的,
         如果不需要可以不需要这些参数,看自己     */        
          string OutTradeNo = "";
            WXpayData unifiedOrderResult = jsapi.GetUnifiedOrderResult(MOD.Name,out OutTradeNo);
//这里是统一下单,然后微信返回了unifiedOrderResult  这里面prepay_id参数很重要

               //获取H5调起JS的 API参数   
                string wxJsApiParam = jsapi.GetJsApiParameters(unifiedOrderResult);
                ViewData["wxEditAddrParam"] = wxJsApiParam;
                Log.Debug(this.GetType().ToString(), "wxJsApiParam : " + wxJsApiParam);
                ViewData["out_trade_no"] = OutTradeNo;

                //在页面上显示订单信息
                //Response.Write("<span style='color:#00CD00;font-size:20px'>订单详情:</span><br/>");
                //Response.Write("<span style='color:#00CD00;font-size:20px'>" + unifiedOrderResult.ToPrintStr() + "</span>");

            }
            catch (Exception ex)
            {
                Response.Write("<span style='color:#FF0000;font-size:20px'>" + "下单失败,请返回重试" + "</span>");
                // submit.Visible = false;
            }
            return View();
        }
       #endregion
//在微信里,这个页面点击立即支付就可以调用微信支付了
           <script type="text/javascript">

               //调用微信JS api 支付
               function jsApiCall()
               {
                   console.log("2")
                   WeixinJSBridge.invoke(
                   'getBrandWCPayRequest',
                   @Html.Raw(ViewData["wxEditAddrParam"]) ,//josn串
                    function (res)
                    {
                        console.log("2")
                        WeixinJSBridge.log(res.err_msg);
                        alert(res.err_code + res.err_desc + res.err_msg);
                     }
                    );
               }

               function callpay()
               {
                   console.log("1")
                   if (typeof WeixinJSBridge == "undefined")
                   {
                       console.log("1.1")
                       if (document.addEventListener)
                       {
                           console.log("1.1.1")
                           document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
                       }
                       else if (document.attachEvent)
                       {
                           console.log("1.1.2")
                           document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                           document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
                       }
                   }
                   else
                   {
                       console.log("1.2")
                       jsApiCall();
                   }
               }

     </script>

<body>
    <form >
        <br/>
        <div align="center">
            <br/><br/><br/>
            <button ID="submit" type="button" onclick="callpay()" >立即支付</button>
        </div>
    </form>
</body>
点击查看更多内容
6人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消