使用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是怎么 ...
随机推荐
- angular源码阅读3:真的,依赖注入的原理
前面已经提到了: 如何注册一个module. 如何获取一个module. injector与module以及provider的关系. 那么已经剩下最后一部分了,就是关于依赖是如何被注入的. 且看下面这 ...
- SublimeText个性化快捷键设置
一.光标跳出括号 在编写js函数的时候,输入函数名和括号的时候,要想光标跳出括号还得手动的按left键.离两个手的区域比较远,可自行配置 preferences - keys bindings - u ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- Latex引用插图格式制定问题(1)
自定义新命令\reffig如下:\newcommand{\reffig}[1]{Figure \ref{#1}}在需要引用图片的时候,用\reffig代替\ref,就可以自动在图号前面输出" ...
- rxjava源码分析
RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看 rxjava源码中的线程知识 一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...
- 【Java】需要注意的小细节
一.==和equals 1.比较两个变量时 a.==可以判断两个变量是否相等,如果两个变量是基本类型变量,而且是数值类型,只要两个变量值相等,返回true. 2.比较两个引用变量 a.==只有两个引用 ...
- 转:eclipse打开文件或者目录位置(不使用插件)
http://my.oschina.net/havoc/blog/204958?p= 首先说不使用插件的方法 WINDOWS eclipse配置 Run-->External Tools--&g ...
- duilib的caption上的Edit无法激活
当窗口设置标题栏时,鼠标等控件可以相应,edit无法响应. 主要和WindowImplBase::OnNcHitTest 虚函数有关. LRESULT WindowImplBase::OnNcHitT ...
- 数据库 MySQL安装图解
MySQL安装图解 一.MYSQL的安装 1.打开下载的mysql安装文件,双击运行mysql-5.5.40-win32.msi. 2.选择安装类型,有"Typical(默认)". ...
- Ubuntu16.04安装Samba
在新装的ubuntu16.04下安装samba. 安装好samba后备份下配置文件: zhuben@zb:~$ sudo apt-get install samba zhuben@zb:~$ cd / ...