微信公众号h5使用微信支付及支付宝支付的步骤(前端)

 更新时间:2024年07月15日 08:31:48   作者:前端、小老弟  
微信H5支付是一种支付解决方案,主要适用于商户在微信客户端外的移动端网页上展示商品或服务的场景,这篇文章主要给大家介绍了关于微信公众号h5使用微信支付及支付宝支付(前端)的相关资料,需要的朋友可以参考下

方案:

一、微信支付

        考虑到授权的问题,微信支付使用JS-SDK进行支付

二、支付宝支付

        问题:h5微信授权后是无法再微信浏览器直接打开支付宝的付款链接

        解决:使用一个中间页 指向通过跳转到浏览器进行支付

实施:

一、微信支付:

第一步微信授权,在main.js中添加路由拦截,获取code,具体代码如下  ↓

// main.js
router.beforeEach(async (to: RouteLocationNormalized,from: RouteLocationNormalized,next) => {
    // 判断有没有openId 即授权了直接放行
    if (store.state.openId) {
        next()
    } else {
        // 没有授权去授权获取code 再放行
        const code = await getCode()
        await queryInfo(code)
        next()
    }
})

// 获取code
function getCode() {
    const code = getUrlCode()?.code
    if (!code) {
        // 没有code 请求后端接口进行链接跳转获取code(链接值微信的授权链接,成功授权后会跳回 回调地址,在回调地址上 会携带code参数)
        return getWxOauthUrl({
            redirectUrl: window.location.href
        }).then(async ({data}) => {
            if (data.statusCode === 0) {
                window.location.replace(data.msg)
            }
        })
    } else {
        return code
    }
}

// 通过code 获取用户信息
function queryInfo(code: string) {
    return getUserInfo([code]).then(({data}) => {
        const result = data.data || {}
        store.commit('getUserInfo', result)
        store.commit('getUserOpenId', result.openId)
    })
}

// 获取url 参数的通用方法
function getUrlCode() {
    // 截取url中的code方法
    const url = location.search;
    const theRequest = new Object();
    if (url.indexOf("?") !== -1) {
        const str = url.substr(1);
        const strs = str.split("&");
        for (let i = 0; i < strs.length; i++) {
            theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
        }
    }
    return theRequest;
}

授权成功后即可以进行支付环节

核心代码

// 首先在index.html 中引入微信JS-SDK

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

// 然后在支付逻辑中添加以下代码即可~

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();
              }

function onBridgeReady(result) {
              WeixinJSBridge.invoke('getBrandWCPayRequest', {
                "appId": ,   //公众号ID,由商户传入
                "timeStamp": ,   //时间戳,自1970年以来的秒数
                "nonceStr": ,      //随机串
                "package": ,
                "signType": ,     //微信签名方式:
                "paySign": 
              },
              function (res) {
                if ((res.errMsg || res.err_msg) === "get_brand_wcpay_request:ok") {
                  // 使用以上方式判断前端返回,微信团队郑重提示:
                  //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
                  
                }
              });
            }

这样 微信支付就已经结束了

二、支付宝支付:

因为是在微信授权后的h5页面,所以不能直接在微信页面直接进行支付

所以第一步就是在点击支付的时候,进行跳转到中间页,

先定义一个中间页: pay.html

注意:要把这个页面放到publish目录下

// 跳转中间页,把请求支付的参数一并带过去
window.open(`${location.origin}/pay.htm?params=${encodeURIComponent(JSON.stringify(params))}`)

pay.html核心内容如下

