1. 程式人生 > >微信App支付 --- NodeJs

微信App支付 --- NodeJs

 

 

 

引包:

"dependencies": {
    "crypto": "^1.0.1",
    "express": "^4.16.3",
    "request": "^2.85.0",
    "xmlreader": "^0.2.3"
  }

 

工具類 util.js

var xmlreader = require("xmlreader");
var fs = require("fs");
 
 
var wxpay = {
 
    //把金額轉為分
    getmoney: function (money) {
        
return parseFloat(money) * 100; }, // 隨機字串產生函式 createNonceStr: function () { return Math.random().toString(36).substr(2, 15); }, // 時間戳產生函式 createTimeStamp: function () { return parseInt(new Date().getTime() / 1000) + ''; }, //簽名加密演算法 paysignjsapi: function
(appid, body, mch_id, nonce_str, notify_url, out_trade_no, spbill_create_ip, total_fee, trade_type, mchkey) { var ret = { appid: appid, mch_id: mch_id, nonce_str: nonce_str, body: body, notify_url: notify_url, out_trade_no: out_trade_no, spbill_create_ip: spbill_create_ip, total_fee: total_fee, trade_type: trade_type }; console.log(
'ret==', ret); var string = raw(ret); var key = mchkey; string = string + '&key=' + key; console.log('string=', string); var crypto = require('crypto'); return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase(); }, //簽名加密演算法,第二次的簽名 paysignjsapifinal: function (appid,mch_id,prepayid,noncestr,timestamp,mchkey) { var ret = { appid: appid, partnerid: mch_id, prepayid: prepayid, package: 'Sign=WXPay', noncestr: noncestr, timestamp: timestamp, }; console.log('retretret==', ret); var string = raw(ret); var key = mchkey; string = string + '&key=' + key; console.log('stringstringstring=', string); var crypto = require('crypto'); return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase(); }, getXMLNodeValue: function (xml) { // var tmp = xml.split("<"+node_name+">"); // console.log('tmp',tmp); // var _tmp = tmp[1].split("</"+node_name+">"); // console.log('_tmp',_tmp); // return _tmp[0]; xmlreader.read(xml, function (errors, response) { if (null !== errors) { console.log(errors) return; } console.log('長度===', response.xml.prepay_id.text().length); var prepay_id = response.xml.prepay_id.text(); console.log('解析後的prepay_id==',prepay_id); return prepay_id; }); } } function raw(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; } module.exports = wxpay;

 

呼叫 app.js

var express = require('express');
var request = require('request');
var xmlreader = require("xmlreader");
var fs = require("fs");
 
var app = express();
 
var wxpay = require('./util');
 
 
var appid     = '';  
var appsecret = '';
var mchid     = ''
var mchkey    = '';
var wxurl     = 'http://xxxx';
 
app.get('/',(req,res)=>{
    
    //首先拿到前端傳過來的引數
    let orderCode = 20150806125346;
    let money     = 100;
    let orderID   = 1;
 
    // console.log('APP傳過來的引數是',orderCode+'----'+money+'------'+orderID+'----'+appid+'-----'+appsecret+'-----'+mchid+'-----'+mchkey);
 
    //首先生成簽名sign
    appid
    let mch_id = mchid;
    let nonce_str = wxpay.createNonceStr();
    let timestamp = wxpay.createTimeStamp();
    let body = '測試微信支付';
    let out_trade_no = orderCode;
    let total_fee = wxpay.getmoney(money);
    let spbill_create_ip = req.connection.remoteAddress;
    let notify_url = wxurl;
    let trade_type = 'JSAPI';
 
    let sign = wxpay.paysignjsapi(appid,body,mch_id,nonce_str,notify_url,out_trade_no,spbill_create_ip,total_fee,trade_type,mchkey);
 
    console.log('sign==',sign);
 
    //組裝xml資料
    var formData  = "<xml>";
    formData  += "<appid>"+appid+"</appid>";  //appid
    formData  += "<body><![CDATA["+"測試微信支付"+"]]></body>";
    formData  += "<mch_id>"+mch_id+"</mch_id>";  //商戶號
    formData  += "<nonce_str>"+nonce_str+"</nonce_str>"; //隨機字串,不長於32位。
    formData  += "<notify_url>"+notify_url+"</notify_url>";
    formData  += "<out_trade_no>"+out_trade_no+"</out_trade_no>";
    formData  += "<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>";
    formData  += "<total_fee>"+total_fee+"</total_fee>";
    formData  += "<trade_type>"+trade_type+"</trade_type>";
    formData  += "<sign>"+sign+"</sign>";
    formData  += "</xml>";
 
    // console.log('formData===',formData);

    var url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
 
    request({url:url,method:'POST',body: formData},function(err,response,body){
        if(!err && response.statusCode == 200){
            // console.log(body);
 
            xmlreader.read(body.toString("utf-8"), function (errors, response) {
                if (null !== errors) {
                    // console.log(errors)
                    return;
                }
                // console.log('長度===', response.xml.prepay_id.text().length);
                var prepay_id = response.xml.return_code.text();
                // console.log('解析後的prepay_id==',response.xml.return_code.text());
 
 
                //將預支付訂單和其他資訊一起簽名後返回給前端
                let finalsign = wxpay.paysignjsapifinal(appid,mch_id,prepay_id,nonce_str,timestamp,mchkey);
 
                res.json({'appId':appid,'partnerId':mchid,'prepayId':prepay_id,'nonceStr':nonce_str,'timeStamp':timestamp,'package':'Sign=WXPay','sign':finalsign});
 
            });
 
 
        }
    });
 
})
 
 
app.listen(3000,()=>{
    console.log('伺服器啟動了....');
});

 

 

然後在 app 調起微信支付頁面(詳情移步下面連結)

https://www.cnblogs.com/zyulike/p/10122789.html