微信支付

记录在微信支付中遇到的问题

1、做h5页面的时候,需要将h5页面嵌入到其他的小程序中。支付的时候唤起小程序支付,小程序使用的是uniapp框架。

 第一次的时候用的是wx.navigateTo跳转到小程序支付页面,发现偶尔会发生换不起支付的情况

wx.miniProgram.getEnv(function(apiRes) {
        if (apiRes.miniProgram) {
            wx.miniProgram.navigateTo({
                url: `/pagesMain/Pay/Pay?timeStamp=${jsPayApi.timeStamp}&nonceStr=${jsPayApi.nonceStr}&package=${jsPayApi['package_']}&signType=${jsPayApi.signType}&paySign=${jsPayApi.paySign}&successUrl=${successUrl}`
             })
        }
})

第二次尝试用uni的方法,首先初始化uni的环境,需要引入uni的js;万事准备完毕后,信心满满的去使用,发现比一种情况好了许多。但是还是用偶发的支付唤不起来的情况发生。后来听说rediretTo可能好一点,更改后发现还是不行。极度奔溃啊~~

'https://res.wx.qq.com/open/js/jweixin-1.6.0.js',    //微信
'https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js'
在页面mounted中初始化uni方法
this.$nextTick(() => {
    document.addEventListener("UniAppJSBridgeReady", function() {
       console.log("初始化uniapp的API成功");
    });
})
拼接跳转地址,并跳转
let jsPayApi = res.data.jsApiRequestData
let paySuccessUrl = `${this.$_config.URL.success}?orderNo=${res.data.orderNo}&code=Z01` // 线上支付成功回调地址
let successUrl = escape(paySuccessUrl)
let package_prePay = escape(jsPayApi['package_'])
let strPath =
    `/pagesMain/Pay/Pay?timeStamp=${jsPayApi.timeStamp}&nonceStr=${jsPayApi.nonceStr}&package=${package_prePay}&signType=${jsPayApi.signType}&paySign=${jsPayApi.paySign}&successUrl=${successUrl}`
                          this.$indicator.close();
setTimeout(function() {
    uni.navigateTo({
       url: `/pagesMain/Pay/Pay?timeStamp=${jsPayApi.timeStamp}&nonceStr=${jsPayApi.nonceStr}&package=${package_prePay}&signType=${jsPayApi.signType}&paySign=${jsPayApi.paySign}&successUrl=${successUrl}`,
       success: function(res) {
           console.log("调用第三方支付成功!")
       },
       fail: function(res) {
           console.log("调用第三方支失败付!", res)
       },
       complete: function(res) {
           console.log(res)
       }
   })
}, 1600)

第三次尝试,使用微信原生的跳转方式。方式不是在保存后唤起支付 的时候去初始化调用。是在页面加载之前去封装,然后在保存后调用

在import之前初始化
let wxR = wx.miniProgram.redirectTo;

在methods中写一个专门唤起支付的方法
openWx(pageUrl){
     let This = this;
     // 若没有唤起支付,关闭弹框
     setTimeout(function() {
        console.log("唤起支付失败!已超过3s");
           This.$indicator.close();
     }, 3000);

     if(!wxR){
        console.info('wx.miniProgram.redirectTo 加载失败');
     }

     setTimeout(()=>{
        wxR({
           url: pageUrl,
           success: function(res) {
               console.info("调用第三方支付成功!pageUrl="+pageUrl)
           },
           fail: function(res) {
               console.info("调用第三方支付失败!", res+pageUrl)
           },
           complete: function(res) {
               try{
                 This.strGoPath = ""
                 console.log("打开页面完成complete", e)
                 This.$indicator.close();
               }catch(e){
                 This.strGoPath = ""
                 console.log("打开页面完成complete报错", e)
               }
            }
         });
    },300);
 },

在保存的方法中直接调用该方法,即可

使用第三种支付方式后,发现没有在出现过唤不起支付的情况。

2、在h5页面使用微信jsdk方式支付,偶尔不走cancel方法,使用complete方法,区分返回的errorMsg方式来区分支付成功、支付取消

wx.ready(function () {
                wx.chooseWXPay({
                    appId: params.jsApiRequestData.appId,
                    timestamp: params.jsApiRequestData.timeStamp,    // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                    nonceStr: params.jsApiRequestData.nonceStr,    // 支付签名随机串,不长于 32 位
                    package: params.jsApiRequestData['package_'],    // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
                    signType: params.jsApiRequestData.signType,    // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                    paySign: params.jsApiRequestData.paySign,        // 支付签名
                    success: function (res) {
                        Indicator.open('支付中...');
                        setTimeout(function(){
                            Indicator.close();
                            // window.location.href = `/sy-test/#/pay-success?orderNo=${params.orderNo}&code=${productCode}` // 测试
                            window.location.href = `${URL.success}?orderNo=${params.orderNo}&code=${productCode}` // 线上
                        },2000)
                    },
                    complete: function(res) {
                        // ios和Android支付成功都是chooseWXPay:ok
                        Indicator.close();
                        if(res.errMsg != 'chooseWXPay:ok') {
                            let proposalNo = params.proposalList[0]
                            window.location.href = `${URL.unpaid}?proposalNo=${proposalNo}&code=${productCode}` // 线上
                        }
                    },
                    cancel: function (res) {
                        Indicator.close();
                        Toast('取消支付');
                        let proposalNo = params.proposalList[0]
                        window.location.href = `${URL.unpaid}?proposalNo=${proposalNo}&code=${productCode}` // 线上
                    },
                    fail: function (res) {
                        Toast('支付失败');
                    }
                });
            })

 

posted @ 2021-07-01 11:19  逩跑得前端小学生  阅读(100)  评论(0编辑  收藏  举报