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

依赖 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. Xcode5中如何切换Storyboards为xib

    在Xcode5中,当创建一个带View的iPhone项目时,默认必须使用Storyboards,不再支持切换xib的checkbox.本文讲解如何手动切换到使用xib来布局. 1,把Main.stor ...

  2. [ Arch Linux ] Arch更新源高速源整理之测速并自动排序高速源 加快更新效率

    方法一: 工具:rankmirrors 0x01 备份原来的源,并创建一个测试源 cd /etc/pacman.d cp mirrorlist mirrorlist.bakcp mirrorlist ...

  3. A simple script to get all pictures

    #-*- coding:utf-8 -*- import shutil import os from Tkinter import * import time import re def get_al ...

  4. CentOS搭建NodeJS环境

    事件驱动,承受高并发……这些耀眼的光环,使前端开发者不能不去学习NodeJS. 今天就在开发环境把NodeJS搭建起来了. 1. 下载node wget http://nodejs.org/dist/ ...

  5. Making my own Autonomous Robot in ROS / Gazebo, Day 1: Building the static model

    Day 1: Setting up ROS: Indigo OS: Ubuntu 14.04 OS: Gazebo 7.0.0 Initialize the workspace To create t ...

  6. an interview question(4)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 写这篇博客前请让博主先吐糟下自己的PC. i3+2G内存+开了一上午=C盘剩下0字节+打开VS2012花了半个小时+一晚上的心情不好 吐槽完PC, ...

  7. scss编译

    SASS?SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. sass有两种后缀名文件: sass(不使用大括号和分号)---不建议使用 ...

  8. 慕课网__HTML5 存储

    application cache 只能更新全部,不能更新单独的文件 在更新后,要重新打开浏览器,缓存才会生效, 不能实时生效

  9. Js 常用函数

    1. 算数函数(Math) 1)Js小数取整 常用于:分页算法 js 小数取整的函 .丢弃小数部分,保留整数部分 js:parseInt(/) .向上取整,有小数就整数部分加1 js: Math.ce ...

  10. Asp.Net_Mvc_@Html.xxx()的扩展

    /// <summary> /// 生成分类下拉-列表框,选中指定的项 /// </summary> /// <param name="html"&g ...