{"version":3,"sources":["jsdelivr-header.js","/npm/node-weixin@0.1.0/index.js"],"names":[],"mappings":"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","file":"/npm/node-weixin@0.1.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/node-weixin@0.1.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * Created with IntelliJ IDEA.\n * User: hujianmeng\n * Date: 13-12-23\n * Time: 下午12:40\n * To change this template use File | Settings | File Templates.\n */\n\nvar fs = require('fs');\nvar sha1 = require('sha1');\nvar BufferHelper = require('bufferhelper');\nvar xml2js = require('xml2js');\nvar events = require('events');\nvar emitter = new events.EventEmitter();\nvar httpHandle = require('./lib/util').httpHandle;\nvar weixinMsgXml = require('./lib/weixinMsgXml').weixinMsgXml;\n\n/**\n * 微信类，实现微信的所有接口\n * @param options\n * @constructor\n */\nvar Weixin = function (options) {\n    this.accessTokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}';\n    this.postKefuMsgUrl = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={ACCESS_TOKEN}';\n    this.getUserListUrl = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token={ACCESS_TOKEN}&next_openid=';\n    this.setCusMenuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token={ACCESS_TOKEN}';\n    this.getCusMenuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token={ACCESS_TOKEN}';\n    this.delCusMenuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={ACCESS_TOKEN}';\n    this.createTicketUrl = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={ACCESS_TOKEN}';\n    this.getTicketUrl = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={TICKET}';\n    this.url = options.url || '/';\n    this.token = options.token || '';\n    this.appid = options.appid || '';\n    this.secret = options.secret || '';\n\n    this.accessToken = '';\n};\n\n/**\n * 初使化\n * @param options\n * {\n *     token: ''    //自己在公共平台填写的token值\n * }\n * @returns {Weixin}\n */\nWeixin.init = function (options) {\n    return new Weixin(options);\n};\n\n/**\n * 解析消息错误\n * @returns {*}\n */\nWeixin.prototype.handleMsgErr = function () {\n    emitter.on('MsgErr', this.err);\n    return this;\n};\n\n/**\n * 监听解析消息错误\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.errMsg = function (callback) {\n    emitter.on('MsgErr', callback);\n    return this;\n};\n\n/**\n * 处理文本消息\n * @returns {*}\n */\nWeixin.prototype.handleTextMsg = function () {\n    emitter.emit('TextMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听文本消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.textMsg = function (callback) {\n    emitter.on('TextMsg', callback);\n    return this;\n};\n\n/**\n * 处理图片消息\n * @returns {*}\n */\nWeixin.prototype.handleImageMsg = function () {\n    emitter.emit('ImageMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听图片消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.imageMsg = function (callback) {\n    emitter.on('ImageMsg', callback);\n    return this;\n};\n\n/**\n * 处理语音消息\n * @returns {*}\n */\nWeixin.prototype.handleVoiceMsg = function () {\n    emitter.emit('VoiceMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听语音消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.voiceMsg = function (callback) {\n    emitter.on('VoiceMsg', callback);\n    return this;\n};\n\n/**\n * 处理视频消息\n * @returns {*}\n */\nWeixin.prototype.handleVideoMsg = function () {\n    emitter.emit('VideoMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听视频消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.videoMsg = function (callback) {\n    emitter.on('VideoMsg', callback);\n    return this;\n};\n\n/**\n * 处理位置消息\n * @returns {*}\n */\nWeixin.prototype.handleLocationMsg = function () {\n    emitter.emit('LocationMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听位置消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.locationMsg = function (callback) {\n    emitter.on('LocationMsg', callback);\n    return this;\n};\n\n/**\n * 处理位置消息\n * @returns {*}\n */\nWeixin.prototype.handleLinkMsg = function () {\n    emitter.emit('LinkMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听位置消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.linkMsg = function (callback) {\n    emitter.on('LinkMsg', callback);\n    return this;\n};\n\n/**\n * 处理事件消息\n * @returns {*}\n */\nWeixin.prototype.handleEventMsg = function () {\n    var event = this.msg.Event;\n    switch (event) {\n        case 'subscribe':\n            this.handleSubEventMsg();\n            break;\n        case 'unsubscribe':\n            this.handleUnsubEventMsg();\n            break;\n        case 'scan':\n            this.handleScanEventMsg();\n            break;\n        case 'ENTER':\n            this.handleEnterEventMsg();\n            break;\n        case 'LOCATION':\n            this.handleLocationEventMsg();\n            break;\n        case 'CLICK':\n            this.handleClickEventMsg();\n            break;\n    }\n\n    return this;\n};\n\n/**\n * 处理订阅事件消息\n * @returns {*}\n */\nWeixin.prototype.handleSubEventMsg = function () {\n    // 扫码，未关注，先关注后发场景值\n    emitter.emit('SubEventMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听订阅事件消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.subEventMsg = function (callback) {\n    emitter.on('SubEventMsg', callback);\n    return this;\n};\n\n/**\n * 处理取消订阅事件消息\n * @returns {*}\n */\nWeixin.prototype.handleUnsubEventMsg = function () {\n    emitter.emit('UnSubEventMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听取消订阅事件\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.unsubEventMsg = function (callback) {\n    emitter.on('UnSubEventMsg', callback);\n    return this;\n};\n\n/**\n * 处理扫码事件消息\n * @returns {*}\n */\nWeixin.prototype.handleScanEventMsg = function () {\n    emitter.emit('ScanEventMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听扫码事件\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.scanEventMsg = function (callback) {\n    emitter.on('ScanEventMsg', callback);\n    return this;\n};\n\n/**\n * 处理进入会话事件消息\n * @returns {*}\n */\nWeixin.prototype.handleEnterEventMsg = function () {\n    emitter.emit('EnterEventMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听进入会话事件\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.enterEventMsg = function (callback) {\n    emitter.on('EnterEventMsg', callback);\n    return this;\n};\n\n/**\n * 处理上报地理位置消息\n * @returns {*}\n */\nWeixin.prototype.handleLocationEventMsg = function () {\n    emitter.emit('LocationEventMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听上报地理位置消息\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.locationEventMsg = function (callback) {\n    emitter.on('LocationEventMsg', callback);\n    return this;\n};\n\n/**\n * 处理自定义菜单事件\n * @returns {*}\n */\nWeixin.prototype.handleClickEventMsg = function () {\n    emitter.emit('clickEventMsg', this.msg);\n    return this;\n};\n\n/**\n * 监听自定义菜单事件\n * @param callback\n * @returns {*}\n */\nWeixin.prototype.clickEventMsg = function (callback) {\n    emitter.on('clickEventMsg', callback);\n    return this;\n};\n\n/**\n * 接收消息解析\n */\nWeixin.prototype.analysisMsg = function () {\n    if (this.err) {\n        this.handleMsgErr();\n    } else {\n        var MsgType = this.msg.MsgType;\n        switch (MsgType) {\n            case 'text':\n                this.handleTextMsg();   //文本消息\n                break;\n            case 'image':\n                this.handleImageMsg();  //图片消息\n                break;\n            case 'voice':\n                this.handleVoiceMsg();  //语音消息\n                break;\n            case 'video':\n                this.handleVideoMsg();  //视频消息\n                break;\n            case 'location':\n                this.handleLocationMsg();   //地理位置消息\n                break;\n            case 'link':\n                this.handleLinkMsg();   //链接消息\n                break;\n            case 'event':\n                this.handleEventMsg();  //事件消息\n                break;\n        }\n    }\n};\n\n/**\n * 洗下数据，数组取第一个\n * @param json\n * @returns {*}\n */\nWeixin.prototype.parseJson = function (json) {\n    for (var key in json) {\n        json[key] = json[key] instanceof Array ? json[key][0] : json[key];\n    }\n    return json;\n};\n\n/**\n * 接收消息\n * @param req\n * @param res\n */\nWeixin.prototype.getMsg = function (req, res) {\n    var bufferHelper = new BufferHelper();\n    var _this = this;\n    _this.res = res;\n    req.setEncoding('utf-8');\n    req.on('data', function (chunk) {\n        bufferHelper.concat(chunk);\n    });\n    req.on('end', function () {\n        xml2js.parseString(bufferHelper.toBuffer().toString(), function (err, json) {\n            if (err) {\n                _this.err = err;\n            } else {\n                _this.msg = _this.parseJson(json.xml);\n            }\n            _this.analysisMsg();\n        });\n    });\n};\n\n/**\n * 服务器请请该接口，发送三个参数，本地经过流程判断有效性\n * 验证权限\n * @param req\n * @returns {boolean}\n */\nWeixin.prototype.signature = function (req) {\n    var signature = req.query.signature;    //服务器签名\n    var timestamp = req.query.timestamp;\n    var nonce = req.query.nonce;\n\n    var tmpArray = [this.token, timestamp, nonce];\n    tmpArray.sort();\n\n    this.sha1Str = sha1(tmpArray.join(''));\n\n    if (this.sha1Str == signature) {\n        return true;\n    } else {\n        return false;\n    }\n};\n\n/**\n * 被动回复消息\n * @param msg\n */\nWeixin.prototype.postMsg = function (msg) {\n    var MsgType = msg.MsgType;\n    var weixinTmpl = weixinMsgXml[MsgType];\n    for (var k in msg) {\n        var reg = new RegExp('{' + k + '}', 'g');\n        weixinTmpl = weixinTmpl.replace(reg, msg[k]);\n    }\n    if (MsgType == 'news') {\n        var items = '';\n        for (var i = 0; i < msg.Articles.length; i++) {\n            var tmp = weixinMsgXml['item'];\n            for (var item in msg.Articles[i]) {\n                var regNews = new RegExp('{' + item + '}', 'g');\n                tmp = tmp.replace(regNews, msg.Articles[i][item]);\n            }\n            items += tmp;\n        }\n        weixinTmpl = weixinTmpl.replace('{ArticleCount}', Object.keys(msg.Articles).length);\n        weixinTmpl = weixinTmpl.replace('{items}', items);\n    }\n    this.res.type('xml');\n    this.res.send(weixinTmpl);\n};\n\n/**\n * 以上接收订阅号的事件\n * ==================================================================================================================\n * 以下是高级接口，需要申请了公众号才可使用\n */\n\n/**\n * 获取access token\n */\nWeixin.prototype.getAccessToken = function (callback) {\n    var url = this.accessTokenUrl.replace('{APPID}', this.appid).replace('{APPSECRET}', this.secret);\n    httpHandle(url, 'GET', {}, {}, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n * 发送客服消息\n * @param data 客服消息内容\n * @param callback\n */\nWeixin.prototype.postKefuMsg = function (data, callback) {\n    var url = this.postKefuMsgUrl.replace(/{ACCESS_TOKEN}/g, this.accessToken);\n    httpHandle(url, 'POST', {}, data, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n *  取用户信息\n * @param callback\n */\nWeixin.prototype.getUserList = function (callback) {\n    var url = this.getUserListUrl.replace(/{ACCESS_TOKEN}/g, this.accessToken);\n    httpHandle(url, 'GET', {}, {}, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n * 创建自定义菜单\n * @param data  菜单信息\n * @param callback\n */\nWeixin.prototype.setCusMenu = function (data, callback) {\n    var url = this.setCusMenuUrl.replace(/{ACCESS_TOKEN}/g, this.accessToken);\n    httpHandle(url, 'POST', {}, data, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n * 获取自定义菜单\n * @param callback\n */\nWeixin.prototype.getCusMenu = function (callback) {\n    var url = this.getCusMenuUrl.replace(/{ACCESS_TOKEN}/g, this.accessToken);\n    httpHandle(url, 'GET', {}, {}, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n * 删除自定义菜单\n * @param callback\n */\nWeixin.prototype.delCusMenu = function (callback) {\n    var url = this.delCusMenuUrl.replace(/{ACCESS_TOKEN}/g, this.accessToken);\n    httpHandle(url, 'GET', {}, {}, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n * 创建二维码\n * @param data\n * 临时二维码： {\"expire_seconds\": 1800, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": 123}}}\n * 永久二维码： {\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": 123}}}\n * @param callback\n */\nWeixin.prototype.createTicket = function (data, callback) {\n    var url = this.createTicketUrl.replace(/{ACCESS_TOKEN}/g, this.accessToken);\n    httpHandle(url, 'POST', {}, data, function (r) {\n        if (callback) {\n            callback(r);\n        }\n    });\n};\n\n/**\n * 获取二维码的地址\n * @param callback\n */\nWeixin.prototype.getTicket = function (ticket, callback) {\n    var url = this.getTicketUrl.replace(/{TICKET}/g, ticket);\n    callback(url);\n};\n\nmodule.exports = Weixin;"]}