最近在做一个项目,是一个网站,最近可能会陆陆续续的记录下自己在这个项目中遇到的问题,首先先说下支付。这个网站需要实现在pc浏览器、微信公众号和手机浏览器中打开了,我们用的支付方式是微信支付,因为之前只是做了pc端的扫码支付,现在需要实现后者也能支付。首先在微信公众号里面的支付我们用的是JSAPI支付,手机浏览器中我们使用的是H5支付,关于在微信商户平台申请部分以及配置啥的我也不多说了(因为具体我也不太清楚,hiahiahia~),这里我只介绍我前端的代码。

一、pc端支付
关于pc端的支付我就不贴代码了,这块儿是由后端直接返给我一个支付二维码的图片,前端做展示就好了,关于支付成功的状态,我通过轮询订单详情的一个接口判断状态,然后进行页面的跳转、、、
二、JSAPI支付(微信公众号)

支付按钮为:

<div class="bottom-btn" @click="payOrder">立即购买</div>

方法函数:

payOrder() {
        this.postRequestWWW(this.baseUrl + '/pay/generalQRCode',{
          sessionId: this.sessionId,
          userId: localStorage.getItem('userId')
        }).then((res) =>{
          if(res.data.code === 0) {
            const pay_params = res.data.data
            if (typeof WeixinJSBridge === "undefined"){
            if(document.addEventListener){
              document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady, false);
            }else if (document.attachEvent){
              document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady);
              document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady);
            }
          }else{
            this.onBridgeReady(pay_params);
          }
        }else{
          alert('微信支付调起失败!');
        }
      }).catch((err) => {
          console.log(err);
      })
      },
     onBridgeReady(params) {
        var that = this
        WeixinJSBridge.invoke(
          'getBrandWCPayRequest', {
            "appId": params.appId,  //公众号名称,由商户传入
            "timeStamp": params.timeStamp, //支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
            "nonceStr": params.nonceStr,  //支付签名随机串,不长于 32 位
            "package": params.package,//统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
            "signType": 'MD5',  //签名方式,默认为'SHA1',使用新版支付需传入'MD5'
            "paySign": params.sign, //支付签名
          },
          function (res) {
            if (res.err_msg === "get_brand_wcpay_request:ok") {
              alert('支付成功!');
              that.$router.push({path: '/myOrder'})
            } else if (res.err_msg === "get_brand_wcpay_request:fail") {
              alert('支付失败!');
            }
          });
      },

payOrder函数中通过调用后台的接口,获取到自己需要的参数
三、H5支付
相对于JSAPI支付,我觉得H5支付前端需要写的代码不是很多哇,后端会返给我一个支付的路径,跳到微信支付进行操作就可以了,当然你可以设置支付成功的回调地址
正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。

如,您希望用户支付完成后跳转至https://www.wechatpay.com.cn,则可以做如下处理:(详情可见官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4

假设您通过统一下单接口获到的MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096


则拼接后的地址为MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn

下面是我的代码:

payOrder3(){
        this.postRequestWWW(this.baseUrl + '/pay/getCodeUrl', {
          sessionId: this.sessionId,
          userId: localStorage.getItem('userId'),
          spbillCreateIp:this.clientIp
        }).then((res) => {
          if (res.data.code === 0) {
            this.payUrl = res.data.data.codeUrl
            window.location.href = this.payUrl + '&redirect_url='回调地址'
          } else {
            alert('微信支付调起失败!');
          }
        }).catch((err) => {
          console.log(err);
        })
      },

补充:当H5支付的回调地址中含有多个参数时,需使用encodeURIComponent转码,否则回调地址只会返回一个参数

const redirectUrl = '网站域名/aaaa?a=1&b=2';
window.location.href = `${this.payUrl}&redirect_url=${encodeURIComponent(redirectUrl)}`

作为一个工作刚刚起步的小前端,第一次写博客,有什么不当的地方还请大家多多指教,当然,初衷还是为了记录下自己在工作中遇到的问题,供自己以后看~

Logo

前往低代码交流专区

更多推荐