let getQueryString = function (url, name) {
        let reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)", "i");
        if (reg.test(url)) return RegExp.$2.replace(/\+/g, " ");
    };

    // 获取接口返回的表单 进行支付
    function handlePayForm(data) {
        const div = document.createElement("div");
        div.setAttribute("id", "payContainer");
        div.innerHTML = data
        document.body.appendChild(div);
        const payContainer = document.querySelector("#payContainer");
        const submit = payContainer.querySelector(
            'form[name="punchout_form"] input[type="submit"]'
        );
        submit.click();
        setTimeout(function () {
            div.remove();
        }, 500);
    };
    if (location.hash.indexOf('error') !== -1) {
        alert('参数错误,请检查');
    } else {
        // 判断当前的浏览器环境是不是微信浏览器
        let ua = navigator.userAgent.toLowerCase();
        let tip = document.querySelector(".weixin-tip");
        let tipImg = document.querySelector(".J-weixin-tip-img");
        const query = JSON.parse(decodeURIComponent(getQueryString(location.href, 'params')))

        if (ua.indexOf('micromessenger') !== -1) {
            // 如果是微信里的页面,做个指引(请通过浏览器进行支付)
            // 这个页面自己定义即可
        } else {
            // 好的,这是外部浏览器,请求接口获取支付的from表单
            axios({
                url: '',
                data: query,
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            }).then(({data}) => {
                if (data.statusCode === 0) {
                    // 后端返回的form表单进行支付
                    if (data.data && data.data.returnCode === "SUCCESS") {
                        // data.data.result ==> 是一个支付的from表单
                        handlePayForm(data.data.result)
                    }
                }
            })
        }
    }

这样即可 跳转到微信外部浏览器进行正常的支付功能

总结

到此这篇关于微信公众号h5使用微信支付及支付宝支付的文章就介绍到这了,更多相关公众号h5使用微信及支付宝支付内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js中生成map对象的方法

    js中生成map对象的方法

    生成map对象的方法或许会有很多,在本文将为大家详细介绍下使用js是如何做到的,感兴趣的朋友不要错过
    2014-01-01
  • 详解JavaScript中Canvas的高级绘图和动画技术

    详解JavaScript中Canvas的高级绘图和动画技术

    JavaScript中的Canvas 是一个强大的 HTML5 元素,允许你通过编程方式创建图形、绘制图像和实现复杂的动画效果,在本文中,我们将深入探讨 JavaScript Canvas 的高级绘图和动画技术,并提供一个复杂的案例,以展示其潜力,需要的朋友可以参考下
    2023-10-10
  • js调试系列 断点与动态调试[基础篇]

    js调试系列 断点与动态调试[基础篇]

    上几篇文章已经为大家介绍了js调试系列的一些基础知识,支持乱码兄弟为大家带来了js断点与动态调试方法,需要的朋友可以参考下
    2014-06-06
  • JavaScript中获取元素索引的函数

    JavaScript中获取元素索引的函数

    相信使用过jQuery的朋友都知道index()方法, 她可以很方便的帮你找到当前元素在元素集合中索引位置. 那么, 原生JavaScript中如何获取呢?
    2010-09-09
  • JavaScript实现平滑滚动效果

    JavaScript实现平滑滚动效果

    页面平滑滚动是网页一种常见的效果,平滑滚动的原理其实很简单,无非就是让页面一种肉眼可见的速度从当前位置滚动到指定位置,那如何用原生的JS实现这也效果呢?本文给大家介绍了JavaScript实现平滑滚动效果,需要的朋友可以参考下
    2024-06-06
  • 使用JS 插件qrcode.js生成二维码功能

    使用JS 插件qrcode.js生成二维码功能

    qrcode.js是一个使用比较多的js生成二维码的插件,非常方便,接下来通过本文给大家分享使用JS 插件qrcode.js生成二维码功能,需要的朋友参考下
    2017-02-02
  • JavaScript清空数组元素的两种方法简单比较

    JavaScript清空数组元素的两种方法简单比较

    这篇文章主要介绍了JavaScript清空数组元素的两种方法简单比较,罗列了几种常见的情况javascript数组的方法,并且比较了其中的两种常见方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • js实现五星评价功能

    js实现五星评价功能

    本文主要介绍了js实现五星评价功能和印象评价功能的实例,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Javscript调用iframe框架页面中函数的方法

    Javscript调用iframe框架页面中函数的方法

    这篇文章主要介绍了Javscript调用iframe框架页面中函数的方法,可实现iframe之间传值或修改值,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • js中string转int把String类型转化成int类型

    js中string转int把String类型转化成int类型

    今天碰到一个问题,需要把String类型的变量转化成int类型的,js中String转int和Java中不一样,不能直接把Java中的用到js中
    2014-08-08

最新评论