UNPKG

16.6 kBJavaScriptView Raw
1'use strict';
2
3var util = require('./util');
4var wrapper = util.wrapper;
5var postJSON = util.postJSON;
6
7/**
8 * 上传多媒体文件,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
9 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
10 * Examples:
11 * ```
12 * api.uploadNews(news, callback);
13 * ```
14 * News:
15 * ```
16 * {
17 * "articles": [
18 * {
19 * "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
20 * "author":"xxx",
21 * "title":"Happy Day",
22 * "content_source_url":"www.qq.com",
23 * "content":"content",
24 * "digest":"digest",
25 * "show_cover_pic":"1"
26 * },
27 * {
28 * "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
29 * "author":"xxx",
30 * "title":"Happy Day",
31 * "content_source_url":"www.qq.com",
32 * "content":"content",
33 * "digest":"digest",
34 * "show_cover_pic":"0"
35 * }
36 * ]
37 * }
38 * ```
39 * Callback:
40 *
41 * - `err`, 调用失败时得到的异常
42 * - `result`, 调用正常时得到的对象
43 *
44 * Result:
45 * ```
46 * {
47 * "type":"news",
48 * "media_id":"CsEf3ldqkAYJAU6EJeIkStVDSvffUJ54vqbThMgplD-VJXXof6ctX5fI6-aYyUiQ",
49 * "created_at":1391857799
50 * }
51 * ```
52 *
53 * @param {Object} news 图文消息对象
54 * @param {Function} callback 回调函数
55 */
56exports.uploadNews = function (news, callback) {
57 this.preRequest(this._uploadNews, arguments);
58};
59
60/*!
61 * 上传图文消息的未封装版本
62 */
63exports._uploadNews = function (news, callback) {
64 // https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN
65 var url = this.endpoint + '/cgi-bin/media/uploadnews?access_token=' + this.token.accessToken;
66 this.request(url, postJSON(news), wrapper(callback));
67};
68
69/**
70 * 将通过上传下载多媒体文件得到的视频media_id变成视频素材
71 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
72 * Examples:
73 * ```
74 * api.uploadMPVideo(opts, callback);
75 * ```
76 * Opts:
77 * ```
78 * {
79 * "media_id": "rF4UdIMfYK3efUfyoddYRMU50zMiRmmt_l0kszupYh_SzrcW5Gaheq05p_lHuOTQ",
80 * "title": "TITLE",
81 * "description": "Description"
82 * }
83 * ```
84 * Callback:
85 *
86 * - `err`, 调用失败时得到的异常
87 * - `result`, 调用正常时得到的对象
88 *
89 * Result:
90 * ```
91 * {
92 * "type":"video",
93 * "media_id":"IhdaAQXuvJtGzwwc0abfXnzeezfO0NgPK6AQYShD8RQYMTtfzbLdBIQkQziv2XJc",
94 * "created_at":1391857799
95 * }
96 * ```
97 *
98 * @param {Object} opts 待上传为素材的视频
99 * @param {Function} callback 回调函数
100 */
101exports.uploadMPVideo = function (opts, callback) {
102 this.preRequest(this._uploadMPVideo, arguments);
103};
104
105/*!
106 * 上传视频消息的未封装版本
107 */
108exports._uploadMPVideo = function (opts, callback) {
109 // https://file.api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token=ACCESS_TOKEN
110 var url = this.fileServerPrefix + 'media/uploadvideo?access_token=' + this.token.accessToken;
111 this.request(url, postJSON(opts), wrapper(callback));
112};
113
114/**
115 * 群发消息,分别有图文(news)、文本(text)、语音(voice)、图片(image)和视频(video)
116 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
117 * Examples:
118 * ```
119 * api.massSend(opts, receivers, callback);
120 * ```
121 * opts:
122 * ```
123 * {
124 * "image":{
125 * "media_id":"123dsdajkasd231jhksad"
126 * },
127 * "msgtype":"image"
128 * }
129 * ```
130 * Callback:
131 *
132 * - `err`, 调用失败时得到的异常
133 * - `result`, 调用正常时得到的对象
134 *
135 * Result:
136 * ```
137 * {
138 * "errcode":0,
139 * "errmsg":"send job submission success",
140 * "msg_id":34182
141 * }
142 * ```
143 *
144 * @param {Object} opts 待发送的数据
145 * @param {String|Array} receivers 接收人。一个组,或者openid列表
146 * @param {Function} callback 回调函数
147 */
148exports.massSend = function (opts, receivers, callback) {
149 this.preRequest(this._massSend, arguments);
150};
151
152/*!
153 * 群发消息的未封装版本
154 */
155exports._massSend = function (opts, receivers, callback) {
156 var url;
157 if (Array.isArray(receivers)) {
158 opts.touser = receivers;
159 url = this.endpoint + '/cgi-bin/message/mass/send?access_token=' + this.token.accessToken;
160 } else {
161 if (typeof receivers === 'boolean') {
162 opts.filter = {
163 'is_to_all': receivers
164 };
165 } else {
166 opts.filter = {
167 'group_id': receivers
168 };
169 }
170 url = this.endpoint + '/cgi-bin/message/mass/sendall?access_token=' + this.token.accessToken;
171 }
172 // https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN
173 this.request(url, postJSON(opts), wrapper(callback));
174};
175
176/**
177 * 群发图文(news)消息
178 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
179 * Examples:
180 * ```
181 * api.massSendNews(mediaId, receivers, callback);
182 * ```
183 * Callback:
184 *
185 * - `err`, 调用失败时得到的异常
186 * - `result`, 调用正常时得到的对象
187 *
188 * Result:
189 * ```
190 * {
191 * "errcode":0,
192 * "errmsg":"send job submission success",
193 * "msg_id":34182
194 * }
195 * ```
196 *
197 * @param {String} mediaId 图文消息的media id
198 * @param {String|Array|Boolean} receivers 接收人。一个组,或者openid列表, 或者true(群发给所有人)
199 * @param {Function} callback 回调函数
200 */
201exports.massSendNews = function (mediaId, receivers, callback) {
202 var opts = {
203 'mpnews': {
204 'media_id': mediaId
205 },
206 'msgtype': 'mpnews'
207 };
208 this.massSend(opts, receivers, callback);
209};
210
211/**
212 * 群发文字(text)消息
213 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
214 * Examples:
215 * ```
216 * api.massSendText(content, receivers, callback);
217 * ```
218 * Callback:
219 *
220 * - `err`, 调用失败时得到的异常
221 * - `result`, 调用正常时得到的对象
222 *
223 * Result:
224 * ```
225 * {
226 * "errcode":0,
227 * "errmsg":"send job submission success",
228 * "msg_id":34182
229 * }
230 * ```
231 *
232 * @param {String} content 文字消息内容
233 * @param {String|Array} receivers 接收人。一个组,或者openid列表
234 * @param {Function} callback 回调函数
235 */
236exports.massSendText = function (content, receivers, callback) {
237 var opts = {
238 'text': {
239 'content': content
240 },
241 'msgtype': 'text'
242 };
243 this.massSend(opts, receivers, callback);
244};
245
246/**
247 * 群发声音(voice)消息
248 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
249 * Examples:
250 * ```
251 * api.massSendVoice(media_id, receivers, callback);
252 * ```
253 * Callback:
254 *
255 * - `err`, 调用失败时得到的异常
256 * - `result`, 调用正常时得到的对象
257 *
258 * Result:
259 * ```
260 * {
261 * "errcode":0,
262 * "errmsg":"send job submission success",
263 * "msg_id":34182
264 * }
265 * ```
266 *
267 * @param {String} mediaId 声音media id
268 * @param {String|Array} receivers 接收人。一个组,或者openid列表
269 * @param {Function} callback 回调函数
270 */
271exports.massSendVoice = function (mediaId, receivers, callback) {
272 var opts = {
273 'voice': {
274 'media_id': mediaId
275 },
276 'msgtype': 'voice'
277 };
278 this.massSend(opts, receivers, callback);
279};
280
281/**
282 * 群发图片(image)消息
283 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
284 * Examples:
285 * ```
286 * api.massSendImage(media_id, receivers, callback);
287 * ```
288 * Callback:
289 *
290 * - `err`, 调用失败时得到的异常
291 * - `result`, 调用正常时得到的对象
292 *
293 * Result:
294 * ```
295 * {
296 * "errcode":0,
297 * "errmsg":"send job submission success",
298 * "msg_id":34182
299 * }
300 * ```
301 *
302 * @param {String} mediaId 图片media id
303 * @param {String|Array} receivers 接收人。一个组,或者openid列表
304 * @param {Function} callback 回调函数
305 */
306exports.massSendImage = function (mediaId, receivers, callback) {
307 var opts = {
308 'image': {
309 'media_id': mediaId
310 },
311 'msgtype': 'image'
312 };
313 this.massSend(opts, receivers, callback);
314};
315
316/**
317 * 群发视频(video)消息
318 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
319 * Examples:
320 * ```
321 * api.massSendVideo(mediaId, receivers, callback);
322 * ```
323 * Callback:
324 *
325 * - `err`, 调用失败时得到的异常
326 * - `result`, 调用正常时得到的对象
327 *
328 * Result:
329 * ```
330 * {
331 * "errcode":0,
332 * "errmsg":"send job submission success",
333 * "msg_id":34182
334 * }
335 * ```
336 *
337 * @param {String} mediaId 视频media id
338 * @param {String|Array} receivers 接收人。一个组,或者openid列表
339 * @param {Function} callback 回调函数
340 */
341exports.massSendVideo = function (mediaId, receivers, callback) {
342 var opts = {
343 'mpvideo': {
344 'media_id': mediaId
345 },
346 'msgtype': 'mpvideo'
347 };
348 this.massSend(opts, receivers, callback);
349};
350
351/**
352 * 群发视频(video)消息,直接通过上传文件得到的media id进行群发(自动生成素材)
353 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
354 * Examples:
355 * ```
356 * api.massSendMPVideo(data, receivers, callback);
357 * ```
358 * Data:
359 * ```
360 * {
361 * "media_id": "rF4UdIMfYK3efUfyoddYRMU50zMiRmmt_l0kszupYh_SzrcW5Gaheq05p_lHuOTQ",
362 * "title": "TITLE",
363 * "description": "Description"
364 * }
365 * ```
366 * Callback:
367 *
368 * - `err`, 调用失败时得到的异常
369 * - `result`, 调用正常时得到的对象
370 *
371 * Result:
372 * ```
373 * {
374 * "errcode":0,
375 * "errmsg":"send job submission success",
376 * "msg_id":34182
377 * }
378 * ```
379 *
380 * @param {Object} data 视频数据
381 * @param {String|Array} receivers 接收人。一个组,或者openid列表
382 * @param {Function} callback 回调函数
383 */
384exports.massSendMPVideo = function (data, receivers, callback) {
385 var that = this;
386 // 自动帮转视频的media_id
387 this.uploadMPVideo(data, function (err, result) {
388 if (err) {
389 return callback(err);
390 }
391 that.massSendVideo(result.media_id, receivers, callback);
392 });
393};
394
395/**
396 * 删除群发消息
397 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
398 * Examples:
399 * ```
400 * api.deleteMass(message_id, callback);
401 * ```
402 * Callback:
403 *
404 * - `err`, 调用失败时得到的异常
405 * - `result`, 调用正常时得到的对象
406 *
407 * Result:
408 * ```
409 * {
410 * "errcode":0,
411 * "errmsg":"ok"
412 * }
413 * ```
414 *
415 * @param {String} messageId 待删除群发的消息id
416 * @param {Function} callback 回调函数
417 */
418exports.deleteMass = function (messageId, callback) {
419 this.preRequest(this._deleteMass, arguments);
420};
421
422exports._deleteMass = function (messageId, callback) {
423 var opts = {
424 msg_id: messageId
425 };
426 var url = this.endpoint + '/cgi-bin/message/mass/delete?access_token=' + this.token.accessToken;
427 this.request(url, postJSON(opts), wrapper(callback));
428};
429
430/**
431 * 预览接口,预览图文消息
432 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
433 * Examples:
434 * ```
435 * api.previewNews(openid, mediaId, callback);
436 * ```
437 * Callback:
438 *
439 * - `err`, 调用失败时得到的异常
440 * - `result`, 调用正常时得到的对象
441 *
442 * Result:
443 * ```
444 * {
445 * "errcode":0,
446 * "errmsg":"send job submission success",
447 * "msg_id": 34182
448 * }
449 * ```
450 *
451 * @param {String} openid 用户openid
452 * @param {String} mediaId 图文消息mediaId
453 * @param {Function} callback 回调函数
454 */
455exports.previewNews = function (openid, mediaId, callback) {
456 this.preRequest(this._previewNews, arguments);
457};
458
459exports._previewNews = function (openid, mediaId, callback) {
460 var opts = {
461 'touser': openid,
462 'mpnews': {
463 'media_id': mediaId
464 },
465 'msgtype': 'mpnews'
466 };
467 var url = this.endpoint + '/cgi-bin/message/mass/preview?access_token=' + this.token.accessToken;
468 this.request(url, postJSON(opts), wrapper(callback));
469};
470
471/**
472 * 预览接口,预览文本消息
473 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
474 * Examples:
475 * ```
476 * api.previewText(openid, content, callback);
477 * ```
478 * Callback:
479 *
480 * - `err`, 调用失败时得到的异常
481 * - `result`, 调用正常时得到的对象
482 *
483 * Result:
484 * ```
485 * {
486 * "errcode":0,
487 * "errmsg":"send job submission success",
488 * "msg_id": 34182
489 * }
490 * ```
491 *
492 * @param {String} openid 用户openid
493 * @param {String} content 文本消息
494 * @param {Function} callback 回调函数
495 */
496exports.previewText = function (openid, content, callback) {
497 this.preRequest(this._previewText, arguments);
498};
499
500exports._previewText = function (openid, content, callback) {
501 var opts = {
502 'touser': openid,
503 'text': {
504 'content': content
505 },
506 'msgtype':'text'
507 };
508 var url = this.endpoint + '/cgi-bin/message/mass/preview?access_token=' + this.token.accessToken;
509 this.request(url, postJSON(opts), wrapper(callback));
510};
511
512/**
513 * 预览接口,预览语音消息
514 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
515 * Examples:
516 * ```
517 * api.previewVoice(openid, mediaId, callback);
518 * ```
519 * Callback:
520 *
521 * - `err`, 调用失败时得到的异常
522 * - `result`, 调用正常时得到的对象
523 *
524 * Result:
525 * ```
526 * {
527 * "errcode":0,
528 * "errmsg":"send job submission success",
529 * "msg_id": 34182
530 * }
531 * ```
532 *
533 * @param {String} openid 用户openid
534 * @param {String} mediaId 语音mediaId
535 * @param {Function} callback 回调函数
536 */
537exports.previewVoice = function (openid, mediaId, callback) {
538 this.preRequest(this._previewVoice, arguments);
539};
540
541exports._previewVoice = function (openid, mediaId, callback) {
542 var opts = {
543 'touser': openid,
544 'voice': {
545 'media_id': mediaId
546 },
547 'msgtype': 'voice'
548 };
549 var url = this.endpoint + '/cgi-bin/message/mass/preview?access_token=' + this.token.accessToken;
550 this.request(url, postJSON(opts), wrapper(callback));
551};
552
553/**
554 * 预览接口,预览图片消息
555 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
556 * Examples:
557 * ```
558 * api.previewImage(openid, mediaId, callback);
559 * ```
560 * Callback:
561 *
562 * - `err`, 调用失败时得到的异常
563 * - `result`, 调用正常时得到的对象
564 *
565 * Result:
566 * ```
567 * {
568 * "errcode":0,
569 * "errmsg":"send job submission success",
570 * "msg_id": 34182
571 * }
572 * ```
573 *
574 * @param {String} openid 用户openid
575 * @param {String} mediaId 图片mediaId
576 * @param {Function} callback 回调函数
577 */
578exports.previewImage = function (openid, mediaId, callback) {
579 this.preRequest(this._previewImage, arguments);
580};
581
582exports._previewImage = function (openid, mediaId, callback) {
583 var opts = {
584 'touser': openid,
585 'image': {
586 'media_id': mediaId
587 },
588 'msgtype': 'image'
589 };
590 var url = this.endpoint + '/cgi-bin/message/mass/preview?access_token=' + this.token.accessToken;
591 this.request(url, postJSON(opts), wrapper(callback));
592};
593
594/**
595 * 预览接口,预览视频消息
596 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
597 * Examples:
598 * ```
599 * api.previewVideo(openid, mediaId, callback);
600 * ```
601 * Callback:
602 *
603 * - `err`, 调用失败时得到的异常
604 * - `result`, 调用正常时得到的对象
605 *
606 * Result:
607 * ```
608 * {
609 * "errcode":0,
610 * "errmsg":"send job submission success",
611 * "msg_id": 34182
612 * }
613 * ```
614 *
615 * @param {String} openid 用户openid
616 * @param {String} mediaId 视频mediaId
617 * @param {Function} callback 回调函数
618 */
619exports.previewVideo = function (openid, mediaId, callback) {
620 this.preRequest(this._previewVideo, arguments);
621};
622
623exports._previewVideo = function (openid, mediaId, callback) {
624 var opts = {
625 'touser': openid,
626 'mpvideo': {
627 'media_id': mediaId
628 },
629 'msgtype': 'mpvideo'
630 };
631 var url = this.endpoint + '/cgi-bin/message/mass/preview?access_token=' + this.token.accessToken;
632 this.request(url, postJSON(opts), wrapper(callback));
633};
634
635/**
636 * 查询群发消息状态
637 * 详情请见:<http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html>
638 * Examples:
639 * ```
640 * api.getMassMessageStatus(messageId, callback);
641 * ```
642 * Callback:
643 *
644 * - `err`, 调用失败时得到的异常
645 * - `result`, 调用正常时得到的对象
646 *
647 * Result:
648 * ```
649 * {
650 * "msg_id":201053012,
651 * "msg_status":"SEND_SUCCESS"
652 * }
653 * ```
654 *
655 * @param {String} messageId 消息ID
656 * @param {Function} callback 回调函数
657 */
658exports.getMassMessageStatus = function (messageId, callback) {
659 this.preRequest(this._getMassMessageStatus, arguments);
660};
661
662exports._getMassMessageStatus = function (messageId, callback) {
663 var opts = {
664 'msg_id': messageId
665 };
666 var url = this.endpoint + '/cgi-bin/message/mass/get?access_token=' + this.token.accessToken;
667 this.request(url, postJSON(opts), wrapper(callback));
668};