引包:

"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

最新文章

  1. [软件工程] 查找二维数组最大子数组的之和 郭莉莉&amp;李亚文
  2. Android学习笔记之使用LBS实现定位
  3. 在View页面,使用@if(){ }输出判断正确的内容
  4. MS Sq l数据类型
  5. fawef
  6. 排序算法 - 快速排序(Quick Sort)
  7. mapreduce 关于小文件导致任务缓慢的问题
  8. 2016青岛网络赛 Sort
  9. 10.8.5如何升级(app store 出错 请稍后重试 100)
  10. rapidPHP 下载并安装
  11. 分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式架构
  12. java读取请求中body数据
  13. How to create and start VirtualBox VM without GUI
  14. capwap学习笔记——初识capwap(三)(下)
  15. 构建apache web 服务器
  16. luogu 4345 Lucas的变形应用
  17. 移动Web端资源整合
  18. CentOS7使用firewalld和selinux
  19. ECShop模板原理
  20. webGL 光照

热门文章

  1. Ajax async属性
  2. 死磕 java同步系列之redis分布式锁进化史
  3. 正睿OI国庆day1
  4. GitHub项目徽标
  5. ORM增删改查
  6. JS的加减乘除高精度
  7. 安装web3失败问题
  8. vue父子组件钩子函数的执行顺序
  9. day 21
  10. python编程基础之九