H5微信支付,方法介绍

472 阅读3分钟

官方描述H5应用场景:

H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。

官方文档

H5支付接入前准备

接口流程图

7_2.png

前端实现代码

首先准备一个地址栏参数截取方法,干什么的?请往下看

// 截取方法
function getUrlParam(name) {  //name 代表截取参数名
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]); return null;
}

获取code

获取code是为了让后台解析从而得到openID,在网页授权回调的地址中可以获取到用户的code

function getCode() {
    /*
        ① 静默授权:snsapi_base,没有弹窗,只能获取用户的openId。
        ②非静默授权:snsapi_userinfo,有弹框弹出需要用户手动点击确认授权。可以获取openId,用户的头像、昵称等
        secret:秘钥
    */
    let par = {
        redirectUriWx: 'https://www.baidu.cn/pay/index.html',  // 获取code 后回调地址
        appid: appcode,
        scope: 'snsapi_userinfo',  
        secret: '0cc67c5ad79e65168c080b66b660ef123'
    }
    
    
    let urlhd = encodeURIComponent(par.redirectUriWx); // 注意一定要encodeURIComponent

    var ua = window.navigator.userAgent.toLowerCase();
    if (!ua.match(/MicroMessenger/i) == 'micromessenger') {
        alert("请在微信环境中使用");
    }

    const code = getUrlParam('code') // 截取路径中的code
    if (code == null || code === '') {
        window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${par.appid}&redirect_uri=${urlhd}&response_type=code&scope=${par.scope}&state=#wechat_redirect`

    }

}

微信支付

微信h5支付两种使用方法介绍:

1:weixinjsbridge.invoke()是微信浏览器的内置方法,

2:wx.choosewxpay在引用的微信jssdk文件中 也调用了weixinjsbridge.invoke() 是对weixinjsbridge.invoke() 的再次封装;

使用方法

*方法一*

wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: '', // 支付签名随机串,不长于 32 位
    package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    paySign: '', // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
    }
});
*方法二*
WeixinJSBridge.invoke(
    'getBrandWCPayRequest', {
        "appId": data.appId,  //公众号id,由商户传入
        "timeStamp": data.timeStamp.toString(),  // 时间戳
        "nonceStr": data.nonceStr,  //  随机字符串
        "package": data.package,  //订单详情扩展字符串
        "signType": data.signType,//微信签名方式
        "paySign": data.paySign  //微信签名
    },
    function (result) {
        if (result.err_msg == "get_brand_wcpay_request:ok") {
             // 支付成功后回调
        }else {
             //失败处理
        } 
    } 
);  

以上是H5微信支付的两种方式

实际调用调取支付


function subMitPay(openid) {   
    // 下单参数
    let params = {
        "appId": appcode,  
        "ip": "123.36.123.3",
        "openId": 'SDAKSDKASJDASDJJAD',
        "totall": "0.01", //付款金额
        "orderId": "SK231231jk1231"//订单id

    }
    //先进行下单,根据接口返回,注入配置信息
    $.ajax({
        url: url, // 下单接口地址
        type: 'POST', 
        contentType:'application/json;charset=UTF-8',      // 设置json格式    
        data: params, // 参数
        success: function (data) {
            //**注入配置信息**
            wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

                appId: data.appId, // 必填,公众号的唯一标识
                timestamp: data.timeStamp, // 必填,生成签名的时间戳
                nonceStr: data.nonceStr, // 必填,生成签名的随机串
                signature: data.paySign,// 必填,签名, 
                jsApiList: ["chooseWXPay"] // 必填,需要使用的JS接口列表 

            }); 

            
            wx.ready(function () {

                // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
                // 方法一  调用支付
                wx.chooseWXPay({
                    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                    nonceStr: '', // 支付签名随机串,不长于 32 位
                    package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
                    signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                    paySign: '', // 支付签名
                    success: function (res) {
                        // 支付成功后的回调函数
                    }
                });

                // 方法二  调用支付
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest', {
                        timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                        nonceStr: '', // 支付签名随机串,不长于 32 位
                        package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
                        signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                        paySign: '', // 支付签名
                    }, function (result) {
                        if (result.err_msg == "get_brand_wcpay_request:ok") {
                             //支付成功回调
                        } else {  
                            //支付失败
                        } 
                    }
                );
                
                // 以上两种支付方法,根据需求选取一种
            });

        }, error: function (code, msg) {  }

    });

}

以上就是H5微信支付方法啦 (^_^)