引包:

  1. "dependencies": {
  2. "crypto": "^1.0.1",
  3. "express": "^4.16.3",
  4. "request": "^2.85.0",
  5. "xmlreader": "^0.2.3"
  6. }

工具类 util.js

  1. var xmlreader = require("xmlreader");
  2. var fs = require("fs");
  3.  
  4. var wxpay = {
  5.  
  6. //把金额转为分
  7. getmoney: function (money) {
  8. return parseFloat(money) * 100;
  9. },
  10.  
  11. // 随机字符串产生函数
  12. createNonceStr: function () {
  13. return Math.random().toString(36).substr(2, 15);
  14. },
  15.  
  16. // 时间戳产生函数
  17. createTimeStamp: function () {
  18. return parseInt(new Date().getTime() / 1000) + '';
  19. },
  20.  
  21. //签名加密算法
  22. paysignjsapi: function (appid, body, mch_id, nonce_str, notify_url, out_trade_no, spbill_create_ip, total_fee, trade_type, mchkey) {
  23. var ret = {
  24. appid: appid,
  25. mch_id: mch_id,
  26. nonce_str: nonce_str,
  27. body: body,
  28. notify_url: notify_url,
  29. out_trade_no: out_trade_no,
  30. spbill_create_ip: spbill_create_ip,
  31. total_fee: total_fee,
  32. trade_type: trade_type
  33. };
  34. console.log('ret==', ret);
  35. var string = raw(ret);
  36. var key = mchkey;
  37. string = string + '&key=' + key;
  38. console.log('string=', string);
  39. var crypto = require('crypto');
  40. return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
  41. },
  42. //签名加密算法,第二次的签名
  43. paysignjsapifinal: function (appid,mch_id,prepayid,noncestr,timestamp,mchkey) {
  44. var ret = {
  45. appid: appid,
  46. partnerid: mch_id,
  47. prepayid: prepayid,
  48. package: 'Sign=WXPay',
  49. noncestr: noncestr,
  50. timestamp: timestamp,
  51. };
  52. console.log('retretret==', ret);
  53. var string = raw(ret);
  54. var key = mchkey;
  55. string = string + '&key=' + key;
  56. console.log('stringstringstring=', string);
  57. var crypto = require('crypto');
  58. return crypto.createHash('md5').update(string, 'utf8').digest('hex').toUpperCase();
  59. },
  60. getXMLNodeValue: function (xml) {
  61. // var tmp = xml.split("<"+node_name+">");
  62. // console.log('tmp',tmp);
  63. // var _tmp = tmp[1].split("</"+node_name+">");
  64. // console.log('_tmp',_tmp);
  65. // return _tmp[0];
  66. xmlreader.read(xml, function (errors, response) {
  67. if (null !== errors) {
  68. console.log(errors)
  69. return;
  70. }
  71. console.log('长度===', response.xml.prepay_id.text().length);
  72. var prepay_id = response.xml.prepay_id.text();
  73. console.log('解析后的prepay_id==',prepay_id);
  74. return prepay_id;
  75. });
  76. }
  77.  
  78. }
  79. function raw(args) {
  80. var keys = Object.keys(args);
  81. keys = keys.sort()
  82. var newArgs = {};
  83. keys.forEach(function (key) {
  84. newArgs[key] = args[key];
  85. });
  86. var string = '';
  87. for (var k in newArgs) {
  88. string += '&' + k + '=' + newArgs[k];
  89. }
  90. string = string.substr(1);
  91. return string;
  92. }
  93.  
  94. module.exports = wxpay;

