node-easywechat 3.1.4 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/build-2.yml +21 -0
- package/.github/workflows/build-3.yml +21 -0
- package/.github/workflows/publish-npm-2.yml +24 -0
- package/.github/workflows/publish-npm-3.yml +24 -0
- package/CHANGELOG.md +15 -0
- package/README.md +23 -2
- package/dist/MiniApp/Application.d.ts +4 -4
- package/dist/OfficialAccount/Application.d.ts +4 -4
- package/dist/OpenPlatform/Application.d.ts +5 -5
- package/dist/OpenPlatform/Application.js +1 -1
- package/dist/OpenWork/Account.d.ts +17 -0
- package/dist/OpenWork/Account.js +30 -0
- package/dist/OpenWork/Application.d.ts +120 -0
- package/dist/OpenWork/Application.js +294 -0
- package/dist/OpenWork/Authorization.d.ts +12 -0
- package/dist/OpenWork/Authorization.js +49 -0
- package/dist/OpenWork/AuthorizerAccessToken.d.ts +38 -0
- package/dist/OpenWork/AuthorizerAccessToken.js +105 -0
- package/dist/OpenWork/Config.d.ts +5 -0
- package/dist/OpenWork/Config.js +19 -0
- package/dist/OpenWork/Contracts/AccountInterface.d.ts +33 -0
- package/dist/OpenWork/Contracts/AccountInterface.js +35 -0
- package/dist/OpenWork/Contracts/ApplicationInterface.d.ts +108 -0
- package/dist/OpenWork/Contracts/ApplicationInterface.js +96 -0
- package/dist/OpenWork/Contracts/SuiteTicketInterface.d.ts +23 -0
- package/dist/OpenWork/Contracts/SuiteTicketInterface.js +25 -0
- package/dist/OpenWork/Encryptor.d.ts +9 -0
- package/dist/OpenWork/Encryptor.js +17 -0
- package/dist/OpenWork/JsApiTicket.d.ts +50 -0
- package/dist/OpenWork/JsApiTicket.js +152 -0
- package/dist/OpenWork/Message.d.ts +78 -0
- package/dist/OpenWork/Message.js +9 -0
- package/dist/OpenWork/ProviderAccessToken.d.ts +26 -0
- package/dist/OpenWork/ProviderAccessToken.js +84 -0
- package/dist/OpenWork/Server.d.ts +103 -0
- package/dist/OpenWork/Server.js +242 -0
- package/dist/OpenWork/SuiteAccessToken.d.ts +28 -0
- package/dist/OpenWork/SuiteAccessToken.js +86 -0
- package/dist/OpenWork/SuiteEncryptor.d.ts +9 -0
- package/dist/OpenWork/SuiteEncryptor.js +17 -0
- package/dist/OpenWork/SuiteTicket.d.ts +13 -0
- package/dist/OpenWork/SuiteTicket.js +49 -0
- package/dist/Pay/Application.d.ts +4 -4
- package/dist/Types/global.d.ts +19 -1
- package/dist/Work/AccessToken.d.ts +26 -0
- package/dist/Work/AccessToken.js +84 -0
- package/dist/Work/Account.d.ts +13 -0
- package/dist/Work/Account.js +25 -0
- package/dist/Work/Application.d.ts +75 -0
- package/dist/Work/Application.js +177 -0
- package/dist/Work/Config.d.ts +5 -0
- package/dist/Work/Config.js +17 -0
- package/dist/Work/Contracts/AccountInterface.d.ts +23 -0
- package/dist/Work/Contracts/AccountInterface.js +25 -0
- package/dist/Work/Contracts/ApplicationInterface.d.ts +87 -0
- package/dist/Work/Contracts/ApplicationInterface.js +76 -0
- package/dist/Work/Encryptor.d.ts +9 -0
- package/dist/Work/Encryptor.js +17 -0
- package/dist/Work/JsApiTicket.d.ts +45 -0
- package/dist/Work/JsApiTicket.js +141 -0
- package/dist/Work/Message.d.ts +142 -0
- package/dist/Work/Message.js +9 -0
- package/dist/Work/Server.d.ts +90 -0
- package/dist/Work/Server.js +212 -0
- package/dist/Work/Utils.d.ts +25 -0
- package/dist/Work/Utils.js +56 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +5 -1
- package/package.json +2 -2
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
const Utils_1 = require("../Core/Support/Utils");
|
|
15
|
+
const AccessToken_1 = __importDefault(require("./AccessToken"));
|
|
16
|
+
class JsApiTicket extends AccessToken_1.default {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.agentKey = null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 获取jsapi_ticket的缓存名称
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
25
|
+
getKey() {
|
|
26
|
+
if (!this.key) {
|
|
27
|
+
this.key = `work.jsapi_ticket.${this.corpId}`;
|
|
28
|
+
}
|
|
29
|
+
return this.key;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 获取签名凭证jsapi_ticket
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
getTicket() {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
let key = this.getKey();
|
|
38
|
+
let ticket = '';
|
|
39
|
+
if (this.cache) {
|
|
40
|
+
ticket = yield this.cache.get(key);
|
|
41
|
+
}
|
|
42
|
+
if (!!ticket && typeof ticket === 'string') {
|
|
43
|
+
return ticket;
|
|
44
|
+
}
|
|
45
|
+
let response = (yield this.httpClient.request('get', '/cgi-bin/get_jsapi_ticket', {})).toObject();
|
|
46
|
+
if (!response['ticket']) {
|
|
47
|
+
throw new Error('Failed to get jssdk_ticket: ' + JSON.stringify(response));
|
|
48
|
+
}
|
|
49
|
+
if (this.cache) {
|
|
50
|
+
yield this.cache.set(key, response['ticket'], parseInt(response['expires_in']));
|
|
51
|
+
}
|
|
52
|
+
return response['ticket'];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 获取签名配置
|
|
57
|
+
* @param url 完整URL地址
|
|
58
|
+
* @param nonce 随机字符串,默认:随机10位
|
|
59
|
+
* @param timestamp 时间长,默认:当前时间
|
|
60
|
+
* @returns
|
|
61
|
+
*/
|
|
62
|
+
createConfigSignature(url, nonce = null, timestamp = null) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
nonce = nonce || (0, Utils_1.randomString)(10);
|
|
65
|
+
timestamp = timestamp || (0, Utils_1.getTimestamp)();
|
|
66
|
+
let ticket = yield this.getTicket();
|
|
67
|
+
return {
|
|
68
|
+
url,
|
|
69
|
+
nonceStr: nonce,
|
|
70
|
+
timestamp,
|
|
71
|
+
appId: this.corpId,
|
|
72
|
+
signature: this.getTicketSignature(ticket, nonce, timestamp, url),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
getTicketSignature(ticket, nonce, timestamp, url) {
|
|
77
|
+
return (0, Utils_1.createHash)(`jsapi_ticket=${ticket}&noncestr=${nonce}×tamp=${timestamp}&url=${url}`, 'sha1');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 获取代理应用的签名配置
|
|
81
|
+
* @param agentId 代理应用的id
|
|
82
|
+
* @param url 完整URL地址
|
|
83
|
+
* @param nonce 随机字符串,默认:随机10位
|
|
84
|
+
* @param timestamp 时间长,默认:当前时间
|
|
85
|
+
* @returns
|
|
86
|
+
*/
|
|
87
|
+
createAgentConfigSignature(agentId, url, nonce = null, timestamp = null) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
nonce = nonce || (0, Utils_1.randomString)(10);
|
|
90
|
+
timestamp = timestamp || (0, Utils_1.getTimestamp)();
|
|
91
|
+
let ticket = yield this.getTicket();
|
|
92
|
+
return {
|
|
93
|
+
corpid: this.corpId,
|
|
94
|
+
agentid: agentId,
|
|
95
|
+
url,
|
|
96
|
+
nonceStr: nonce,
|
|
97
|
+
timestamp,
|
|
98
|
+
signature: this.getTicketSignature(ticket, nonce, timestamp, url),
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取代理应用的签名凭证jsapi_ticket
|
|
104
|
+
* @param agentId 代理应用的id
|
|
105
|
+
* @returns
|
|
106
|
+
*/
|
|
107
|
+
getAgentTicket(agentId) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
let key = this.getAgentKey(agentId);
|
|
110
|
+
let ticket = '';
|
|
111
|
+
if (this.cache) {
|
|
112
|
+
ticket = yield this.cache.get(key);
|
|
113
|
+
}
|
|
114
|
+
if (!!ticket && typeof ticket === 'string') {
|
|
115
|
+
return ticket;
|
|
116
|
+
}
|
|
117
|
+
let response = (yield this.httpClient.request('get', '/cgi-bin/ticket/get', {
|
|
118
|
+
params: {
|
|
119
|
+
type: 'agent_config',
|
|
120
|
+
}
|
|
121
|
+
})).toObject();
|
|
122
|
+
if (!response['ticket']) {
|
|
123
|
+
throw new Error('Failed to get jssdk agentTicket: ' + JSON.stringify(response));
|
|
124
|
+
}
|
|
125
|
+
if (this.cache) {
|
|
126
|
+
yield this.cache.set(key, response['ticket'], parseInt(response['expires_in']));
|
|
127
|
+
}
|
|
128
|
+
return response['ticket'];
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 获取代理应用的jsapi_ticket的缓存名称
|
|
133
|
+
* @param agentId 代理应用的id
|
|
134
|
+
* @returns
|
|
135
|
+
*/
|
|
136
|
+
getAgentKey(agentId) {
|
|
137
|
+
return `${this.getKey()}.${agentId}`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
;
|
|
141
|
+
module.exports = JsApiTicket;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import BaseMessage from '../Core/Message';
|
|
2
|
+
declare class Message extends BaseMessage {
|
|
3
|
+
}
|
|
4
|
+
interface Message extends Record<string, any> {
|
|
5
|
+
/**
|
|
6
|
+
* 消息密文,兼容模式、安全模式才有
|
|
7
|
+
*/
|
|
8
|
+
Encrypt?: string;
|
|
9
|
+
/**
|
|
10
|
+
* 开发者微信号
|
|
11
|
+
*/
|
|
12
|
+
ToUserName?: string;
|
|
13
|
+
/**
|
|
14
|
+
* 发送方帐号 OpenId
|
|
15
|
+
*/
|
|
16
|
+
FromUserName?: string;
|
|
17
|
+
/**
|
|
18
|
+
* 消息创建时间
|
|
19
|
+
*/
|
|
20
|
+
CreateTime?: number;
|
|
21
|
+
/**
|
|
22
|
+
* 消息类型
|
|
23
|
+
* - `event` 事件
|
|
24
|
+
* - `text` 文本
|
|
25
|
+
* - `image` 图片
|
|
26
|
+
* - `voice` 语音
|
|
27
|
+
* - `video` 视频
|
|
28
|
+
* - `location` 地理位置
|
|
29
|
+
* - `link` 链接
|
|
30
|
+
*/
|
|
31
|
+
MsgType?: string;
|
|
32
|
+
/**
|
|
33
|
+
* 事件类型
|
|
34
|
+
* - `change_contact` 通讯录变更事件
|
|
35
|
+
* - `change_chain` 上下游变更事件
|
|
36
|
+
* - `batch_job_result` 上下游异步任务完成事件
|
|
37
|
+
* @scope MsgType='event'
|
|
38
|
+
*/
|
|
39
|
+
Event?: string;
|
|
40
|
+
/**
|
|
41
|
+
* 变更类型
|
|
42
|
+
*
|
|
43
|
+
* 通讯录变更事件:
|
|
44
|
+
* - `create_user` 新增成员
|
|
45
|
+
* - `update_user` 更新成员
|
|
46
|
+
* - `delete_user` 删除成员
|
|
47
|
+
* - `create_party` 新增部门
|
|
48
|
+
* - `update_party` 更新部门
|
|
49
|
+
* - `delete_party` 删除部门
|
|
50
|
+
* - `update_tag` 标签变更
|
|
51
|
+
*
|
|
52
|
+
* 上下游变更事件:
|
|
53
|
+
* - `create_chain` 新增上下游空间
|
|
54
|
+
* - `update_chain` 更新上下游空间
|
|
55
|
+
* - `delete_chain` 删除上下游空间
|
|
56
|
+
* - `create_group` 新增上下游分组
|
|
57
|
+
* - `update_group` 更新上下游空间
|
|
58
|
+
* - `delete_group` 删除上下游空间
|
|
59
|
+
* - `corp_join` 企业加入上下游
|
|
60
|
+
* - `update_corp` 更新加入上下游企业
|
|
61
|
+
* - `remove_corp` 删除上下游企业
|
|
62
|
+
*
|
|
63
|
+
* @scope Event='change_contact' | 'change_chain'
|
|
64
|
+
*/
|
|
65
|
+
ChangeType?: string;
|
|
66
|
+
/**
|
|
67
|
+
* 企业应用的id
|
|
68
|
+
* @scope MsgType='text' | 'image' | 'voice' | 'video' | 'location' | 'link'
|
|
69
|
+
*/
|
|
70
|
+
AgentID?: string;
|
|
71
|
+
/**
|
|
72
|
+
* 消息id,64位整型
|
|
73
|
+
* @scope MsgType='text' | 'image' | 'voice' | 'video' | 'location' | 'link'
|
|
74
|
+
*/
|
|
75
|
+
MsgId?: string;
|
|
76
|
+
/**
|
|
77
|
+
* 文本消息内容
|
|
78
|
+
* @scope MsgType='text'
|
|
79
|
+
*/
|
|
80
|
+
Content?: string;
|
|
81
|
+
/**
|
|
82
|
+
* 图片链接
|
|
83
|
+
* @scope MsgType='image' | 'link'
|
|
84
|
+
*/
|
|
85
|
+
PicUrl?: string;
|
|
86
|
+
/**
|
|
87
|
+
* 媒体id,可以调用获取临时素材接口拉取数据
|
|
88
|
+
* @scope MsgType='image' | 'voice' | 'video'
|
|
89
|
+
*/
|
|
90
|
+
MediaId?: string;
|
|
91
|
+
/**
|
|
92
|
+
* 语音格式,如amr,speex等
|
|
93
|
+
* @scope MsgType='voice'
|
|
94
|
+
*/
|
|
95
|
+
Format?: string;
|
|
96
|
+
/**
|
|
97
|
+
* 缩略图的媒体id
|
|
98
|
+
* @scope MsgType='video'
|
|
99
|
+
*/
|
|
100
|
+
ThumbMediaId?: string;
|
|
101
|
+
/**
|
|
102
|
+
* 纬度
|
|
103
|
+
* @scope MsgType='location'
|
|
104
|
+
*/
|
|
105
|
+
Location_X?: number;
|
|
106
|
+
/**
|
|
107
|
+
* 经度
|
|
108
|
+
* @scope MsgType='location'
|
|
109
|
+
*/
|
|
110
|
+
Location_Y?: number;
|
|
111
|
+
/**
|
|
112
|
+
* 地图缩放大小
|
|
113
|
+
* @scope MsgType='location'
|
|
114
|
+
*/
|
|
115
|
+
Scale?: number;
|
|
116
|
+
/**
|
|
117
|
+
* 地理位置信息
|
|
118
|
+
* @scope MsgType='location'
|
|
119
|
+
*/
|
|
120
|
+
Label?: number;
|
|
121
|
+
/**
|
|
122
|
+
* app类型,在企业微信固定返回wxwork,在微信不返回该字段
|
|
123
|
+
* @scope MsgType='location'
|
|
124
|
+
*/
|
|
125
|
+
AppType?: number;
|
|
126
|
+
/**
|
|
127
|
+
* 消息标题
|
|
128
|
+
* @scope MsgType='link'
|
|
129
|
+
*/
|
|
130
|
+
Title?: string;
|
|
131
|
+
/**
|
|
132
|
+
* 消息描述
|
|
133
|
+
* @scope MsgType='link'
|
|
134
|
+
*/
|
|
135
|
+
Description?: string;
|
|
136
|
+
/**
|
|
137
|
+
* 消息链接
|
|
138
|
+
* @scope MsgType='link'
|
|
139
|
+
*/
|
|
140
|
+
Url?: string;
|
|
141
|
+
}
|
|
142
|
+
export = Message;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
const Message_1 = __importDefault(require("../Core/Message"));
|
|
6
|
+
class Message extends Message_1.default {
|
|
7
|
+
}
|
|
8
|
+
;
|
|
9
|
+
module.exports = Message;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import ServerRequestInterface from '../Core/Http/Contracts/ServerRequestInterface';
|
|
2
|
+
import Encryptor from '../Core/Encryptor';
|
|
3
|
+
import ServerInterface from '../Core/Contracts/ServerInterface';
|
|
4
|
+
import Response from '../Core/Http/Response';
|
|
5
|
+
import Message from './Message';
|
|
6
|
+
import { ServerEventType, ServerHandlerClosure, ServerMessageType } from '../Types/global';
|
|
7
|
+
declare class Server extends ServerInterface {
|
|
8
|
+
protected encryptor: Encryptor;
|
|
9
|
+
protected request: ServerRequestInterface;
|
|
10
|
+
constructor(encryptor: Encryptor, request?: ServerRequestInterface);
|
|
11
|
+
/**
|
|
12
|
+
* 服务端消息处理
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
serve(): Promise<Response>;
|
|
16
|
+
/**
|
|
17
|
+
* 设置联系人变化的消息处理器
|
|
18
|
+
* @param handler
|
|
19
|
+
*/
|
|
20
|
+
handleContactChanged(handler: ServerHandlerClosure): this;
|
|
21
|
+
/**
|
|
22
|
+
* 设置用户标签变化的消息处理器
|
|
23
|
+
* @param handler
|
|
24
|
+
*/
|
|
25
|
+
handleUserTagUpdated(handler: ServerHandlerClosure): this;
|
|
26
|
+
/**
|
|
27
|
+
* 设置用户创建的消息处理器
|
|
28
|
+
* @param handler
|
|
29
|
+
*/
|
|
30
|
+
handleUserCreated(handler: ServerHandlerClosure): this;
|
|
31
|
+
/**
|
|
32
|
+
* 设置用户更新的消息处理器
|
|
33
|
+
* @param handler
|
|
34
|
+
*/
|
|
35
|
+
handleUserUpdated(handler: ServerHandlerClosure): this;
|
|
36
|
+
/**
|
|
37
|
+
* 设置用户删除的消息处理器
|
|
38
|
+
* @param handler
|
|
39
|
+
*/
|
|
40
|
+
handleUserDeleted(handler: ServerHandlerClosure): this;
|
|
41
|
+
/**
|
|
42
|
+
* 设置部门创建的消息处理器
|
|
43
|
+
* @param handler
|
|
44
|
+
*/
|
|
45
|
+
handlePartyCreated(handler: ServerHandlerClosure): this;
|
|
46
|
+
/**
|
|
47
|
+
* 设置部门更新的消息处理器
|
|
48
|
+
* @param handler
|
|
49
|
+
*/
|
|
50
|
+
handlePartyUpdated(handler: ServerHandlerClosure): this;
|
|
51
|
+
/**
|
|
52
|
+
* 设置部门删除的消息处理器
|
|
53
|
+
* @param handler
|
|
54
|
+
*/
|
|
55
|
+
handlePartyDeleted(handler: ServerHandlerClosure): this;
|
|
56
|
+
/**
|
|
57
|
+
* 设置异步任务完成的消息处理器
|
|
58
|
+
* @param handler
|
|
59
|
+
*/
|
|
60
|
+
handleBatchJobsFinished(handler: ServerHandlerClosure): this;
|
|
61
|
+
/**
|
|
62
|
+
* 添加普通消息处理器
|
|
63
|
+
* @param type
|
|
64
|
+
* @param handler
|
|
65
|
+
* @returns
|
|
66
|
+
*/
|
|
67
|
+
addMessageListener(type: ServerMessageType, handler: ServerHandlerClosure): this;
|
|
68
|
+
/**
|
|
69
|
+
* 添加事件消息处理器
|
|
70
|
+
* @param event
|
|
71
|
+
* @param handler
|
|
72
|
+
* @returns
|
|
73
|
+
*/
|
|
74
|
+
addEventListener(event: ServerEventType, handler: ServerHandlerClosure): this;
|
|
75
|
+
/**
|
|
76
|
+
* 获取来自微信服务器的推送消息
|
|
77
|
+
* @param request 未设置该参数时,则从当前服务端收到的请求中获取
|
|
78
|
+
* @returns
|
|
79
|
+
*/
|
|
80
|
+
getRequestMessage(request?: ServerRequestInterface): Promise<Message>;
|
|
81
|
+
protected validateUrl(): (message: Message, next: ServerHandlerClosure) => Promise<Response>;
|
|
82
|
+
protected decryptRequestMessage(query: Record<string, any>): ServerHandlerClosure;
|
|
83
|
+
/**
|
|
84
|
+
* 获取解密后的消息
|
|
85
|
+
* @param request 未设置该参数时,则从当前服务端收到的请求中获取
|
|
86
|
+
* @returns
|
|
87
|
+
*/
|
|
88
|
+
getDecryptedMessage(request?: ServerRequestInterface): Promise<import("../Core/Message")>;
|
|
89
|
+
}
|
|
90
|
+
export = Server;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
const ServerInterface_1 = __importDefault(require("../Core/Contracts/ServerInterface"));
|
|
15
|
+
const Response_1 = __importDefault(require("../Core/Http/Response"));
|
|
16
|
+
const Message_1 = __importDefault(require("./Message"));
|
|
17
|
+
class Server extends ServerInterface_1.default {
|
|
18
|
+
constructor(encryptor, request = null) {
|
|
19
|
+
super();
|
|
20
|
+
this.encryptor = encryptor;
|
|
21
|
+
this.request = request;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 服务端消息处理
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
serve() {
|
|
28
|
+
var _a, _b, _c;
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
let query = this.request.getQueryParams();
|
|
31
|
+
if (!!query['echostr']) {
|
|
32
|
+
let echostr = this.encryptor.decrypt(query['echostr'], (_a = query['msg_signature']) !== null && _a !== void 0 ? _a : '', (_b = query['nonce']) !== null && _b !== void 0 ? _b : '', (_c = query['timestamp']) !== null && _c !== void 0 ? _c : '');
|
|
33
|
+
return new Response_1.default(200, { 'Content-Type': 'text/html' }, echostr);
|
|
34
|
+
}
|
|
35
|
+
let message = yield this.getRequestMessage(this.request);
|
|
36
|
+
this.prepend(this.decryptRequestMessage(query));
|
|
37
|
+
let response = yield this.handle(new Response_1.default(200, {}, 'SUCCESS'), message);
|
|
38
|
+
if (!(response instanceof Response_1.default)) {
|
|
39
|
+
response = yield this.transformToReply(response, message, this.encryptor);
|
|
40
|
+
}
|
|
41
|
+
return response;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 设置联系人变化的消息处理器
|
|
46
|
+
* @param handler
|
|
47
|
+
*/
|
|
48
|
+
handleContactChanged(handler) {
|
|
49
|
+
return this.with(function (message, next) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
return message.Event === 'change_contact' ? handler(message, next) : next(message);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 设置用户标签变化的消息处理器
|
|
57
|
+
* @param handler
|
|
58
|
+
*/
|
|
59
|
+
handleUserTagUpdated(handler) {
|
|
60
|
+
return this.with(function (message, next) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
return message.Event === 'change_contact' && message.ChangeType === 'update_tag' ? handler(message, next) : next(message);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 设置用户创建的消息处理器
|
|
68
|
+
* @param handler
|
|
69
|
+
*/
|
|
70
|
+
handleUserCreated(handler) {
|
|
71
|
+
return this.with(function (message, next) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
return message.Event === 'change_contact' && message.ChangeType === 'create_user' ? handler(message, next) : next(message);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 设置用户更新的消息处理器
|
|
79
|
+
* @param handler
|
|
80
|
+
*/
|
|
81
|
+
handleUserUpdated(handler) {
|
|
82
|
+
return this.with(function (message, next) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
return message.Event === 'change_contact' && message.ChangeType === 'update_user' ? handler(message, next) : next(message);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 设置用户删除的消息处理器
|
|
90
|
+
* @param handler
|
|
91
|
+
*/
|
|
92
|
+
handleUserDeleted(handler) {
|
|
93
|
+
return this.with(function (message, next) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
return message.Event === 'change_contact' && message.ChangeType === 'delete_user' ? handler(message, next) : next(message);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 设置部门创建的消息处理器
|
|
101
|
+
* @param handler
|
|
102
|
+
*/
|
|
103
|
+
handlePartyCreated(handler) {
|
|
104
|
+
return this.with(function (message, next) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
return message.Event === 'change_contact' && message.ChangeType === 'create_party' ? handler(message, next) : next(message);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 设置部门更新的消息处理器
|
|
112
|
+
* @param handler
|
|
113
|
+
*/
|
|
114
|
+
handlePartyUpdated(handler) {
|
|
115
|
+
return this.with(function (message, next) {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
+
return message.Event === 'change_contact' && message.ChangeType === 'update_party' ? handler(message, next) : next(message);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 设置部门删除的消息处理器
|
|
123
|
+
* @param handler
|
|
124
|
+
*/
|
|
125
|
+
handlePartyDeleted(handler) {
|
|
126
|
+
return this.with(function (message, next) {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
return message.Event === 'change_contact' && message.ChangeType === 'delete_party' ? handler(message, next) : next(message);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 设置异步任务完成的消息处理器
|
|
134
|
+
* @param handler
|
|
135
|
+
*/
|
|
136
|
+
handleBatchJobsFinished(handler) {
|
|
137
|
+
return this.with(function (message, next) {
|
|
138
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
+
return message.Event === 'batch_job_result' ? handler(message, next) : next(message);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 添加普通消息处理器
|
|
145
|
+
* @param type
|
|
146
|
+
* @param handler
|
|
147
|
+
* @returns
|
|
148
|
+
*/
|
|
149
|
+
addMessageListener(type, handler) {
|
|
150
|
+
return this.withHandler(function (message, next) {
|
|
151
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
+
return message.MsgType === type ? handler(message, next) : next(message);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 添加事件消息处理器
|
|
158
|
+
* @param event
|
|
159
|
+
* @param handler
|
|
160
|
+
* @returns
|
|
161
|
+
*/
|
|
162
|
+
addEventListener(event, handler) {
|
|
163
|
+
return this.withHandler(function (message, next) {
|
|
164
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
165
|
+
return message.Event === event ? handler(message, next) : next(message);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* 获取来自微信服务器的推送消息
|
|
171
|
+
* @param request 未设置该参数时,则从当前服务端收到的请求中获取
|
|
172
|
+
* @returns
|
|
173
|
+
*/
|
|
174
|
+
getRequestMessage(request = null) {
|
|
175
|
+
return Message_1.default.createFromRequest(request !== null && request !== void 0 ? request : this.request);
|
|
176
|
+
}
|
|
177
|
+
validateUrl() {
|
|
178
|
+
return (message, next) => __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
var _a, _b, _c;
|
|
180
|
+
let query = this.request.getQueryParams();
|
|
181
|
+
if (!this.encryptor)
|
|
182
|
+
return null;
|
|
183
|
+
let echostr = this.encryptor.decrypt(query['echostr'], (_a = query['msg_signature']) !== null && _a !== void 0 ? _a : '', (_b = query['timestamp']) !== null && _b !== void 0 ? _b : '', (_c = query['nonce']) !== null && _c !== void 0 ? _c : '');
|
|
184
|
+
return new Response_1.default(200, { 'Content-Type': 'text/html' }, echostr);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
decryptRequestMessage(query) {
|
|
188
|
+
return (message, next) => __awaiter(this, void 0, void 0, function* () {
|
|
189
|
+
var _a, _b, _c;
|
|
190
|
+
if (!this.encryptor)
|
|
191
|
+
return null;
|
|
192
|
+
yield this.decryptMessage(message, this.encryptor, (_a = query['msg_signature']) !== null && _a !== void 0 ? _a : '', (_b = query['timestamp']) !== null && _b !== void 0 ? _b : '', (_c = query['nonce']) !== null && _c !== void 0 ? _c : '');
|
|
193
|
+
return next(message);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 获取解密后的消息
|
|
198
|
+
* @param request 未设置该参数时,则从当前服务端收到的请求中获取
|
|
199
|
+
* @returns
|
|
200
|
+
*/
|
|
201
|
+
getDecryptedMessage(request = null) {
|
|
202
|
+
var _a, _b, _c;
|
|
203
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
204
|
+
request = request !== null && request !== void 0 ? request : this.request;
|
|
205
|
+
let message = yield this.getRequestMessage(request);
|
|
206
|
+
let query = request.getQueryParams();
|
|
207
|
+
return yield this.decryptMessage(message, this.encryptor, (_a = query['msg_signature']) !== null && _a !== void 0 ? _a : '', (_b = query['timestamp']) !== null && _b !== void 0 ? _b : '', (_c = query['nonce']) !== null && _c !== void 0 ? _c : '');
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
;
|
|
212
|
+
module.exports = Server;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Application from './Application';
|
|
2
|
+
declare class Utils {
|
|
3
|
+
protected app: Application;
|
|
4
|
+
constructor(app: Application);
|
|
5
|
+
/**
|
|
6
|
+
* 构建jssdk配置
|
|
7
|
+
* @param url 完整URL地址
|
|
8
|
+
* @param jsApiList api列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#63
|
|
9
|
+
* @param openTagList 开放标签列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#附录-所有开放标签列表
|
|
10
|
+
* @param debug 是否开启调试模式,默认:false
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
buildJsSdkConfig(url: string, jsApiList?: string[], openTagList?: string[], debug?: boolean): Promise<Record<string, any>>;
|
|
14
|
+
/**
|
|
15
|
+
* 构建代理应用的jssdk配置
|
|
16
|
+
* @param agentId 代理应用id
|
|
17
|
+
* @param url 完整URL地址
|
|
18
|
+
* @param jsApiList api列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#63
|
|
19
|
+
* @param openTagList 开放标签列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#附录-所有开放标签列表
|
|
20
|
+
* @param debug 是否开启调试模式,默认:false
|
|
21
|
+
* @returns
|
|
22
|
+
*/
|
|
23
|
+
buildJsSdkAgentConfig(agentId: number, url: string, jsApiList?: string[], openTagList?: string[], debug?: boolean): Promise<Record<string, any>>;
|
|
24
|
+
}
|
|
25
|
+
export = Utils;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
const merge_1 = __importDefault(require("merge"));
|
|
15
|
+
class Utils {
|
|
16
|
+
constructor(app) {
|
|
17
|
+
this.app = app;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 构建jssdk配置
|
|
21
|
+
* @param url 完整URL地址
|
|
22
|
+
* @param jsApiList api列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#63
|
|
23
|
+
* @param openTagList 开放标签列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#附录-所有开放标签列表
|
|
24
|
+
* @param debug 是否开启调试模式,默认:false
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
buildJsSdkConfig(url, jsApiList = [], openTagList = [], debug = false) {
|
|
28
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
return (0, merge_1.default)({
|
|
30
|
+
jsApiList,
|
|
31
|
+
openTagList,
|
|
32
|
+
debug,
|
|
33
|
+
}, yield this.app.getTicket().createConfigSignature(url));
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 构建代理应用的jssdk配置
|
|
38
|
+
* @param agentId 代理应用id
|
|
39
|
+
* @param url 完整URL地址
|
|
40
|
+
* @param jsApiList api列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#63
|
|
41
|
+
* @param openTagList 开放标签列表,默认:[]。可用列表:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#附录-所有开放标签列表
|
|
42
|
+
* @param debug 是否开启调试模式,默认:false
|
|
43
|
+
* @returns
|
|
44
|
+
*/
|
|
45
|
+
buildJsSdkAgentConfig(agentId, url, jsApiList = [], openTagList = [], debug = false) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
return (0, merge_1.default)({
|
|
48
|
+
jsApiList,
|
|
49
|
+
openTagList,
|
|
50
|
+
debug,
|
|
51
|
+
}, yield this.app.getTicket().createAgentConfigSignature(agentId, url));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
;
|
|
56
|
+
module.exports = Utils;
|