pay.js 4.48 KB
/**
 * 支付页面
 * @author: 赵彪<bill.zhao@yoho.cn>
 * @date: 2015/12/03
 */
var $ = require('jquery');

var loading = require('../plugin/loading'),
    tip = require('../plugin/tip'),
    Hammer = require('yoho.hammer');
// 点击微信显示加载
var $loadingToast = $(".loading-toast");
var theOrderCode = document.getElementById('ordercode').value;

var wxPayEl = document.getElementById('weixin'),
    wxHammer = wxPayEl && new Hammer(wxPayEl);

var appIconPosition = {
    baidu: '-2.7rem',
    weixin: '-1.2rem',
    QQ: '-5.4rem',
    bank: '-4rem'
};

// 隐藏微信分享选项
if (window.wx) {
    wx.hideOptionMenu();
}

function onBridgeReady() {
    document.addEventListener('WeixinJSBridgeReady', function () {
        window.WeixinJSBridge && window.WeixinJSBridge.call('hideOptionMenu');
    });
}

if (typeof WeixinJSBridge === undefined) {
    if (document.addEventListener) {
        document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    } else if (document.attachEvent) {
        document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
        document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
    onBridgeReady();
} else {
    onBridgeReady();
}

// 调用微信JS api 支付
function jsApiCall(orderCode, jsApiParameters) {
    $loadingToast.addClass("hide");

    // 防止重复操作弹框
    window.WeixinJSBridge && window.WeixinJSBridge.invoke(
        'getBrandWCPayRequest',
        jsApiParameters,
        function (res) {
            //发送支付确认
            $.ajax({
                type: 'GET',
                url: '/shopping/pay/wechatPayConfirm?order_code=' + orderCode,
                dataType: 'json',
                success: function (res) {
                    window.location.href = '/home/orders/detail?order_code=' + orderCode;
                }
            });
        }
    );
}

// 微信支付
function callpay(orderCode) {
    var jsApiParameters;

    $loadingToast.removeClass("hide");
    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 {
        $.ajax({
            type: 'GET',
            url: '/shopping/pay/wechatwapapi?order_code=' + orderCode,
            dataType: 'json',
            success: function (res) {
                if (res.code === 200) {
                    jsApiParameters = res.data.jsApiParameters;
                    jsApiCall(orderCode, jsApiParameters);
                } else {
                    tip.show('微信支付调取失败');
                }
            },
            error: function () {
                tip.show('请刷新本页面,完成微信支付');
            },
            complete: function () {
                $loadingToast.addClass("hide");
            }
        });
    }
}


function isWXOpen() {
    var ua = window.navigator.userAgent.toLowerCase();

    return ua.indexOf('micromessenger') > 0;
}

function hideWeChatPay() {
    var $payApps = $('.app');

    $payApps.each(function (idx, app) {
        if ($(app).parent().attr('id') === 'weixin') {
            $(app).parent().css('display', 'none');
            return false;
        }
    });
}

function handleForWX() {
    if (!isWXOpen()) {
        hideWeChatPay();
    }
}


function setAppIcon(el, position) {
    $(el).css('background-position-y', position);
}

function loadIcon() {
    var $boxs = $('.box');
    var $div = null;
    var appid = null;

    $boxs.each(function (idx, box) {
        $div = $(box).find('.icon').find('div');
        if ($div.length > 0) {
            appid = $(box).attr('id');
            if (appid !== 'alipay') {
                setAppIcon($div, appIconPosition[appid]);
            }
        }
    });
}

function showPage() {
    $('.payapp-list').css('visibility', 'visible');
}

function bindTouchedEvent() {
    var $boxs = $('.box');

    $boxs.on('touchstart', function (e) {
        $(this).addClass('bytouch');
    }).on('touchend touchcancel', function () {
        $boxs.removeClass('bytouch');
    });
}

if (wxHammer) {
    wxHammer.on('tap', function () {
        callpay(theOrderCode);
    });
}

function main() {
    handleForWX();
    loading.hideLoadingMask();
    showPage();
    loadIcon();
    bindTouchedEvent();
}

loading.showLoadingMask();

$(document).ready(main);