微信支付(公众号,小程序,内嵌h5)

微信支付 (公众号,小程序,内嵌h5)

一,原生小程序

开发流程:

  • 首先通过wx.login()获取到code,继而通过接口获取到openid,

  • 使用codeorderId请求后端接口,获取支付所需数据。

  • 小程序调用 wx.requestPayment()接口,拉起微信支付页面。

  • 判断是否支付成功后的逻辑

代码实现:

js 复制代码
wx.requestPayment({
    provider: 'wxpay',
    appId: data.appId , //此参数可不用
    nonceStr: data.nonceStr,
    package: data.package,
    signType: data.signType,
    paySign: data.paySign,
    timeStamp: data.timeStamp,
    success: (res) => {
        wx.navigateTo({
             url:`/pages/index/index
        })	
    },
    fail: function (err) {
        wx.showToast({
           title:"支付失败",
           mask: false,//是否显示透明蒙层,防止触摸穿透,默认:false 
        })
    }
})

二,微信h5支付(公众号)

方式一(wx.chooseWXPay)

  • 安装 "weixin-js-sdk"

  • 引入 import wx from 'weixin-js-sdk'

  • 首先通过网页授权获取code 继而拿到openid

  • 使用codeorderId请求后端接口,获取支付所需参数。

  • 使用config 函数进行接口权限注入,要在调用支付接口之前进行支付接口权限的注入。

授权链接:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数说明:

  • appid :公众号appid

  • redirect_uri:授权成功之后的重定向地址,一般为当前公众号的域名

代码实现

js 复制代码
axios.get("api/public/wechat/createJsapiSignature?url=" + 
     encodeURIComponent(window.location.href.split("#")[0]) +
     "&appId=xxx"
    ).then((response) => {
      wx.config({
          debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
          appId: appId, // 必填,公众号的唯一标识,填自己的! 
          timestamp: timestamp, // 必填,生成签名的时间戳,刚才接口拿到的数据 
          nonceStr: nonceStr, // 必填,生成签名的随机串 
          signature: signature, // 必填,签名,见附录1
            jsApiList: [
                 'chooseWXPay',
            ],
      });
      wx.ready(function () {
            jweixin.onMenuShareAppMessage(shareData);
            jweixin.onMenuShareTimeline(shareData);
            jweixin.onMenuShareWeibo(shareData);
            jweixin.onMenuShareQQ(shareData);
            jweixin.onMenuShareQZone(shareData);
      });
});
    
    
weiXinPay(){ 
    wx.chooseWXPay({     
        timeStamp,nonceStr,
        package,paySign等参数         
        timestamp: data.timeStamp,         
        nonceStr: data.nonceStr,         
        package: data.package,         
        signType: data.signType,         
        paySign: data.paySign,         
        appId: data.appId, //此参数可不用         
        success: (r) => {         
            // 支付成功后的回调函数             
            if (r.errMsg == "chooseWXPay:ok") {                 
                //支付成功                     
            } else {                 
                 //支付失败         
            }        
        },     
    }); 
}

方式二(WeixinJSBridge.invoke)

js 复制代码
// 用于判断是有此对象即是否是微信环境下

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(data) {		
    const _this = this
    WeixinJSBridge.invoke('getBrandWCPayRequest', {
        "appId": data.appId, //公众号ID,由商户传入
        "timeStamp": data.timeStamp, //时间戳,自1970年以来的秒数
        "nonceStr": data.nonceStr, //随机串
        "package": data.package,
        "signType": data.signType, //微信签名方式
        "paySign": data.paySign //微信签名
    },
    function(res) {
        if (res.err_msg == "get_brand_wcpay_request:ok") {
            console.log('成功')
        } else {
            console.log('支付失败,请重新尝试!')
        }
    })
}

WeixinJSBridge 内置对象在其他浏览器中无效。只有在微信环境中才能使用其拉起微信支付。

WeixinJSBridge.invoke 与 wx.chooseWXPay

WeixinJSBridge.invoke() :出现早 无需引用jssdk 无需wx.config方法注入 需要参数appId

wx.choosewxpay():出现晚 需要jssdk注入 不需要参数appId

WeixinJSBridge.invoke()是微信浏览器的内置方法 而wx.choosewxpay()在引用的微信jssdk文件中 也是 去调用了WeixinJSBridge.invoke() 可以理解为将 WeixinJSBridge.invoke()进行了二次封装。

三,混合开发(内嵌h5)

混合开发常见为使用uni-app 或者为原生微信小程序去创建项目框架,使用其提供的web-view 标签引入已经开发部署完成的vue 项目域名,完成一个小程序。这样既可减少开发时间也可达到一套代码完成小程序,公众号。从而成为现下较为主流方式。

由于在小程序内所以只能去调用小程序的api,即wx.requestPayment 去拉起支付而当前页面却是在h5 所以要先从h5跳转到原生的小程序页面,然后才能去调用他的方式,支付方式和上文提到的原生小程序支付方式无二,等待支付完成之后再由原生小程序跳转到h5。

js 复制代码
jWeixin.miniProgram.navigateTo({ 
    //跳转到原生小程序
       url: /pages/pay/index?access_token=${JSON.parse(sessionStorage.getItem("userInfo")).access_token}
        &orderCode=${this.orderInfo.orderCode}`
})

此为由h5跳转到原生小程序支付页面并携带支付所需订单参数。

<web-view :src="src"></web-view>

支付成功之后需要跳转到h5页面,此时只需要将web-view 中src 改为 h5线上路径即可

https://xxx/goods/pay/index

结语 :

此文旨在讲述小程序,公众号,内嵌h5 环境下的各种支付的实现方式和其中的注意事项,希望对您有所帮助。如果您发现有什么错误,欢迎您多多加以指正。。。

相关推荐
MaCa .BaKa2 小时前
38-日语学习小程序
java·vue.js·spring boot·学习·mysql·小程序·maven
小妖6665 小时前
vue2 切换主题色以及单页面好使方法
前端·vue.js·elementui
胡桃夹夹子5 小时前
【前端优化】vue2 webpack4项目升级webpack5,大大提升运行速度
前端·javascript·vue.js·webpack·性能优化
LuckyLay7 小时前
Vue百日学习计划Day9-15天详细计划-Gemini版
前端·vue.js·学习
大得36911 小时前
electron结合vue,直接访问静态文件如何跳转访问路径
javascript·vue.js·electron
是千千千熠啊14 小时前
vue使用Fabric和pdfjs完成合同签章及批注
前端·vue.js
九月TTS14 小时前
TTS-Web-Vue系列:组件逻辑分离与模块化重构
前端·vue.js·重构
满怀101516 小时前
【Vue 3全栈实战】从响应式原理到企业级架构设计
前端·javascript·vue.js·vue
梅子酱~16 小时前
Vue 学习随笔系列二十三 -- el-date-picker 组件
前端·vue.js·学习
源码云商18 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot