前端微信JSAPI支付

简介: 前端微信JSAPI支付

前言

这篇文章适合没做过微信JSAPI支付的人,用过的大佬可以浅略看看,本文采用JQ + 搜狐提供的ip搜索

第一步,环境

JSAPI是用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程

1.他是在微信浏览器里面才能调起的`支付方式`
2.上面说到既然是微信浏览器,我们就要想到`微信开发者工具` => 公众号开发(进行去调试)

第二步,登录

1.开发工具弄好了,接下来就是拿到哪个微信号给你付钱了。
2.要想微信号给公众号(你)付钱,首先你就要让微信用户授权给你这个公众号(用户和公众号会有个id,就是openid))

接下来就是怎么去拿到openid呢,详情看官网官方文档

获取openid官方文档介绍

var ua = navigator.userAgent.toLowerCase();
// 判断是否在微信浏览器
if (ua.indexOf('micromessenger') != -1) {
  if (!openid) {
      let code;
      try {
          // 获取到code,以拿到openid
          code = v['code'];
      } catch (err) {
          code = false;
      }
      // 判断是否授权
      if (!code) {
          // 商家id
          let appid = "wx5b77d71e115cb6a4";
          // 需要回调的地址,-》当前路径下的online-recharge.html
          let redirect_uri = payHref() + 'online-recharge.html';
          // 授权类型
          let scope = 'snsapi_base';
          location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`
      } else {
          // 请求接口,获取openid
          let url = ApiUrl() + '/pay/vx/get-openid';
          axios.post(url,
              { "messageType": 0, "messageContent": code }) //也可以直接拼接在url
              .then(function (rs) {
                  if (rs.data.messageCode == 500) {
                      $.alert(rs.data.errorMessage);
                  }
                  if (rs.data.messageCode == 200) {
                      console.log(rs.data.messageContent)
                      let messageContent = JSON.parse(rs.data.messageContent);
                      if (messageContent.errcode) {
                          $.alert('获取openid失败');
                      } else {
                          let openid = messageContent.openid;
                          if (openid) {
                              // 将openid存到缓存中
                              storeage.setItem("openid", openid);
                          }
                      }
                  }
              })
      }
  }

第四步,调起支付

<!-- 搜狐提供的ip搜索, returnCitySN["cip"] -->
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
// 
if (in_weixin) {
  // openid 
    let openid = storeage["openid"];
    // 当前手机的IP
    let cip = returnCitySN["cip"];
    // 支付类型
    let tradeType = "JSAPI";
    // 购买信息组成的对象
    let messageContent_pay = {
        "userGuid": userGuid,
        "unitGuid": unitGuid,
        "cardNumber": cardNumber,
        "logicalCardNumber": logicalCardNumber,
        "rechargeWallet": walletNo,
        "rechargeModel": 2,
        "rechargeAmount": $("#amount").val(),
        "ip": cip,
        "openid": openid,
        "tradeType": tradeType,
    }
    // 获取微信支付信息
    wx_pay(messageContent_pay)
} else {
    $.alert('请到微信公众号充值')
}
// 获取微信支付信息
function wx_pay(messageContent) {
    let url = ApiUrl() + '/pay/vx/vxPay';
    axios({
        method: 'POST',
        url,
        data: qs.stringify(messageContent), headers: { 'content-type': 'application/x-www-form-urlencoded' },
    }) //也可以直接拼接在url
        .then(function (rs) {
            if (rs.data.messageCode == 200) {
                let timeStamp = (new Date()).getTime();
                let appId = "wx5b77d71e115cb6a4";
                // 调起微信支付密码窗口
                onBridgeReady(rs.data.messageContent.payRequest, rs.data.messageContent.outTradeNo)
            } else {
                $.alert(rs.data.errorMessage);
            }
        })
}
// 这个是调起微信支付密码窗口,输完密码后会微信后台会给到你回调,这时候你就完成了本次支付
function onBridgeReady(payObj, outTradeNo) {
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest', payObj,
        function (res) {
          // 支付成功
            if (res.err_msg == "get_brand_wcpay_request:ok") {
                // 使用以上方式判断前端返回,微信团队郑重提示:
                //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
                // 跳转到自己写的订单详情页面
                location.href = myHref() + "recharge-result.html?out_trade_no=" + outTradeNo;
            } else {
                $.alert('支付失败');
            }
        });
}


目录
相关文章
|
4月前
|
前端开发 小程序
前端解析支付宝返回form表单,自动跳转支付
前端解析支付宝返回form表单,自动跳转支付
109 1
|
6月前
|
前端开发 API
前端 -PC 端-支付流程
前端 -PC 端-支付流程
99 0
|
6月前
|
存储 移动开发 前端开发
前端-移动端--支付
前端-移动端--支付
35 0
|
移动开发 前端开发 Android开发
前端微信支付开发H5支付(微信外)
前端微信支付开发H5支付(微信外)
386 0
前端微信支付开发H5支付(微信外)
|
前端开发 小程序
前端接入pingpp、stripe支付
pingpp 支付接入 安装npm i pingpp-js -S import Pingpp from 'pingpp-js' 调取后端提供的接口,获取pingpp++支付对象 Pingpp.createPayment(data, function (result, err) { that.
2036 0
|
前端开发 UED
支付宝玉伯:从前端到体验,如何把格局做大
国内的前端行业,是一个群星璀璨的神秘圈子。今天橙子要给大家介绍一位同事,他是这个行业的拓荒者。
1868 0
|
前端开发 UED
支付宝玉伯:从前端到体验,如何把格局做大?
国内的前端行业,是一个群星璀璨,同时又有些纷纷扰扰的圈子。很多初出茅庐的年轻人怀着改变世界的梦想,谁也不服谁。
5858 0
|
9月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
95 0
|
9月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
66 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置