C#编程之.net微信JSAPIPay记录
小标 2019-04-08 来源 : 阅读 1680 评论 0

摘要:本文主要向大家介绍了C#编程之.net微信JSAPIPay记录,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之.net微信JSAPIPay记录,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

C#编程之.net微信JSAPIPay记录

一.前期准备

1.微信公众平台: 接口权限-网页授权-下设置网页授权域名


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


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


4.在微信商户平台-账户中心-API安全设置API秘钥-key

5.微信公众平台  设置微信支付授权目录,MVC项目一定要写到具体的控制器,否则会出现当前url未注册问题


下载了微信支付.net C#的SDK

宝宝是MVC项目,和demo大同小异,对于理解微信支付的过程是很有帮助的

其中主要用到的就是这几个文件

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>

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程