使用nodejs调用微信发送红包
前置条件:申请微信发送红包的账户及其权限
依赖 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调用微信发送红包的更多相关文章
- 微信发送红包示例(php)
微信红包接口 微信红包是微信支付推出的一款基于微信客户端的免费服务应用,微信红包以微信支付 为核心安全保障,为广大用户提供安全,快捷的移劢支付服务. 请求URL 现金红包 https://api.mc ...
- php调用微信发送自定义模版接口
function sendWechatmodel($openid,$data,$go_url)//接受消息的用户openid,发送的消息,点击详情跳转的url { ...
- php微信公众帐号发送红包
开发框架为we7 所需参数:appid,appSecret,MchId,API密钥 <?php /** * 微信红包的类 * */ CLASS WXHongBao { private $mch_ ...
- ASP.NET微信公众号用于给指定OpenId用户发送红包
ASP.NET微信公众号用于给指定OpenId用户发送红包 微信公众号要实现对指定用户发送红包,必须指定一个存放兵发放金额的商户号,在微信商户平台里面申请商户号并获取相关参数例如发送红包所要用到的安全 ...
- C# 调用微信接口上传素材和发送图文消息
using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;using System.T ...
- NodeJS 微信公共号开发 - 响应微信发送的Token验证(山东数漫江湖)
背景 使用 NodeJS 进行微信公共号开发,首先需要响应微信发送的Token验证,官方文档 填写服务器配置 登录微信公共平台,在开发下的基本配置打开该页面. 依次填写接口的 URL.自定义的 Tok ...
- 微信小程序发送红包功能。填坑记录
微信官方文档 1.开通条件 (1)商户号已入驻90日 (2)商户号有连续30天正常交易 (3)只有企业资质的商户才有资格申请 2.注意事项 (1)目前小程序红包仅支持用户微信扫码打开小程序 (2)小程 ...
- NodeJs 开发微信公众号(四)微信网页授权
微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...
- NodeJs 开发微信公众号(三)微信事件交互
微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...
随机推荐
- WPF内置命令
<Window x:Class="WpfCommands.MainWindow" xmlns="http://schemas.microsoft.c ...
- 2014鸟人Birdman中文字幕文件下载
下载后,解压缩,会得到 Birdman.2014.1080p.WEB-DL.DD5.1.H264-RARBG.srt 文件,把这个文件放到视频文件(mkv文件)相同的文件夹里. 用暴风影音播放,如果没 ...
- MySQL + Atlas --- 部署读写分离
阅读目录 1. 数据库用户配置 2. 主从数据库连接 3. Atlas配置 4. 读写分离测试 序章 Atlas是360团队弄出来的一套基于MySQL-Proxy基础之上的代理,修改了MySQL-Pr ...
- http协议 幂等性的理解
HTTP GET.DELETE.PUT.POST四种主要方法的幂等性的理解 GET: GET请求是幂等的,多次的GET请求,不应该修改数据状态,只是查询. DELETE Delete请求也具有幂等性, ...
- DNS域名解析服务器
域名解析服务器,靠它把你要访问的网址找到然后把信息送到你电脑上.DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的.域名服务器是指保存有该网络中所有主 ...
- html4,xhtml,html5发展历史
SGML SGML 是一种很强大但很复杂的标记语言,HTML.XML 就是从中衍生出来的.SGML 的例子如下:<QUOTE TYPE="example"> typic ...
- Could not resolve placeholder 解决方案
spring 配置加载properties文件的时候,报 Could not resolve placeholder 错误. 经过仔细查找,排除文件路径,文件类容错误的原因,经过查找相关资料,出现&q ...
- 优秀开发人员网站推荐。——Arvin
常用论坛汇总:智能车制作论坛:http://www.znczz.com/中国电子网:http://www.21ic.com/爱板网:http://www.eeboard.com/电子发烧友:http: ...
- psp进度(11月25号-31号)
本周psp进度 11月25号 内容 开始时间 结束时间 打断时间 净时间 处理数据集 9:27 11:34 12m 115m 11月27号 内容 开始时间 结束时间 打断时间 净时间 scr ...
- 安装linux操作系统
安装双操作系统; 1 0. 介绍: 1 1 实验环境: 2 2. 实验准备: 2 3.开始安装: 2 1 制作U盘启动工具: 2 2.安装LinuxOS. 3 2.1在windowOS中划分60G空间 ...