ホームページ  >  記事  >  WeChat アプレット  >  WeChatアプレットのオンライン決済機能のコード解析を実装する

WeChatアプレットのオンライン決済機能のコード解析を実装する

Y2J
Y2Jオリジナル
2017-04-22 15:10:363920ブラウズ

最近、WeChat ミニ プログラムでオンライン支払い機能を使用する必要があったので、公式ドキュメントを確認したところ、WeChat 支払いを開発した場合は、ミニ プログラムに WeChat 支払いを実装すると非常に便利であることがわかりました。ミニプログラムでの WeChat 決済の開発プロセスは、サービス アカウントでの開発プロセスとまったく同じであることがわかります。次に、ミニ プログラムでの WeChat 決済の開発プロセスと注意点について説明します。詳細に。

WeChatアプレットのオンライン決済機能のコード解析を実装する

1. WeChat決済とWeChat販売アカウントを開設する
このプロセスは、WeChat決済のサービスアカウント開設プロセスと同じです。

WeChatアプレットのオンライン決済機能のコード解析を実装する

2. ユーザーの openid を取得する
ホームページ ミニ プログラムのクライアント js で現在のユーザーの openid を取得する必要があります。ユーザーのコードは、wx.login メソッドを呼び出して取得できます。次に、開発者サーバーはログイン資格情報コードを使用して openid を取得します。

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. prepay_id と支払い署名検証 paySign を取得します
このステップのプロセスは、サービス アカウントでの WeChat 支払いプロセスと同じであり、クライアント側とサーバー側に分かれています
まず、クライアント側の JS を見てみましょう。
サービス アカウントでは、次のコードを通じて支払い機能を有効にします

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("支付失败!");
                    }
                }
            );
        }

ミニ プログラムでは、wx.requestPayment メソッドを通じて支払い機能を有効にします。もちろん、これを行う前に、まず prepay_id を取得する必要があります。

              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)
                    }
                })

サーバー側で主に実装するのは、prepay_idと署名paySignの取得です

        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);
            }
        });

使用する関数は以下の通りです

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];
}

たった3つの簡単なステップで、ミニプログラムのWeChat決済機能が接続されます。以下はテストの支払いレンダリングです

WeChatアプレットのオンライン決済機能のコード解析を実装する

WeChatアプレットのオンライン決済機能のコード解析を実装する

以上がWeChatアプレットのオンライン決済機能のコード解析を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。