前置条件:申请微信发送红包的账户及其权限

依赖 blueimg-md5和 xmlreader 库

/common/weixin.js 源码

/**
* Created by chent696 on 2015/2/7.
/common/weixin.js
*/
/*
拼接微信红包xml串
*/
/*
serverConfig.json 文件内容
"clientIp":"222.73.202.251",
"showName":"i8小时",
" luckyMoneyWishing":"恭喜发财",
"mch_id":"", //
"wxkey":"", //
"wxappid":"" //
*/ var serverConfig = require('../config/serverConfig.json');
var xmlreader = require('xmlreader'); //需要安装 xmlreader包
var fs = require('fs');
var https = require('https');
var MD5=require('blueimp-md5').md5; var fnCreateXml = function(json){ var _xml = '';
for(var key in json) {
_xml+= '<'+key+'>'+json[key]+'</'+key+'>';
}
return _xml;
} /*
生成url串用于微信md5校验
*/
var fnCreateUrlParam = function(json){ var _str = '';
var _arr = []
for(var key in json){
_arr.push(key+'='+json[key]);
}
return _arr.join('&');
} /*
生成微信红包数据
*/
var fnGetWeixinBonus = function(option){ var _option = option || {};
var _min_value = _option.min_value ||100, //红包最小金额
_max_value = _option.max_value || 100, //红包最大金额
_total_amount = _option.total_amount || 100, //红包总金额
_re_openid = _option.re_openid || 'omNdNuCzOuYOm5aBr1-B5hhUS1JI', //红包发送的目标用户
_total_num = _option.total_num || 1; //红包个数 var _now = new Date();
var _showName = serverConfig.showName;
var _clientIp = serverConfig.clientIp;
var _wishing = serverConfig.luckyMoneyWishing;
var _mch_id = serverConfig.mch_id;
var _wxappid = serverConfig.wxappid,
_wxkey = serverConfig.wxkey; var _date_time = _now.getFullYear()+''+(_now.getMonth()+1)+''+_now.getDate();
var _date_no = (_now.getTime() +'').substr(-8); //生成8为日期数据,精确到毫秒
var _random_no = Math.floor(Math.random()*99);
if(_random_no<10){ //生成位数为2的随机码
_random_no = '0'+_random_no;
}
var _muc_id = _mch_id;//'1230184802';
var _xmlTemplate = '<xml>{content}</xml>';
var _contentJson = {};
_contentJson.act_name = _showName;// '新年红包';
_contentJson.client_ip = _clientIp; _contentJson.max_value = _max_value;//'100';
_contentJson.mch_billno =_muc_id +_date_time+ _date_no+_random_no; //订单号为 mch_id + yyyymmdd+10位一天内不能重复的数字; //+201502041234567893';
_contentJson.mch_id =_muc_id;
//_contentJson.logo_imgurl = '';
_contentJson.min_value = _min_value;// '100';
_contentJson.nick_name = _showName;
_contentJson.nonce_str = '50780e0cca98c8c8e814883e5caa672e';
_contentJson.re_openid = _re_openid;// 'omNdNuCzOuYOm5aBr1-B5hhUS1JI'; //涛子的openid // 'onqOjjmM1tad-3ROpncN-yUfa6uI';
_contentJson.remark = _wishing;
_contentJson.send_name =_showName;//
//_contentJson.share_content = '';
//_contentJson.share_share_url = '';
//_contentJson.share_share_imageurl = '';
_contentJson.total_amount = _total_amount;// '100';
_contentJson.total_num = _total_num ;//1;
_contentJson.wishing = _wishing;//'恭喜发财';
_contentJson.wxappid = _wxappid;// 'wxbfca079a0b9058d3'; _contentJson.key = _wxkey;
var _contentStr = fnCreateUrlParam(_contentJson);
console.log('content='+_contentStr); _contentJson.sign = MD5(_contentStr).toUpperCase();
//删除 key (key不参与签名)
delete _contentJson.key;
var _xmlData = fnCreateXml(_contentJson); var _sendData = '<xml>'+_xmlData+'</xml>'; //_xmlTemplate.replace(/{content}/) return _sendData;
console.log('xml='+_sendData);
} var fnSendMoney = function(req,res,data,callback){ var _host = 'api.mch.weixin.qq.com';
var _path = '/mmpaymkttransfers/sendredpack'; var opt = {
host:_host,
port:'443',
method:'POST',
path:_path,
key: fs.readFileSync('cert/apiclient_key.pem'), //将微信生成的证书放入 cert目录下
cert: fs.readFileSync('cert/apiclient_cert.pem')
} var body = '';
opt.agent = new https.Agent(opt);
var req = https.request(opt, function(res) {
console.log("Got response: " + res.statusCode);
res.on('data',function(d){
body += d;
}).on('end', function(){
//console.log(res.headers);
console.log('微信返回消息');
console.log(body);
var ret = fnParseReceivedXML(body);
//如果回调存在就执行回调函数
if(typeof callback == 'function'){
callback(ret);
}
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
}); var _sendData = fnGetWeixinBonus({});
req.write(_sendData);
req.end();
} /*
解析微信传回来得消息
*/
var fnParseReceivedXML = function(xmlData){ try {
xmlreader.read(xmlData, function (errors, response) {
if (null !== errors) {
console.log(errors);
return;
}
// console.log( response.xml );
if(response && response.xml && response.xml.return_code) {
if((response.xml.return_code.text()||'').toLowerCase() == 'sucess'){
return true;
}
return false;
}
return false;
});
}catch(e){
console.log('weixin sendmoney error'+ e.message);
}
} exports.sendLuckyMoney = fnSendMoney;

  

调用方式

    var common = require('../common/weixin.js');
var _data = {},
_callback = function(ret){ }; common.sendLuckyMoney(_data,_callback); 源码
注:源码中的证书 appid,商户id已经删除,请自行申请

使用nodejs调用微信发送红包的更多相关文章

  1. 微信发送红包示例(php)

    微信红包接口 微信红包是微信支付推出的一款基于微信客户端的免费服务应用,微信红包以微信支付 为核心安全保障,为广大用户提供安全,快捷的移劢支付服务. 请求URL 现金红包 https://api.mc ...

  2. php调用微信发送自定义模版接口

     function sendWechatmodel($openid,$data,$go_url)//接受消息的用户openid,发送的消息,点击详情跳转的url        {           ...

  3. php微信公众帐号发送红包

    开发框架为we7 所需参数:appid,appSecret,MchId,API密钥 <?php /** * 微信红包的类 * */ CLASS WXHongBao { private $mch_ ...

  4. ASP.NET微信公众号用于给指定OpenId用户发送红包

    ASP.NET微信公众号用于给指定OpenId用户发送红包 微信公众号要实现对指定用户发送红包,必须指定一个存放兵发放金额的商户号,在微信商户平台里面申请商户号并获取相关参数例如发送红包所要用到的安全 ...

  5. C# 调用微信接口上传素材和发送图文消息

    using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;using System.T ...

  6. NodeJS 微信公共号开发 - 响应微信发送的Token验证(山东数漫江湖)

    背景 使用 NodeJS 进行微信公共号开发,首先需要响应微信发送的Token验证,官方文档 填写服务器配置 登录微信公共平台,在开发下的基本配置打开该页面. 依次填写接口的 URL.自定义的 Tok ...

  7. 微信小程序发送红包功能。填坑记录

    微信官方文档 1.开通条件 (1)商户号已入驻90日 (2)商户号有连续30天正常交易 (3)只有企业资质的商户才有资格申请 2.注意事项 (1)目前小程序红包仅支持用户微信扫码打开小程序 (2)小程 ...

  8. NodeJs 开发微信公众号(四)微信网页授权

    微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...

  9. NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...

随机推荐

  1. Git 命令清单

    这份命令清单并不完善,后期会根据使用情况再进行更改. 操作分支项目 1 下载仓库的一个分支(baooab-patch-1)的代码 git clone -b baooab-patch-1 https:/ ...

  2. 【前端】event.target 和 event.currentTarget 的区别

    event.target 和 event.currentTarget 的区别 举例说明: <!DOCTYPE html> <html> <head> <tit ...

  3. modprobe和lsmod命令配合使用

    modprobe命令用于智能地向内核中加载模块或者从内核中移除模块. modprobe可载入指定的个别模块,或是载入一组相依的模块.modprobe会根据depmod所产生的相依关系,决定要载入哪些模 ...

  4. 27-React Lists and Keys

    Lists and Keys React支持以数组的形式来渲染多个组件,它会将你数组中的每个组件以列表的形式渲染开来. 当你使用数组的方式来渲染你的组件时,你需要给每个组件一个Key值,否则会出现一个 ...

  5. 深入理解 '0' "0" '\0' 0 之间的区别

    看来基础还是很重要的,基础不扎实就难以学好c语言,就别说写出高质量的c语言代码了.今天,我就被这个问题折磨的不行了,哈哈,不过现在终于明白了‘\0’ ,‘0’, “0” 之间的区别了.困惑和快乐与你分 ...

  6. Redis学习-基础环境介绍(二)

    1.通过VMware安装了Centos6.8系统 2.Reids安装过程,需要GCC环境 »通过下面命令,根据提示直接安装 1 yum install gcc 3.Redis选用的是3.2.4(建议使 ...

  7. Oralce 账户被锁后的解决办法

    SQL> connect sys/sys as sysdba; 已连接. SQL> alter user system account unlock; 用户已更改.  www.2cto.c ...

  8. 使用自定义标签模拟jstl的<c:for each>标签

    一.自定义标签的基本编写 下面编写一个自定义标签,它可以输出当前的时间. 1.编写标签类 类可以通过继承SimpleTagSupport类实现一个标签类编写.父类为我们提供了一些编写自定义标签的快捷的 ...

  9. PHP JSON

  10. Android开发:在布局里移动ImageView控件

    在做一个app时碰到需要移动一个图案的位置,查了一上午资料都没找到demo,自己写一个吧 RelativeLayout.LayoutParams lp = new RelativeLayout.Lay ...