支付相关代码片段

183 阅读1分钟

支付相关代码片段

作者:张泽雨

PC端微信扫码支付

通过第三方支付接口 trade/pay/thirdparty 生成交易流水号 tradenumber ,然后用它去请求生成微信网页预支付交易单接口 wechat/trade_pay ,接口会返回 prepay_id 二维码字符串,再用现成接口生成二维码图片,提供用户扫码支付。

需要注意的是,微信网页扫码支付需要开发者主动监听交易单状态,这里的做法是每隔 3 秒请求一个专门用于微信网页支付交易单状态的查询接口。

<script type="text/html" id="paymentIframeTemp">
    <div id="payment-iframe">
        <div class="mask"></div>
        <div class="dialog">
            <a href="javascript:;" class="close"><i class="fa fa-close fa-3x"></i></a>
            <img src="http://pan.baidu.com/share/qrcode?w=500&h=500&url={{qrcode}}">
        </div>
    </div>
</script>
$.ajax({
    url: API.url() + 'wechat/trade_pay',
    data: {
        trade_no: data.data.tradenumber,
        token: Cookies.get('token')
    }
}).done(function(cb){
    if(API.checkCallback(cb)){
        $('#paymentIframeTemp').after(template('paymentIframeTemp', {
            'qrcode': cb.data.data.prepay_id
        }));
        // 循环检查
        wechatIntervalID = setInterval(function(){
            $.ajax({
                url: API.url() + 'wechat/pay/status',
                data: {
                    paynumber: data.data.tradenumber,
                    nonce_str: cb.data.data.noncestr,
                    sign: cb.data.data.sign,
                    token: Cookies.get('token')
                }
            }).done(function(cb){
                if(API.checkCallback(cb)){
                    if(cb.data.issuccess == 1){
                        clearInterval(wechatIntervalID);
                        location.href = 'payment.success.html?ordernumber=' + cb.data.ordernumber + '&total_amount=' + cb.data.money;
                    }
                }
            });
        }, 3000);
    }
});

PC端支付宝扫码支付

通过第三方支付接口 trade/pay/thirdparty 生成交易流水号 tradenumber ,然后用它去请求支付宝支付接口 trade/pay/alipay ,接口会直接跳转到支付宝的支付页面,支付成功后会根据预设值跳转回指定的回调页面,前端要做的事就是拼接好跳转链接的参数即可。

需要注意的是,即使把支付接口地址包在 iframe 里,支付成功后页面依旧会在父级页面上跳转到回调页。

<script type="text/html" id="paymentIframeTemp">
    <div id="payment-iframe">
        <div class="mask"></div>
        <div class="dialog">
            <a href="javascript:;" class="close"><i class="fa fa-close fa-3x"></i></a>
            <iframe src="{{url}}" frameborder="0"></iframe>
        </div>
    </div>
</script>
var url = API.url() + 'trade/pay/alipay?paynumber=' + data.data.tradenumber + '&qrcodewidth=500&token=' + Cookies.get('token');
$('#paymentIframeTemp').after(template('paymentIframeTemp', {
    'url': url
}));

H5微信支付

通过第三方支付接口 trade/pay/thirdparty 生成交易流水号 tradenumber ,然后直接调用微信的 WeixinJSBridge.invoke() 方法即可,此方法只有在微信里访问时才有效。

$.ajax({
    url: API.url() + 'wechat/trade_pay',
    data: {
        mode: 1,
        trade_no: data.data.tradenumber,
        token: Cookies.get('token')
    }
}).done(function(cb){
    if(API.checkCallback(cb)){
        WeixinJSBridge.invoke(
            'getBrandWCPayRequest', {
                'appId': cb.data.data.appid, //公众号名称,由商户传入
                'timeStamp': cb.data.data.timestamp, //时间戳,自1970年以来的秒数
                'nonceStr': cb.data.data.noncestr, //随机串
                'package': 'prepay_id=' + cb.data.data.prepay_id,
                'signType': 'MD5', //微信签名。方式:
                'paySign': cb.data.data.sign //微信签名
            },
            function(res){
                // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
                if(res.err_msg == 'get_brand_wcpay_request:ok'){
                    location.href = 'module/order/info.html?ordernumber=' + param['ordernumber'];
                }else if(res.err_msg == 'get_brand_wcpay_request:cancel' ){
                    swal('交易已取消', '', 'error');
                }else{
                    swal('交易失败', '', 'error');
                }
            }
        );
    }
});