UNPKG

@tnwx/wxcp

Version:

TNWX 微信系开发脚手架之极速开发企业微信/企业号

231 lines 10.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const accesstoken_1 = require("@tnwx/accesstoken"); const xml2js_1 = require("xml2js"); const commons_1 = require("@tnwx/commons"); const kits_1 = require("@tnwx/kits"); /** * @author Javen * @copyright javendev@126.com * @description 处理企业微信消息以及事件 */ class QyWeChat { /** * JSSDK签名 * @param nonce_str 随机字符串 * @param timestamp 时间戳 * @param url 当前网页的URL, 不包含#及其后面部分 * @param type QyJsApiType * @param jsapi_ticket jsapi_ticket */ static jssdkSignature(nonce_str, timestamp, url, type, jsapi_ticket) { return __awaiter(this, void 0, void 0, function* () { if (!jsapi_ticket) { let jsTicket = yield commons_1.QyJsTicketApi.getTicket(type); if (jsTicket) { jsapi_ticket = jsTicket.getTicket; if (accesstoken_1.QyApiConfigKit.isDevMode()) { console.debug('jsapi_ticket:', jsapi_ticket); } } } let str = 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + nonce_str + '&timestamp=' + timestamp + '&url=' + url; return kits_1.Kits.sha1(str); }); } /** * 验证成为开发者 * @param signature * @param timestamp * @param nonce * @param echostr */ static checkSignature(signature, timestamp, nonce, echostr) { let cryptoKit = new commons_1.CryptoKit(accesstoken_1.QyApiConfigKit.getApiConfig, signature, timestamp, nonce); try { return cryptoKit.decrypt(echostr); } catch (error) { return '签名异常'; } } /** * 处理消息 * @param msgAdapter * @param msgXml * @param msgSignature * @param timestamp * @param nonce */ static handleMsg(msgAdapter, msgXml, msgSignature, timestamp, nonce) { let cryptoKit; return new Promise(function (resolve, reject) { xml2js_1.parseString(msgXml, { explicitArray: false }, (err, result) => __awaiter(this, void 0, void 0, function* () { if (err) { reject(`xml 数据解析错误:${err}`); console.debug(err); return; } result = result.xml; let isEncrypt = true; cryptoKit = new commons_1.CryptoKit(accesstoken_1.QyApiConfigKit.getApiConfig, msgSignature, timestamp, nonce); // 对加密数据解密 result = cryptoKit.decryptMsg(result.Encrypt); if (accesstoken_1.QyApiConfigKit.isDevMode()) { console.debug('接收消息:\n'); console.debug(result); console.debug('------------------------\n'); } let inMsg = commons_1.InMsgParser.parse(result); let responseMsg; let outMsg; // 处理接收的消息 if (inMsg instanceof commons_1.InTextMsg) { outMsg = yield msgAdapter.processInTextMsg(inMsg); } else if (inMsg instanceof commons_1.InImageMsg) { outMsg = yield msgAdapter.processInImageMsg(inMsg); } else if (inMsg instanceof commons_1.InLinkMsg) { outMsg = yield msgAdapter.processInLinkMsg(inMsg); } else if (inMsg instanceof commons_1.InLocationMsg) { outMsg = yield msgAdapter.processInLocationMsg(inMsg); } else if (inMsg instanceof commons_1.InShortVideoMsg) { outMsg = yield msgAdapter.processInShortVideoMsg(inMsg); } else if (inMsg instanceof commons_1.InVideoMsg) { outMsg = yield msgAdapter.processInVideoMsg(inMsg); } else if (inMsg instanceof commons_1.InVoiceMsg) { outMsg = yield msgAdapter.processInVoiceMsg(inMsg); } else if (inMsg instanceof commons_1.InVoiceMsg) { outMsg = yield msgAdapter.processInVoiceMsg(inMsg); } else if (inMsg instanceof commons_1.InSpeechRecognitionResults) { outMsg = yield msgAdapter.processInSpeechRecognitionResults(inMsg); } else if (inMsg instanceof commons_1.InFollowEvent) { outMsg = yield msgAdapter.processInFollowEvent(inMsg); } else if (inMsg instanceof commons_1.InLocationEvent) { outMsg = yield msgAdapter.processInLocationEvent(inMsg); } else if (inMsg instanceof commons_1.InMenuEvent) { outMsg = yield msgAdapter.processInMenuEvent(inMsg); } else if (inMsg instanceof commons_1.InQrCodeEvent) { outMsg = yield msgAdapter.processInQrCodeEvent(inMsg); } else if (inMsg instanceof commons_1.InTemplateMsgEvent) { outMsg = yield msgAdapter.processInTemplateMsgEvent(inMsg); } else if (inMsg instanceof commons_1.InShakearoundUserShakeEvent) { outMsg = yield msgAdapter.processInShakearoundUserShakeEvent(inMsg); } else if (inMsg instanceof commons_1.InTaskEvent) { outMsg = yield msgAdapter.processInTaskEvent(inMsg); } else if (inMsg instanceof commons_1.InEnterAgentEvent) { outMsg = yield msgAdapter.processInEnterAgentEvent(inMsg); } else if (inMsg instanceof commons_1.InBatchJobResultEvent) { outMsg = yield msgAdapter.processInBatchJobResultEvent(inMsg); } else if (inMsg instanceof commons_1.InUpdateUserEvent) { outMsg = yield msgAdapter.processInUpdateUserEvent(inMsg); } else if (inMsg instanceof commons_1.InUpdatePartyEvent) { outMsg = yield msgAdapter.processInUpdatePartyEvent(inMsg); } else if (inMsg instanceof commons_1.InUpdateTagEvent) { outMsg = yield msgAdapter.processInUpdateTagEvent(inMsg); } else if (inMsg instanceof commons_1.InSuiteTicket) { isEncrypt = false; outMsg = yield msgAdapter.processInSuiteTicket(inMsg); } else if (inMsg instanceof commons_1.InAuthEvent) { isEncrypt = false; outMsg = yield msgAdapter.processInAuthEvent(inMsg); } else if (inMsg instanceof commons_1.InBatchJobResult) { isEncrypt = false; outMsg = yield msgAdapter.processInBatchJobResult(inMsg); } else if (inMsg instanceof commons_1.InExternalContact) { isEncrypt = false; outMsg = yield msgAdapter.processInExternalContact(inMsg); } else if (inMsg instanceof commons_1.InExternalContactEvent) { isEncrypt = false; outMsg = yield msgAdapter.processInExternalContactEvent(inMsg); } else if (inMsg instanceof commons_1.InRegisterCorp) { isEncrypt = false; outMsg = yield msgAdapter.processInRegisterCorp(inMsg); } else if (inMsg instanceof commons_1.InNotDefinedMsg) { if (accesstoken_1.QyApiConfigKit.isDevMode()) { console.debug(`未能识别的消息类型。消息 xml 内容为:\n ${result}`); } outMsg = yield msgAdapter.processIsNotDefinedMsg(inMsg); } // 处理发送的消息 if (outMsg instanceof commons_1.OutTextMsg) { let outTextMsg = outMsg; if (outTextMsg.getContent.trim()) { responseMsg = outTextMsg.toXml(); } else { responseMsg = 'success'; } } else if (outMsg instanceof commons_1.OutImageMsg) { responseMsg = outMsg.toXml(); } else if (outMsg instanceof commons_1.OutMusicMsg) { responseMsg = outMsg.toXml(); } else if (outMsg instanceof commons_1.OutNewsMsg) { responseMsg = outMsg.toXml(); } else if (outMsg instanceof commons_1.OutVideoMsg) { responseMsg = outMsg.toXml(); } else if (outMsg instanceof commons_1.OutVoiceMsg) { responseMsg = outMsg.toXml(); } else if (outMsg instanceof commons_1.OutCustomMsg) { responseMsg = outMsg.toXml(); } else if (typeof outMsg === 'string') { responseMsg = outMsg; } if (isEncrypt) { //判断消息加解密方式,如果未加密则使用明文,对明文消息进行加密 responseMsg = cryptoKit.encryptMsg(responseMsg); } if (accesstoken_1.QyApiConfigKit.isDevMode()) { console.debug(`发送消息:\n ${responseMsg}`); console.debug('--------------------------\n'); } //返回给微信服务器 resolve(responseMsg); })); }); } } exports.QyWeChat = QyWeChat; //# sourceMappingURL=QyWeChat.js.map