使用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已经删除,请自行申请
时间: 2024-10-09 17:50:27

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

php微信公众帐号发送红包

开发框架为we7 所需参数:appid,appSecret,MchId,API密钥 <?php /** * 微信红包的类 * */ CLASS WXHongBao { private $mch_id = "111111";//商户ID写死 private $wxappid = "22222222";//微信公众号,写死 private $client_ip = "119.29.80.114"; //调用红包接口的主机的IP,服务端IP,写死

一起发红包 微信平台红包接口调用教程(转)

微信在昨天正式向支付商户平台开放了红包发放的接口,支付商户平台将可以调用此接口向自己的用户发放红包来作为促销活动.那么支付商户平台要怎样开通这个功能呢?又有那些需要注意的呢?希望这篇文章对大家有些用处. 首先,商户调用微信红包接口时,服务器会进行证书验证,所以要在商户平台下载证书.在管理后台的“账户信息”里找到“安全设置”就可以下载了证书了. 接着就是向帐号中充值,因为发放现金红包将扣除商户的可用余额,所以需要预先充值,确保可用余额充足.进入“资金管理”菜单找到“现金管理”,在此进行充值,保证帐

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

using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;using System.Text; /// <summary> /// 调用微信接口凭证access_token /// </summary> private static string test_access_token { get { return "XXXXXXXXXXXX"; } }

微信裂变红包

微信裂变红包是指微信用户在收到企业发送的组合红包之后, 可以再次将红包中的剩余金额分享给好友领取的一种现金红包形式. 一.功能介绍 春节期间,微信红包以其独特的魅力,优秀的用户体验和安全的支付环境,一经推出即受到了广大用户的热烈欢迎,现微信支付现金红包向微信支付商户开发,具体能力如下: 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅

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

微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需要网页授权这种方式去获取呢,直接从数据库中读取不就可以了吗?这样的做的原因是服务器会话时间终究是有限的,关注后我们设置的会话一般在半个月左右,半个月后就需要重新生成会话,而这时就需要网页授权的openid帮忙了.况且,用户的信息也是会刷新的,虽然这种情况很少发生,但是我们至少应该确保信息是有一定的更

微信企业红包开发(php)

微信的开发真的有点麻烦,不是难,就是烦,细节多,东西多,关联多 这里记录下 微信企业红包开发的整个过程(弄完的话  微信支付 也差不多了,代码是 php的) 申请:这里只说简单的过程 先申请公众服务号 在服务号中申请'微信支付'(登录公众号平台首页左面有这个菜单),觉得微信在推广移动支付,所以还是很好申请的,关于申请中填写的网站最好做一个购买的演示链接,这样可能更容易下来. 证书 微信支付申请下来了,那么你有了一个 微信的 商户号和登录密码 (会发邮件给你) 还是从申请微信支付哪里 点到  微信

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

微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么样与微信交互的.这些功能的入口就是你在测试公众号里面填写的URL(以下用/login/wechat代替). 事件交互 扫码关注微信公众号后,微信会调用你的接口/login/wechat,并且附带一段xml信息,首先你需要获取一些签名,通过加密.排序比对是否与你填写的TOKEN一致,如果一致则进行xm

微信发红包 PHP 实现

最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1 class WxRedPack { //配置参数信息 const SHANGHUHAO = "***********";//商户号 const PART

Android调用微信登陆、分享、支付

前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也有个找资料的地方. 一.微信登陆分三个步骤: 1).微信授权登陆  2).根据授权登陆code 获取该用户token  3).根据token获取用户资料  4).接收微信的请求及返回值 如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作: a. 在你的包名相应目录