@tnwx/wxcp
Version:
TNWX 微信系开发脚手架之极速开发企业微信/企业号
231 lines • 10.9 kB
JavaScript
;
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 + '×tamp=' + 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