前端在h5页面调起微信支付接口和支付宝接口(日常笔记)

微信支付

结合微信支付的api文档进行配置。参考JSAPI支付开发者文档——微信内H5调起支付

微信文档中的例子如下。

function onBridgeReady(){
   WeixinJSBridge.invoke(
      'getBrandWCPayRequest', {
         "appId":"wx2421b1c4370ec43b",     //公众号名称,由商户传入     
         "timeStamp":"1395712654",         //时间戳,自1970年以来的秒数     
         "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串     
         "package":"prepay_id=u802345jgfjsdfgsdg888",     
         "signType":"MD5",         //微信签名方式:     
         "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
      },
      function(res){
      if(res.err_msg == "get_brand_wcpay_request:ok" ){
      // 使用以上方式判断前端返回,微信团队郑重提示:
            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
      } 
   }); 
}
// 下面是兼容不同浏览器绑定事件的方法
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{
   onBridgeReady();
}

我们主要是从后台中获取数据传入onBridgeReady这个方法中。
所以第一步是获取数据,第二步是把获取到的数据传入到onBridgeReady方法
第一步:发送请求获取后台数据
1.在对应的api文件下封装请求(get)

export function wechatPay(type, vid, token, point, discount) {
  let discount_type = discount || null
  return axios.get(`${Host}/api/save_mobile`,{
    params: {
      pay_type: type,
      video_id: vid,
      token,
      point,
      discount_type
    }
  })
}

2.在对应的组件调用请求

<p @click="_wechatPay(paytype, $route.query.video_id, info.token, info.points)" class="submit">发送支付请求</p>
import { wechatPay } from '../../../api/pay.js'

export default {
  name: 'payfooter',
  computed: {
    info() {
      return this.$store.state.user.info
    },
    // 获取选择支付的方式
    paytype() {
      return this.$store.state.pay.paytype
    }
  },
  methods: {
    _wechatPay(type, vid, token, point) {
       wechatPay(type, vid, token, point).then(res => {
            console.log(res) // 这个res就是后台返回的数据
       })
    }
  }
}

3.后台返回的json格式数据如下(这不是console出来,方便显示我就直接把json数据复制过来)

{
    "code": 0,
    "data": {
        "appId": "wx5beac*******7c40c",
        "nonceStr": "8491k3******Rs5",
        "package": "prepay_id=wx07**************2653",
        "paySign": "CDE21B*************40C1A",
        "signType": "MD5",
        "timeStamp": "15******1"
    },
    "msg": null
}

第二步:把数据传给onBridgeReady函数
所以真正需要获取的内容是 res.data.data,然后再把res.data.data的值传给onBridgeReady函数
4.重新整理一下代码就是

methods: {
    _wechatPay(type, vid, token, point) {
       wechatPay(type, vid, token, point).then(res => {
            res = res.data
            if(res.code === 0) {
                this.onBridgeReady(res.data) // 这样就把res.data传给onBridgeReady函数
            }
       })
    },
    // 微信支付api相关配置文档
    onBridgeReady(data) {
      if (typeof WeixinJSBridge === 'undefined') {
        this.$toast({ message: '请使用微信内置浏览器进行支付' })
      } else {
        WeixinJSBridge.invoke(
          'getBrandWCPayRequest',
          {
            appId: data.appId, // 公众号名称,由商户传入
            timeStamp: data.timeStamp, // 时间戳,自1970年以来的秒数
            nonceStr: data.nonceStr, // 随机串
            package: data.package,
            signType: data.signType, // 微信签名方式:
            paySign: data.paySign // 微信签名
          },
          res => {
            if (res.err_msg === 'get_brand_wcpay_request:ok') {
              this.$toast({ message: '支付成功' })
              this.$router.push({path: '/videoplayer', query: { video_id: this.$route.query.video_id }}) // 支付成功之后跳转的路由
            } else {
              this.$toast({ message: '支付失败' })
            }
          }
        )
      } 
    },
  }

支付宝支付

与微信支付不同的是,支付宝支付后台是返回form格式的数据,如下

<form name="punchout_form" method="post" action="https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.trade.wap.pay&sign=DEpMkI**********************eWUs6EW3QKlt9OHYv%2FqkporO8Sr5%2Bay5VA9dpx3pAbIiPPajQ2gEcWHvz5bm*******kxH8ZvHUXahQL9S69p9wKNXpXOxYadlsxE8QKGUc4cO5rrgGq08%2BpiOq%2FOz4fLogEBWANXILUMWXNzJn8YryNifZ416Pd%2BxkKgXs%2Fo%2FQDcqEUg*********VXXPRq7IGRGQg%2FpZkOhxCH%2Fq%2B9hnWEncAfQLlAXfPqjdcQTNJ0TJdVr1X1ENOdAr5LQkydWw2EQ8g%3D%3D&return_url=+https%3A%2F%2**********&notify_url=+https%3A%2F%*********Fpub%2Fapi%2Fv1%2F********allback1&version=1.0&app_id=20********57&sign_type=R***&timestamp=2019-0******55&alipay_sdk=al*******.49.ALL&format=json">
    <input type="hidden" name="biz_content" value="{&quot;body&quot;:&quot;&quot;,&quot;enable_pay_channels&quot;:&quot;balance,moneyFund,bankPay,debitCardExpress,creditCardExpress,creditCard,pcredit,pcreditpayInstallment,coupon,point,voucher,mdiscount,honeyPay&quot;,&quot;out_trade_no&quot;:&quot;132ecf937ad84487aa6cbaeb2ec157fe&quot;,&quot;product_code&quot;:&quot;13&quot;,&quot;subject&quot;:&quot;SpringBoot 2.x微信支付在线教育网站项目实战&quot;,&quot;timeout_express&quot;:&quot;20m&quot;,&quot;total_amount&quot;:&quot;98&quot;}">
    <input type="submit" value="立即支付" style="display:none" >
</form>
<script>document.forms[0].submit();</script>

那么在处理后台数据的时候用下面的方法(参考网络大神)

_wechatPay(type, vid, token, point) {
     wechatPay(type, vid, token, point).then(res => {
        const form = res.data
        const div = document.createElement('div')
        div.id = 'alipay'
        div.innerHTML = form
        document.body.appendChild(div)
        document.querySelector('#alipay').children[0].submit() // 执行后会唤起支付宝
     })
}