Heim  >  Artikel  >  WeChat-Applet  >  Implementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets

Implementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets

Y2J
Y2JOriginal
2017-04-22 15:10:363871Durchsuche

Kürzlich musste ich die Online-Zahlungsfunktion im WeChat-Miniprogramm verwenden, also habe ich einen Blick auf die offizielle Dokumentation geworfen und festgestellt, dass es sehr praktisch ist, die WeChat-Zahlung im Miniprogramm zu implementieren, wenn Sie die WeChat-Zahlung unten entwickelt haben Bevor Sie ein Dienstkonto erstellen, werden Sie feststellen, dass der Entwicklungsprozess der WeChat-Zahlung im Miniprogramm genau der gleiche ist wie der im Dienstkonto. Jetzt werde ich über den Entwicklungsprozess und die Schwerpunkte der WeChat-Zahlung im Miniprogramm sprechen ausführlich.

Implementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets

1. Öffnen Sie die WeChat-Zahlung und das WeChat-Händlerkonto
Dieser Vorgang ist der gleiche wie der WeChat-Zahlungsprozess zum Öffnen eines Dienstes Konto, nein Was kann man sagen.

Implementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets

2. Holen Sie sich die OpenID des Benutzers
Homepage Wir müssen den aktuellen Benutzer in den Client-JS von abrufen Das Miniprogramm Die OpenID des Benutzers kann durch Aufrufen der Methode wx.login abgerufen werden. Anschließend verwendet der Entwicklerserver den Anmeldeinformationscode, um die OpenID abzurufen.

wx.login({
      success: function(res) {
        if (res.code) {
          //发起网络请求
          wx.request({
            url: 'https://yourwebsit/onLogin',
            method: 'POST',
            data: {
              code: res.code
            },
            success: function(res) {
                var openid = res.data.openid;
            },
            fail: function(err) {
                console.log(err)
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
var code = req.param("code");
        request({
            url: "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code",
            method: 'GET'
        }, function(err, response, body) {
            if (!err && response.statusCode == 200) {
                res.json(JSON.parse(body));
            }
        });

3. Erhalten Sie die Prepay_ID und die Überprüfung der Zahlungssignatur paySign
Der Vorgang dieses Schritts ist der gleiche wie der WeChat-Zahlungsprozess im Dienstkonto unterteilt in Client- und Serverseite
Werfen wir zunächst einen Blick auf die Client-JS
Im Dienstkonto aktivieren wir die Zahlungsfunktion über den folgenden Code

function jsApiCall()
        {
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest',
                {
                   "appId":"",     //公众号名称,由商户传入     
                   "timeStamp":"",         //时间戳,自1970年以来的秒数     
                   "nonceStr":"", //随机串     
                   "package":"prepay_id=",     
                   "signType":"MD5",         //微信签名方式:     
                   "paySign":"" //微信签名
                },
                function(res){
                    WeixinJSBridge.log(res.err_msg);
                    if( res.err_msg =="get_brand_wcpay_request:ok"){
                        alert("支付成功!");
                    }else{
                        alert("支付失败!");
                    }
                }
            );
        }

Im Miniprogramm haben wir Verwenden Sie die Methode wx.requestPayment, um die Zahlungsfunktion zu aktivieren. Bevor wir dies tun, müssen wir natürlich zuerst die prepay_id erhalten.

              wx.request({
                    url: 'https://yourwebsit/service/getPay', 
                    method: 'POST',
                    data: {
                      bookingNo:bookingNo,  /*订单号*/
                      total_fee:total_fee,   /*订单金额*/
                      openid:openid
                    },
                    header: {
                        'content-type': 'application/json'
                    },
                    success: function(res) {
                        wx.requestPayment({
                          'timeStamp':timeStamp,
                          'nonceStr': nonceStr,
                          'package': 'prepay_id='+res.data.prepay_id,
                          'signType': 'MD5',
                          'paySign': res.data._paySignjs,
                          'success':function(res){
                              console.log(res);
                          },
                          'fail':function(res){
                              console.log('fail:'+JSON.stringify(res));
                          }
                        })
                    },
                    fail: function(err) {
                        console.log(err)
                    }
                })

Die wichtigste Sache, die auf der Serverseite implementiert werden muss, besteht darin, prepay_id zu erhalten und paySign zu unterschreiben

        var bookingNo = req.param("bookingNo");
        var total_fee = req.param("total_fee");
        var openid = req.param("openid");
        var body = "费用说明";
        var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        var formData = "<xml>";
        formData += "<appid>appid</appid>"; //appid
        formData += "<attach>test</attach>";
        formData += "" + body + "";
        formData += "<mch_id>mch_id</mch_id>"; //商户号
        formData += "<nonce_str>nonce_str</nonce_str>";
        formData += "<notify_url>notify_url</notify_url>";
        formData += "<openid>" + openid + "</openid>";
        formData += "<out_trade_no>" + bookingNo + "</out_trade_no>";
        formData += "<spbill_create_ip>spbill_create_ip</spbill_create_ip>";
        formData += "<total_fee>" + total_fee + "</total_fee>";
        formData += "<trade_type>JSAPI</trade_type>";
        formData += "<sign>" + paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, bookingNo, spbill_create_ip, total_fee, 'JSAPI') + "</sign>";
        formData += "</xml>";
        request({
            url: url,
            method: 'POST',
            body: formData
        }, function(err, response, body) {
            if(!err && response.statusCode == 200) {
                var prepay_id = getXMLNodeValue('prepay_id', body.toString("utf-8"));
                var tmp = prepay_id.split('[');
                var tmp1 = tmp[2].split(']');
                //签名
                var _paySignjs = paysignjs(appid, mch_id, 'prepay_id=' + tmp1[0], 'MD5',timeStamp);
                var o = {
                    prepay_id: tmp1[0],
                    _paySignjs: _paySignjs
                }
                res.send(o);
            }
        });

Die folgenden Funktionen werden verwendet

function paysignjs(appid, nonceStr, package, signType, timeStamp) {
    var ret = {
        appId: appid,
        nonceStr: nonceStr,
        package: package,
        signType: signType,
        timeStamp: timeStamp
    };
    var string = raw1(ret);
    string = string + '&key='+key;
    console.log(string);
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string, 'utf8').digest('hex');
};

function raw1(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function(key) {
        newArgs[key] = args[key];
    });

    var string = '';
    for(var k in newArgs) {
        string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    return string;
};

function paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) {
    var ret = {
        appid: appid,
        attach: attach,
        body: body,
        mch_id: mch_id,
        nonce_str: nonce_str,
        notify_url: notify_url,
        openid: openid,
        out_trade_no: out_trade_no,
        spbill_create_ip: spbill_create_ip,
        total_fee: total_fee,
        trade_type: trade_type
    };
    var string = raw(ret);
    string = string + '&key='+key;
    var crypto = require('crypto');
    return crypto.createHash('md5').update(string, 'utf8').digest('hex');
};

function raw(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function(key) {
        newArgs[key.toLowerCase()] = args[key];
    });

    var string = '';
    for(var k in newArgs) {
        string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    return string;
};

function getXMLNodeValue(node_name, xml) {
    var tmp = xml.split("");
    var _tmp = tmp[1].split("" + node_name + ">");
    return _tmp[0];
}

Das ist So einfach: In Schritt 3 wird die WeChat-Zahlungsfunktion des Miniprogramms angeschlossen. Im Folgenden finden Sie die Testzahlungswiedergabe

Implementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets

Implementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets

Das obige ist der detaillierte Inhalt vonImplementieren Sie eine Codeanalyse der Online-Zahlungsfunktion des WeChat-Applets. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn