• 微信公众号支付


    一、获取用户openid

         1.进入授权页面,获取code

         2.授权后,回调页面通过code获取access_token

         3.用access_token获取openid等用户基本信息

    以上(2,3步在后台执行)

    二、用openid获取调用JSAPI支付的参数

          1.调用统一下单API,取得预支付id(prepay_id)

          2.用prepay_id等其他必要参数构造JSAPI支付所需参数

    三、用上一步取得的参数,前台调起支付

    var code = getUrlParam("code");
            $.ajax({
                url: "用户授权回调页面,用code取token、openid",
                data: {
                    code: code
                },
                success: function(data) {
                    if (data.result) {
                        console.log(JSON.stringify(data));
                        $.ajax({
                            url: "/xxx/pay/wechat/jsapiParam",
                                                    //取参数
                            data: {
                                orderNo: orderNo,
                                openId: data.data.oAuthId,
                            },
                            success: function(data) {
                                if (data) {
                                    console.log(JSON.stringify(data))
                                    paramData = data;
                                    if (data.errorCode == 0) {
                                        callpay();//调起支付控件
                                    } else {
                                        var dia = $.dialog({
                                            title: '错误提示',
                                            content: data.msg,
                                            button: ["确认"]
                                        });
                                    }
                                }
                            }
                        })
                    }else{
                        if (data.errCode == 1) {
                            var dia = $.dialog({
                                title: '错误提示',
                                content: "链接无效",
                                button: ["确认"]
                            });
                            dia.on("dialog:action", function(e) {
                                if (e.index == 0) {
                                    location.replace("http://order-pay.html?orderNo="+orderNo);
                                }
                            });
                        }
                    }
                }
            })
            
    
            //调用微信JS api 支付
            function jsApiCall() {
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest', {
                        "appId": paramData.appId, //公众号名称,由商户传入     
                        "timeStamp": paramData.timeStamp, //时间戳,自1970年以来的秒数     
                        "nonceStr": paramData.nonceStr, //随机串     
                        "package": paramData.package,
                        "signType": "MD5", //微信签名方式:     
                        "paySign": paramData.paySign //微信签名 
                    },
                    function(res) {
                        WeixinJSBridge.log(res.err_msg);
                        if (res.err_msg == "get_brand_wcpay_request:ok") {//支付成功处理
                            location.replace("/pay-success.html");
                        }
                        if(res.err_msg == "get_brand_wcpay_request:cancel" || res.err_msg == "get_brand_wcpay_request:fail"){
    //支付失败或取消支付处理 location.replace(
    "http://order-pay.html?orderNo="+orderNo); } else { var dia = $.dialog({ title: '错误提示', content: JSON.stringify(res), button: ["确认"] }); } //alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay() { 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 { jsApiCall(); } }

    要做到在订单支付页面调起支付(用户无感知授权),需要在进入订单支付前取得code并保存openid,进入订单支付页面后,直接通过已经保存的openid获取相应参数调起JSAPI支付

    附:

    接口调试工具:https://pay.weixin.qq.com/wiki/tools/signverify/

    文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3

    注意:

    1.商户号在公众号中申请的,申请成功后商户号与公众号的appid相关联的

    2.需要在商户号的"api安全"中设置一个32位的key,该key与商户号对应,没设置或key不正确会导致报签名错误

    3.调用jsapi的方式支付,需要在公众号中设置支付安全目录

    4.用户登录授权的公众号应该是收款商户号所关联的公众号,不能是其他公众号,否则会报签名错误,因为不同公众号取得的用户openid不一样(unionid是一样的)

  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/oyx305/p/5670966.html
Copyright © 2020-2023  润新知