tnblog
首页
视频
资源
登录

.NET接入微信支付(一)支付步骤

6564人阅读 2023/2/23 16:47 总访问:26594 评论:0 收藏:0 手机
分类: 微信支付
  • 开通公众号支付绑定了商户平台(直连商户模式下的V3 JSAPI支付)并且申请配置了如下:

公众号APPID
开发者密码AppSecret
IP白名单
业务域名
JS安全域名
网页授权域名
域名
商户ID
API证书
APIv2密钥 
APIv3密钥
JSAPI支付开通
支付授权目录


  • 开始正题

    • 下单

      1. WcPayPreOrderRequest preOrderRequest = new();
      2. preOrderRequest.description = Order.desc;
      3. preOrderRequest.out_trade_no = Order.orderId;
      4. preOrderRequest.attach = orders.ToString();
      5. preOrderRequest.payer = new Payer() { openid = openId };
      6. preOrderRequest.amount = new Amount
      7. {
      8.     currency = "CNY",
      9.     total = (int)(Total * 100//微信使用 分 结算
      10. };
      11. //下单后拿到预支付订单号
      12. PrePayOrderResponse prePayOrder = WxPayApi.JsApiUnifiedOrder(preOrderRequest);
    • 下单完成构造页面唤起支付需要的JSAPI支付参数

      1. //获取页面调起支付需要的 JS API参数 
      2. ViewBag.wxJsApiParam = jsApiPay.GetJsApiParameters(prePayOrder.prepay_id);
    •  支付订单页面加载完成需要提前注入config

      1.         /// <summary>
      2.         /// 获取config 注入参数
      3.         /// </summary>
      4.         /// <param name="url"></param>
      5.         /// <returns></returns>
      6.         [HttpPost]
      7.         public ActionResult GetJsApiConfig(string url)
      8.         {
      9.             try
      10.             {
      11.                 WxPayJsApi jsApiPay = new WxPayJsApi();
      12.                 url = System.Web.HttpUtility.UrlDecode(url);
      13.                 string JsApiConfig = jsApiPay.GetJsApiConfig(url);
      14.                 return Json(new JsonObjModel() { success = true, msg = "", objData = JsApiConfig });
      15.             }
      16.             catch (Exception ex)
      17.             {
      18.                 _logger.LogInformation("获取JSDK返回错误:" + ex.Message + ":" + ex.InnerException);
      19.                 return Json(new JsonObjModel() { success = false, msg = "获取JSDK返回错误" });
      20.             }
      21.         }
      1.                     var urlStr = location.href.split('#')[0]; //调起支付的页面路径必须是不带参数的当前页面
      2.                 urlStr = encodeURIComponent(urlStr);
      3.                 mui.ajax('/Order/GetJsApiConfig', { 
      4.                     data: { url: urlStr },
      5.                     dataType'json'//服务器返回json格式数据
      6.                     contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
      7.                     type'post'//HTTP请求类型
      8.                     timeout: 10000//超时时间设置为10秒;
      9.                     success: function(data{
      10.                         if (data.success) {
      11.                             var objConfig = JSON.parse(data.objData);
      12.                             wx.config({
      13.                                 debugfalse// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      14.                                 appId: objConfig.AppId, // 必填,公众号的唯一标识
      15.                                 timestamp: objConfig.Timestamp, // 必填,生成签名的时间戳
      16.                                 nonceStr: objConfig.NonceStr, // 必填,生成签名的随机串
      17.                                 signature: objConfig.Signature, // 必填,签名
      18.                                 jsApiList: objConfig.JsApiList // 必填,需要使用的JS接口列表
      19.                             });
      20.                             wx.ready(function({
      21.                                 // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
      22.                                 console.log("配置成功了");
      23.                             });
      24.                             wx.error(function({
      25.                                 console.log("配置失败了");
      26.                             });
      27.                         }
      28.                     },
      29.                     errorfunction(xhr, type, errorThrown{
      30.                         //异常处理;
      31.                         console.log(type);
      32.                     }
      33.                 });
      1. //调用微信JS api 支付
      2.         function jsApiCall({
      3.             var JsApiParam = '@Html.Raw(ViewBag.wxJsApiParam)'//在js中默认会对字符串中的特殊字符进行编码,用@html.Raw()让它不转码
      4.             var obj = JSON.parse(JsApiParam); //转化为json对象
      5.             wx.chooseWXPay({
      6.                 timestamp: obj.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
      7.                 nonceStr: obj.nonceStr, // 支付签名随机串,不长于 32 位
      8.                 package: obj.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
      9.                 signType: obj.signType, // 微信支付V3的传入RSA,微信支付V2的传入格式与V2统一下单的签名格式保持一致
      10.                 paySign: obj.paySign, // 支付签名
      11.                 success: function(res{
      12.                     if (res.errMsg == "chooseWXPay:ok"//使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
      13.                     {
      14.                         mui.toast("支付成功");
      15.                         
      16.                     } else if (res.errMsg == "chooseWXPay:fail") {
      17.                         mui.alert("调起支付失败");
      18.                     } else {
      19.                         mui.alert("未知状态");
      20.                     }
      21.                 }
      22.             });
      23.         };
评价
一木浮沉,吾与之。
排名
8
文章
191
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术