调用 app.js

  1. var express = require('express');
  2. var request = require('request');
  3. var xmlreader = require("xmlreader");
  4. var fs = require("fs");
  5.  
  6. var app = express();
  7.  
  8. var wxpay = require('./util');
  9.  
  10. var appid = '';  
  11. var appsecret = '';
  12. var mchid = ''
  13. var mchkey = '';
  14. var wxurl = 'http://xxxx';
  15.  
  16. app.get('/',(req,res)=>{
  17.  
  18. //首先拿到前端传过来的参数
  19. let orderCode = 20150806125346;
  20. let money = 100;
  21. let orderID = 1;
  22.  
  23. // console.log('APP传过来的参数是',orderCode+'----'+money+'------'+orderID+'----'+appid+'-----'+appsecret+'-----'+mchid+'-----'+mchkey);
  24.  
  25. //首先生成签名sign
  26. appid
  27. let mch_id = mchid;
  28. let nonce_str = wxpay.createNonceStr();
  29. let timestamp = wxpay.createTimeStamp();
  30. let body = '测试微信支付';
  31. let out_trade_no = orderCode;
  32. let total_fee = wxpay.getmoney(money);
  33. let spbill_create_ip = req.connection.remoteAddress;
  34. let notify_url = wxurl;
  35. let trade_type = 'JSAPI';
  36.  
  37. let sign = wxpay.paysignjsapi(appid,body,mch_id,nonce_str,notify_url,out_trade_no,spbill_create_ip,total_fee,trade_type,mchkey);
  38.  
  39. console.log('sign==',sign);
  40.  
  41. //组装xml数据
  42. var formData = "<xml>";
  43. formData += "<appid>"+appid+"</appid>"; //appid
  44. formData += "<body><![CDATA["+"测试微信支付"+"]]></body>";
  45. formData += "<mch_id>"+mch_id+"</mch_id>"; //商户号
  46. formData += "<nonce_str>"+nonce_str+"</nonce_str>"; //随机字符串,不长于32位。
  47. formData += "<notify_url>"+notify_url+"</notify_url>";
  48. formData += "<out_trade_no>"+out_trade_no+"</out_trade_no>";
  49. formData += "<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>";
  50. formData += "<total_fee>"+total_fee+"</total_fee>";
  51. formData += "<trade_type>"+trade_type+"</trade_type>";
  52. formData += "<sign>"+sign+"</sign>";
  53. formData += "</xml>";
  54.  
  55. // console.log('formData===',formData);
  56.  
  57. var url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
  58.  
  59. request({url:url,method:'POST',body: formData},function(err,response,body){
  60. if(!err && response.statusCode == 200){
  61. // console.log(body);
  62.  
  63. xmlreader.read(body.toString("utf-8"), function (errors, response) {
  64. if (null !== errors) {
  65. // console.log(errors)
  66. return;
  67. }
  68. // console.log('长度===', response.xml.prepay_id.text().length);
  69. var prepay_id = response.xml.return_code.text();
  70. // console.log('解析后的prepay_id==',response.xml.return_code.text());
  71.  
  72. //将预支付订单和其他信息一起签名后返回给前端
  73. let finalsign = wxpay.paysignjsapifinal(appid,mch_id,prepay_id,nonce_str,timestamp,mchkey);
  74.  
  75. res.json({'appId':appid,'partnerId':mchid,'prepayId':prepay_id,'nonceStr':nonce_str,'timeStamp':timestamp,'package':'Sign=WXPay','sign':finalsign});
  76.  
  77. });
  78.  
  79. }
  80. });
  81.  
  82. })
  83.  
  84. app.listen(3000,()=>{
  85. console.log('服务器启动了....');
  86. });

然后在 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. jQuery返回顶部和在线客服网站侧边栏

    效果图: 全部代码: <!DOCTYPE html> <html> <head> <title></title> <style typ ...

  2. phpexcel 导出方法

    Vendor("PHPExcel.PHPExcel"); Vendor("PHPExcel.PHPExcel.IOFactory"); Vendor(" ...

  3. 快学Scala 第二十二课 (apply和unapply)

    apply和unapply: apply方法经常用在伴生对象中,用来构造对象而不用显式地使用new. unapply是当做是伴生对象的apply方法的反向操作.apply方法接受构造参数,然后将他们变 ...

  4. 快学Scala 第四课 (多维数组,与Java集合的互操作)

    Scala二维数组的定义: val arr2 = Array.ofDim[String](2, 2) arr2(0)(0) = "aa" arr2(1)(0) = "bb ...

  5. php实现商城秒杀

    这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解 ...

  6. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  7. javascript生成规定范围的随机整数

    Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布. 我 ...

  8. java猜数游戏

    java随机数的产生 int number=(int)(Math.random()*10+1) Math.random()*n //n个随机数,从0开始 do{}while循环 //猜数,1到10的随 ...

  9. postman参数化

    1.新建csv文件 2.csv文件中输入变量名和参数 3.postman中新增接口,并设置变量 4.选择进入 5.导入参数化csv格式文件,点击run 查看运行结果

  10. Flask源码分析一:服务启动

    前言: Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. Flas ...