WebApp【公共组件库】@前端(For Git Submodule)
Tevin
2023-11-17 3fddeae4c25e7c086bceaaa3f2f48833ae5c970a
common/WxH5Pay.js
@@ -3,171 +3,55 @@
 * @author Tevin
 */
import Taro from '@tarojs/taro';
import { $ } from '@tarojs/extend';
import { Tools } from '@components/common/Tools';
const askModal = {
    $modal: null,
    show(type, callback) {
        const that = this;
        Taro.showModal({
            title: type === 'ask' ? '微信支付未响应?' : '微信支付仍未响应?',
            confirmColor: '#4a8aff',
            confirmText: type === 'ask' ? '点击重试' : '重载页面',
            success: res => {
                // 点击重试,执行回调
                if (res.confirm) {
                    callback(true);
                } else if (res.cancel) {
                    callback(false);
                }
                this.$modal = null;
            },
        });
        setTimeout(() => {
            this.$modal = $('.taro__modal');
        }, 10);
    },
    cancel() {
        if (this.$modal) {
            this.$modal.find('.taro-modal__foot > .taro-model__btn:eq(0)').trigger('click');
            this.$modal = null;
        }
    },
};
export class WxH5Pay {
    constructor() {
        this._data = {
            alreadyCall: false,
        };
    }
    callWxPay(payParam, callback, type = 'webview') {
        // 默认 webview 支付
        if (type === 'webview') {
            Tools.toast('正在微信支付...');
            this._data.alreadyCall = false;
            // 0.1 秒后发起正常支付
            setTimeout(() => {
                this._wvChooseWXPay(payParam, callback);
            }, 100);
            // 2.2 秒后,如果 alreadyCall 未变为 true,跳出询问弹窗
            setTimeout(() => {
                if (!this._data.alreadyCall) {
                    askModal.show('ask', next => {
                        if (next) {
                            this.callWxPay(payParam, callback, 'webview2');
                        } else {
                            callback('cancel', '支付已取消!(微信未响应)');
                            window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-noResponse', 0]);
                        }
    callWxPay(payParam, callback) {
        Tools.toast('正在支付...');
        setTimeout(() => {
            if (typeof WeixinJSBridge === 'undefined') {
                if (document.addEventListener) {
                    document.addEventListener('WeixinJSBridgeReady', () => {
                        this._jsApiCall(payParam, callback);
                    }, false);
                } else if (document.attachEvent) {
                    document.attachEvent('WeixinJSBridgeReady', () => {
                        this._jsApiCall(payParam, callback);
                    });
                    document.attachEvent('onWeixinJSBridgeReady', () => {
                        this._jsApiCall(payParam, callback);
                    });
                }
            }, 2200);
        }
        // 第二次 webview 支付
        else if (type === 'webview2') {
            // 重新发起支付
            Tools.toast('正在微信支付...');
            this._data.alreadyCall = false;
            // 0.1 秒后发起二次支付
            setTimeout(() => {
                this._wvBrandWCPay(payParam, callback);
            }, 100);
            // 2.2 秒后,如果 alreadyCall 未变为 true,跳出询问弹窗
            setTimeout(() => {
                if (!this._data.alreadyCall) {
                    askModal.show('reload', next => {
                        if (next) {
                            callback('fail', '页面重载中...');
                            window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-pageReload', 0]);
                            setTimeout(() => {
                                if (window.location.href.split('#')[0].indexOf('?') < 0) {
                                    window.location.href =
                                        window.location.href.split(/[#?]/)[0] + '?' + window.location.hash;
                                }
                                window.location.reload();
                            }, 1000);
                        } else {
                            callback('cancel', '支付已取消!(微信未响应)');
                            window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-noResponse', 0]);
                        }
                    });
                }
            }, 2200);
        }
    }
    _wvChooseWXPay(payParam, callback) {
        wx.ready(() => {
            window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-chooseWXPay:start', 0]);
            // 发起支付
            const sign = JSON.parse(payParam);
            wx.chooseWXPay({
                ...sign,
                timestamp: sign.timeStamp,
                complete: complete => {
                    // 关闭询问弹窗
                    askModal.cancel();
                    this._data.alreadyCall = true;
                    // 支付结果
                    if (complete.errMsg === 'chooseWXPay:ok') {
                        callback && callback('ok', '支付成功!');
                        window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-chooseWXPay:ok', 0]);
                    } else if (complete.errMsg === 'chooseWXPay:cancel') {
                        callback && callback('cancel', '支付已取消!');
                        window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-chooseWXPay:cancel', 0]);
                    } else {
                        let msg = '支付失败!';
                        // 例如 "chooseWXPay:没有此SDK或暂不支持此SDK模拟"
                        msg += complete.errMsg ? '(' + complete.errMsg + ')' : '';
                        callback && callback('fail', msg);
                        window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-chooseWXPay:fail', 0]);
                    }
                },
            });
        });
    }
    _wvBrandWCPay(payParam, callback) {
        const jsApiCall = () => {
            window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-BrandWCPay:start', 0]);
            // 发起支付
            const sign = JSON.parse(payParam);
            WeixinJSBridge.invoke('getBrandWCPayRequest', sign, res => {
                // 关闭询问弹窗
                askModal.cancel();
                this._data.alreadyCall = true;
                // 支付结果
                if (res.err_msg === 'get_brand_wcpay_request:ok') {
                    callback && callback('ok', '支付成功!');
                    window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-brandWCPay:ok', 0]);
                } else if (res.err_msg === 'get_brand_wcpay_request:cancel') {
                    callback && callback('cancel', '支付已取消!');
                    window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-brandWCPay:cancel', 0]);
                } else {
                    let msg = '支付失败!';
                    const errMsg = res.err_msg || res.errMsg || '';
                    // 例如 "chooseWXPay:没有此SDK或暂不支持此SDK模拟"
                    msg += errMsg ? '(' + errMsg + ')' : '';
                    callback && callback('fail', msg);
                    window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-brandWCPay:fail', 0]);
                }
            });
        };
        if (typeof WeixinJSBridge == 'undefined') {
            if (document.addEventListener) {
                document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
            } else if (document.attachEvent) {
                document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
            } else {
                this._jsApiCall(payParam, callback);
            }
        } else {
            jsApiCall();
        }
        }, 100);
    }
    _jsApiCall(payParam, callback) {
        window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-BrandWCPay:start', 0]);
        // 发起支付
        const sign = JSON.parse(payParam);
        WeixinJSBridge.invoke('getBrandWCPayRequest', sign, res => {
            // 支付结果
            if (res.err_msg === 'get_brand_wcpay_request:ok') {
                callback && callback('ok', '支付成功!');
                window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-brandWCPay:ok', 0]);
            } else if (res.err_msg === 'get_brand_wcpay_request:cancel') {
                callback && callback('cancel', '支付已取消!');
                window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-brandWCPay:cancel', 0]);
            } else {
                let msg = '支付失败!';
                const errMsg = res.err_msg || res.errMsg || '';
                // 例如 "chooseWXPay:没有此SDK或暂不支持此SDK模拟"
                msg += errMsg ? '(' + errMsg + ')' : '';
                callback && callback('fail', msg);
                window._hmt.push(['_trackEvent', 'wx', 'wx-wxPay', 'wx-wxPay-brandWCPay:fail', 0]);
            }
        });
    }
}