引包:

"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

微信App支付 --- NodeJs的更多相关文章

  1. nodejs+koa2微信app支付,小程序支付

    企业付款到零钱文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 1,搞微信支付,先看流程图 https: ...

  2. 微信app支付 ci框架做的

    /**     * 组合微信app支付  获得prepayid     * @param int $order_num     */    private function _wxpay_reques ...

  3. .net 微信APP支付接口的开发流程以及坑

    流程 申请APP的微信支付 申请成功之后得到APPID 商户号 以及自己设置商户号的支付密码 这时就可以开发接口了 微信APP支付API:https://pay.weixin.qq.com/wiki/ ...

  4. 微信app支付android客户端以及.net服务端实现

    由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app ...

  5. php开发微信APP支付接口

    之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ...

  6. H5使用codovar插件实现微信支付(微信APP支付模式,前端)

    H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ...

  7. asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4

    微信app支付需要以下参数,类封装如下 public class WxPayModel { /// <summary> /// 应用ID /// </summary> publ ...

  8. 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付

    在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...

  9. Android版-微信APP支付

    首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ...

随机推荐

  1. vue 条件渲染方式

    1.通过class绑定 <div :class="{'div-class': this.align == 'center'}"></div> 对应的css ...

  2. THINKPHP 中关联查询(多表查询)

    THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 1.Table方法:定义要操作的数据表名称,可以动态改变当前操作的数据表名称,需要写数据表的全名,包 ...

  3. <机器学习>无监督学习算法总结

    本文仅对常见的无监督学习算法进行了简单讲述,其他的如自动编码器,受限玻尔兹曼机用于无监督学习,神经网络用于无监督学习等未包括.同时虽然整体上分为了聚类和降维两大类,但实际上这两类并非完全正交,很多地方 ...

  4. 一个企图用来进行前端交流的qq群

    我建了一个企图用来进行前端交流的qq群! 希望各位前端开发攻城狮们加入! 大佬.小白都欢迎! 禁广告党! 只是想有一个纯净的环境去讨论一下大家遇到的问题和行业前景之类的话题. 661270378 期待 ...

  5. 编程小技巧之 Linux 文本处理命令

    合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也.合理的利用 Linux 的命令行工具,可以提高我们的工作效率. 本文简单的介绍三个能使用 Linux 文本处理命令的场景,给大家开阔一下思路 ...

  6. 【Elasticsearch 搜索之路】(一)什么是 Elasticsearch?

    本篇文章对 Elasticsearch 做了基本介绍,在后续将通过专栏的方式持续更新,本系列以 Elasticsearch7 作为主要的讲解版本,欢迎各位大佬指正,共同学习进步! 一般涉及大型数据库的 ...

  7. ES6——箭头函数与普通函数的区别

    ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: 语法: //1.没有形参的时候 let fun = () ...

  8. 查询SQL SERVER 数据库版本号脚本语句

    数据库直接执行此语句即可select @@version 示例: Microsoft SQL Server 2014 - 12.0.2000.8 (X64)   Feb 20 2014 20:04:2 ...

  9. 2. spring 应用之IOC

    本文是作者原创,版权归作者所有.若要转载,请注明出处 我们知道Spring Framework 最重要的功能就是IoC (Inversion of Control ),也叫DI(dependency ...

  10. Creator3D 守护你的球球—UV动画与天空盒

    1 游戏预览 在线体验地址:http://example.creator-star.cn/follo-ball/ 2 场景物体 场景物体 新建场景后,引擎会为我们创建默认的摄像机和灯光,这个我们就不介 ...