UNPKG

40.2 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4var path = require('path');
5var formstream = require('formstream');
6var crypto = require('crypto');
7var util = require('./util');
8var wrapper = util.wrapper;
9var postJSON = util.postJSON;
10var make = util.make;
11
12/**
13 * 申请开通功能
14 * 接口说明:
15 * 申请开通摇一摇周边功能。成功提交申请请求后,工作人员会在三个工作日内完成审核。若审核不通过,可以重新提交申请请求。
16 * 若是审核中,请耐心等待工作人员审核,在审核中状态不能再提交申请请求。
17 * 详情请参见:<http://mp.weixin.qq.com/wiki/13/025f1d471dc999928340161c631c6635.html>
18 *
19 * Options:
20 * ```
21 * {
22 * "name": "zhang_san",
23 * "phone_number": "13512345678",
24 * "email": "weixin123@qq.com",
25 * "industry_id": "0118",
26 * "qualification_cert_urls": [
27 * "http://shp.qpic.cn/wx_shake_bus/0/1428565236d03d864b7f43db9ce34df5f720509d0e/0",
28 * "http://shp.qpic.cn/wx_shake_bus/0/1428565236d03d864b7f43db9ce34df5f720509d0e/0"
29 * ],
30 * "apply_reason": "test"
31 * }
32 * ```
33 *
34 * Examples:
35 * ```
36 * api.registerShakeAccount(options, callback);
37 * ```
38 *
39 * Callback:
40 *
41 * - `err`, 调用失败时得到的异常
42 * - `result`, 调用正常时得到的对象
43 *
44 * Result:
45 * ```
46 * {
47 * "data" : { },
48 * "errcode": 0,
49 * "errmsg": "success."
50 * }
51 * ```
52 *
53 * @name registerShakeAccount
54 * @param {Object} options 请求参数
55 * @param {Function} callback 回调函数
56 */
57make(exports, 'registerShakeAccount', function (options, callback) {
58 var url = this.endpoint + '/shakearound/account/register?access_token=' + this.token.accessToken;
59 this.request(url, postJSON(options), wrapper(callback));
60});
61
62/**
63 * 查询审核状态
64 * 接口说明:
65 * 查询已经提交的开通摇一摇周边功能申请的审核状态。在申请提交后,工作人员会在三个工作日内完成审核。
66 * 详情请参见:http://mp.weixin.qq.com/wiki/13/025f1d471dc999928340161c631c6635.html
67 * Examples:
68 * ```
69 * api.checkShakeAccountStatus(callback);
70 * ```
71 * Callback:
72 *
73 * - `err`, 调用失败时得到的异常
74 * - `result`, 调用正常时得到的对象
75 *
76 * Result:
77 * ```
78 * {
79 * "data" : {
80 * "apply_time": 1432026025,
81 * "audit_comment": "test",
82 * "audit_status": 1, //审核状态。0:审核未通过、1:审核中、2:审核已通过;审核会在三个工作日内完成
83 * "audit_time": 0
84 * },
85 * "errcode": 0,
86 * "errmsg": "success."
87 * }
88 * ```
89 *
90 * @name checkShakeAccountStatus
91 * @param {Function} callback 回调函数
92 */
93make(exports, 'checkShakeAccountStatus', function (callback) {
94 var url = this.endpoint + '/shakearound/account/auditstatus?access_token=' + this.token.accessToken;
95 this.request(url, {dataType: 'json'}, wrapper(callback));
96});
97
98/**
99 * 设备管理: 申请设备ID。
100 * 接口说明:
101 * 申请配置设备所需的UUID、Major、Minor。若激活率小于50%,不能新增设备。单次新增设备超过500个,
102 * 需走人工审核流程。审核通过后,可用返回的批次ID用“查询设备列表”接口拉取本次申请的设备ID。
103 * 详情请参见:<http://mp.weixin.qq.com/wiki/15/b9e012f917e3484b7ed02771156411f3.html>
104 *
105 * Options:
106 * ```
107 * {
108 * "quantity":3,
109 * "apply_reason":"测试",
110 * "comment":"测试专用",
111 * "poi_id":1234
112 * }
113 * ```
114 *
115 * Examples:
116 * ```
117 * api.applyBeacons(options, callback);
118 * ```
119 *
120 * Callback:
121 *
122 * - `err`, 调用失败时得到的异常
123 * - `result`, 调用正常时得到的对象
124 *
125 * Result:
126 * ```
127 * {
128 * "data" : { ... },
129 * "errcode": 0,
130 * "errmsg": "success."
131 * }
132 * ```
133 *
134 * @name applyBeacons
135 * @param {Object} options 请求参数
136 * @param {Function} callback 回调函数
137 */
138make(exports, 'applyBeacons', function (options, callback) {
139 var url = this.endpoint + '/shakearound/device/applyid?access_token=' + this.token.accessToken;
140 this.request(url, postJSON(options), wrapper(callback));
141});
142
143/**
144 * 设备管理: 查询设备ID申请审核状态。
145 * 接口说明:
146 * 查询设备ID申请的审核状态。若单次申请的设备ID数量小于等于500个,系统会进行快速审核;
147 * 若单次申请的设备ID数量大于500个,则在三个工作日内完成审核。
148 * 详情请参见:<http://mp.weixin.qq.com/wiki/10/9926857d34ef8cea6bcd6cffb6cea80a.html>
149 *
150 * Options:
151 * ```
152 * {
153 * "apply_id": 12345
154 * }
155 * ```
156 *
157 * Examples:
158 * ```
159 * api.applyBeaconsStatus(apply_id, callback);
160 * ```
161 *
162 * Callback:
163 *
164 * - `err`, 调用失败时得到的异常
165 * - `result`, 调用正常时得到的对象
166 *
167 * Result:
168 * ```
169 * {
170 * "data" : { ... },
171 * "errcode": 0,
172 * "errmsg": "success."
173 * }
174 * ```
175 *
176 * @name applyBeaconsStatus
177 * @param {Object} options 请求参数
178 * @param {Function} callback 回调函数
179 */
180make(exports, 'applyBeaconsStatus', function (apply_id, callback) {
181 var data = {
182 apply_id: apply_id
183 };
184 var url = this.endpoint + '/shakearound/device/applystatus?access_token=' + this.token.accessToken;
185 this.request(url, postJSON(data), wrapper(callback));
186});
187
188/**
189 * 设备管理: 编辑设备的备注信息。
190 * 接口说明:
191 * 可用设备ID或完整的UUID、Major、Minor指定设备,二者选其一。
192 * 详情请参见:http://mp.weixin.qq.com/wiki/15/b9e012f917e3484b7ed02771156411f3.html
193 * Options:
194 * ```
195 * {
196 * "device_identifier": {
197 * // 设备编号,若填了UUID、major、minor,则可不填设备编号,若二者都填,则以设备编号为优先
198 * "device_id": 10011,
199 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
200 * "major": 1002,
201 * "minor": 1223
202 * },
203 * "comment": "test"
204 * }
205 * ```
206 * Examples:
207 * ```
208 * api.updateBeacon(options, callback);
209 * ```
210 * Callback:
211 *
212 * - `err`, 调用失败时得到的异常
213 * - `result`, 调用正常时得到的对象
214 *
215 * Result:
216 * ```
217 * {
218 * "data" : {
219 * },
220 * "errcode": 0,
221 * "errmsg": "success."
222 * }
223 * ```
224 *
225 * @name updateBeacon
226 * @param {Object} options 请求参数
227 * @param {Function} callback 回调函数
228 */
229make(exports, 'updateBeacon', function (options, callback) {
230 var url = this.endpoint + '/shakearound/device/update?access_token=' + this.token.accessToken;
231 this.request(url, postJSON(options), wrapper(callback));
232});
233
234/**
235 * 设备管理: 配置设备与门店的关联关系。
236 * 接口说明:
237 * 修改设备关联的门店ID、设备的备注信息。可用设备ID或完整的UUID、Major、Minor指定设备,二者选其一。
238 * 详情请参见:http://mp.weixin.qq.com/wiki/15/b9e012f917e3484b7ed02771156411f3.html
239 * Options:
240 * ```
241 * {
242 * "device_identifier": {
243 * "device_id": 10011,
244 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
245 * "major": 1002,
246 * "minor": 1223
247 * },
248 * "poi_id": 1231
249 * }
250 * ```
251 * Examples:
252 * ```
253 * api.bindBeaconLocation(options, callback);
254 * ```
255 * Callback:
256 *
257 * - `err`, 调用失败时得到的异常
258 * - `result`, 调用正常时得到的对象
259 *
260 * Result:
261 * ```
262 * {
263 * "data" : {
264 * },
265 * "errcode": 0,
266 * "errmsg": "success."
267 * }
268 * ```
269 *
270 * @name bindBeaconLocation
271 * @param {Object} options 请求参数
272 * @param {Function} callback 回调函数
273 */
274make(exports, 'bindBeaconLocation', function(options, callback) {
275 var url = this.endpoint + '/shakearound/device/bindlocation?access_token=' + this.token.accessToken;
276 this.request(url, postJSON(options), wrapper(callback));
277});
278
279/**
280 * 设备管理: 查询设备列表
281 * 接口说明:
282 * 查询已有的设备ID、UUID、Major、Minor、激活状态、备注信息、关联门店、关联页面等信息。
283 * 可指定设备ID或完整的UUID、Major、Minor查询,也可批量拉取设备信息列表。
284 * 详情请参见:http://mp.weixin.qq.com/wiki/15/b9e012f917e3484b7ed02771156411f3.html
285 * Options:
286 * 1) 查询指定设备时:
287 * ```
288 * {
289 * "device_identifier": [
290 * {
291 * "device_id":10011,
292 * "uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
293 * "major":1002,
294 * "minor":1223
295 * }
296 * ]
297 * }
298 * ```
299 * 2) 需要分页查询或者指定范围内的设备时:
300 * ```
301 * {
302 * "begin": 0,
303 * "count": 3
304 * }
305 * ```
306 * 3) 当需要根据批次ID查询时:
307 * ```
308 * {
309 * "apply_id": 1231,
310 * "begin": 0,
311 * "count": 3
312 * }
313 * ```
314 * Examples:
315 * ```
316 * api.getBeacons(options, callback);
317 * ```
318 * Callback:
319 *
320 * - `err`, 调用失败时得到的异常
321 * - `result`, 调用正常时得到的对象
322 *
323 * Result:
324 * ```
325 * {
326 * "data": {
327 * "devices": [
328 * {
329 * "comment": "",
330 * "device_id": 10097,
331 * "major": 10001,
332 * "minor": 12102,
333 * "page_ids": "15369",
334 * "status": 1, //激活状态,0:未激活,1:已激活(但不活跃),2:活跃
335 * "poi_id": 0,
336 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825"
337 * },
338 * {
339 * "comment": "",
340 * "device_id": 10098,
341 * "major": 10001,
342 * "minor": 12103,
343 * "page_ids": "15368",
344 * "status": 1,
345 * "poi_id": 0,
346 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825"
347 * }
348 * ],
349 * "total_count": 151
350 * },
351 * "errcode": 0,
352 * "errmsg": "success."
353 * }
354 * ```
355 *
356 * @name getBeacons
357 * @param {Object} options 请求参数
358 * @param {Function} callback 回调函数
359 */
360make(exports, 'getBeacons', function (options, callback) {
361 var url = this.endpoint + '/shakearound/device/search?access_token=' + this.token.accessToken;
362 this.request(url, postJSON(options), wrapper(callback));
363});
364
365
366/**
367 * 页面管理: 新增页面
368 * 接口说明:
369 * 新增摇一摇出来的页面信息,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
370 * 其中,图片必须为用素材管理接口(uploadPageIcon函数)上传至微信侧服务器后返回的链接。
371 * 详情请参见:http://mp.weixin.qq.com/wiki/5/6626199ea8757c752046d8e46cf13251.html
372 * Page:
373 * ```
374 * {
375 * "title":"主标题",
376 * "description":"副标题",
377 * "page_url":" https://zb.weixin.qq.com",
378 * "comment":"数据示例",
379 * "icon_url":"http://shp.qpic.cn/wx_shake_bus/0/14288351768a23d76e7636b56440172120529e8252/120"
380 * //调用uploadPageIcon函数获取到该URL
381 * }
382 * ```
383 * Examples:
384 * ```
385 * api.createPage(page, callback);
386 * ```
387 * Callback:
388 *
389 * - `err`, 调用失败时得到的异常
390 * - `result`, 调用正常时得到的对象
391 *
392 * Result:
393 * ```
394 * {
395 * "data" : {
396 * "page_id": 28840
397 * },
398 * "errcode": 0,
399 * "errmsg": "success."
400 * }
401 * ```
402 *
403 * @name createPage
404 * @param {Object} page 请求参数
405 * @param {Function} callback 回调函数
406 */
407make(exports, 'createPage', function (page, callback) {
408 var url = this.endpoint + '/shakearound/page/add?access_token=' + this.token.accessToken;
409 this.request(url, postJSON(page), wrapper(callback));
410});
411
412/**
413 * 页面管理: 编辑页面信息
414 * 接口说明:
415 * 编辑摇一摇出来的页面信息,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
416 * 详情请参见:http://mp.weixin.qq.com/wiki/5/6626199ea8757c752046d8e46cf13251.html
417 * Page:
418 * ```
419 * {
420 * "page_id":12306,
421 * "title":"主标题",
422 * "description":"副标题",
423 * "page_url":" https://zb.weixin.qq.com",
424 * "comment":"数据示例",
425 * "icon_url":"http://shp.qpic.cn/wx_shake_bus/0/14288351768a23d76e7636b56440172120529e8252/120"
426 * //调用uploadPageIcon函数获取到该URL
427 * }
428 * ```
429 * Examples:
430 * ```
431 * api.updatePage(page, callback);
432 * ```
433 * Callback:
434 *
435 * - `err`, 调用失败时得到的异常
436 * - `result`, 调用正常时得到的对象
437 *
438 * Result:
439 * ```
440 * {
441 * "data" : {
442 * "page_id": 28840
443 * },
444 * "errcode": 0,
445 * "errmsg": "success."
446 * }
447 * ```
448 *
449 * @name updatePage
450 * @param {Object} page 请求参数
451 * @param {Function} callback 回调函数
452 */
453make(exports, 'updatePage', function (page, callback) {
454 var url = this.endpoint + '/shakearound/page/update?access_token=' + this.token.accessToken;
455 this.request(url, postJSON(page), wrapper(callback));
456});
457
458/**
459 * 页面管理: 删除页面
460 * 接口说明:
461 * 删除已有的页面,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。
462 * 只有页面与设备没有关联关系时,才可被删除。
463 * 详情请参见:http://mp.weixin.qq.com/wiki/5/6626199ea8757c752046d8e46cf13251.html
464 * page_id:
465 * ```
466 * {
467 * "page_id": 34567
468 * }
469 * ```
470 * Examples:
471 * ```
472 * api.deletePage(page_id, callback);
473 * ```
474 * Callback:
475 *
476 * - `err`, 调用失败时得到的异常
477 * - `result`, 调用正常时得到的对象
478 *
479 * Result:
480 * ```
481 * {
482 * "data" : {
483 * },
484 * "errcode": 0,
485 * "errmsg": "success."
486 * }
487 * ```
488 *
489 * @name deletePage
490 * @param {Object} page_id 指定页面的id
491 * @param {Function} callback 回调函数
492 */
493make(exports, 'deletePage', function (page_id, callback) {
494 var data = {page_id: page_id};
495 var url = this.endpoint + '/shakearound/page/delete?access_token=' + this.token.accessToken;
496 this.request(url, postJSON(data), wrapper(callback));
497});
498
499/**
500 * 页面管理: 查询页面列表
501 * 接口说明:
502 * 查询已有的页面,包括在摇一摇页面出现的主标题、副标题、图片和点击进去的超链接。提供两种查询方式,可指定页面ID查询,也可批量拉取页面列表。
503 * 详情请参见:http://mp.weixin.qq.com/wiki/5/6626199ea8757c752046d8e46cf13251.html
504 * Options:
505 * 1) 需要查询指定页面时:
506 * ```
507 * {
508 * "page_ids":[12345, 23456, 34567]
509 * }
510 * ```
511 * 2) 需要分页查询或者指定范围内的页面时:
512 * ```
513 * {
514 * "begin": 0,
515 * "count": 3
516 * }
517 * ```
518 *
519 * Examples:
520 * ```
521 * api.getBeacons(options, callback);
522 * ```
523 * Callback:
524 *
525 * - `err`, 调用失败时得到的异常
526 * - `result`, 调用正常时得到的对象
527 *
528 * Result:
529 * ```
530 * {
531 * "data": {
532 * "pages": [
533 * {
534 * "comment": "just for test",
535 * "description": "test",
536 * "icon_url": "https://www.baidu.com/img/bd_logo1",
537 * "page_id": 28840,
538 * "page_url": "http://xw.qq.com/testapi1",
539 * "title": "测试1"
540 * },
541 * {
542 * "comment": "just for test",
543 * "description": "test",
544 * "icon_url": "https://www.baidu.com/img/bd_logo1",
545 * "page_id": 28842,
546 * "page_url": "http://xw.qq.com/testapi2",
547 * "title": "测试2"
548 * }
549 * ],
550 * "total_count": 2
551 * },
552 * "errcode": 0,
553 * "errmsg": "success."
554 * }
555 * ```
556 *
557 * @name getPages
558 * @param {Object} options 请求参数
559 * @param {Function} callback 回调函数
560 */
561make(exports, 'getPages', function (options, callback) {
562 var url = this.endpoint + '/shakearound/page/search?access_token=' + this.token.accessToken;
563 this.request(url, postJSON(options), wrapper(callback));
564});
565
566
567/**
568 * 上传图片素材
569 * 接口说明:
570 * 上传在摇一摇页面展示的图片素材,素材保存在微信侧服务器上。
571 * 格式限定为:jpg,jpeg,png,gif,图片大小建议120px*120 px,限制不超过200 px *200 px,图片需为正方形。
572 * 详情请参见:http://mp.weixin.qq.com/wiki/5/e997428269ff189d8f9a4b9e177be2d9.html
573 * Examples:
574 * ```
575 * api.uploadPageIcon('filepath', callback);
576 * ```
577 * Callback:
578 *
579 * - `err`, 调用失败时得到的异常
580 * - `result`, 调用正常时得到的对象
581 *
582 * Result:
583 * ```
584 * {
585 * "data" : {
586 * "pic_url": "http://shp.qpic.cn/wechat_shakearound_pic/0/1428377032e9dd2797018cad79186e03e8c5aec8dc/120"
587 * },
588 * "errcode": 0,
589 * "errmsg": "success."
590 * }
591 * ```
592 *
593 * @name uploadPageIcon
594 * @param {String} filepath 文件路径
595 * @param {Function} callback 回调函数
596 */
597make(exports, 'uploadPageIcon', function (filepath, callback) {
598 var that = this;
599 fs.stat(filepath, function (err, stat) {
600 if (err) {
601 return callback(err);
602 }
603 var form = formstream();
604 form.file('media', filepath, path.basename(filepath), stat.size);
605 var url = this.endpoint + '/shakearound/material/add?access_token=' + that.token.accessToken;
606 var opts = {
607 dataType: 'json',
608 type: 'POST',
609 timeout: 60000, // 60秒超时
610 headers: form.headers(),
611 stream: form
612 };
613 that.request(url, opts, callback);
614 });
615});
616
617/**
618 * 配置设备与页面的关联关系
619 * 接口说明:
620 * 配置设备与页面的关联关系。支持建立或解除关联关系,也支持新增页面或覆盖页面等操作。
621 * 配置完成后,在此设备的信号范围内,即可摇出关联的页面信息。若设备配置多个页面,则随机出现页面信息。
622 * 详情请参见:http://mp.weixin.qq.com/wiki/6/c449687e71510db19564f2d2d526b6ea.html
623 * Options:
624 * ```
625 * {
626 * "device_identifier": {
627 * // 设备编号,若填了UUID、major、minor,则可不填设备编号,若二者都填,则以设备编号为优先
628 * "device_id":10011,
629 * "uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
630 * "major":1002,
631 * "minor":1223
632 * },
633 * "page_ids":[12345, 23456, 334567]
634 * }
635 * ```
636 * Examples:
637 * ```
638 * api.bindBeaconWithPages(options, callback);
639 * ```
640 * Callback:
641 *
642 * - `err`, 调用失败时得到的异常
643 * - `result`, 调用正常时得到的对象
644 *
645 * Result:
646 * ```
647 * {
648 * "data" : {
649 * },
650 * "errcode": 0,
651 * "errmsg": "success."
652 * }
653 * ```
654 *
655 * @name bindBeaconWithPages
656 * @param {Object} options 请求参数
657 * @param {Function} callback 回调函数
658 */
659make(exports, 'bindBeaconWithPages', function (options, callback) {
660 var url = this.endpoint + '/shakearound/device/bindpage?access_token=' + this.token.accessToken;
661 this.request(url, postJSON(options), wrapper(callback));
662});
663
664/**
665 * 查询设备与页面的关联关系
666 * 接口说明:
667 * 查询设备与页面的关联关系。提供两种查询方式,可指定页面ID分页查询该页面所关联的所有的设备信息;
668 * 也可根据设备ID或完整的UUID、Major、Minor查询该设备所关联的所有页面信息。
669 * 详情请参见:http://mp.weixin.qq.com/wiki/6/c449687e71510db19564f2d2d526b6ea.html
670 * Options:
671 * 1) 当查询指定设备所关联的页面时:
672 * ```
673 * {
674 * "type": 1,
675 * "device_identifier": {
676 * // 设备编号,若填了UUID、major、minor,则可不填设备编号,若二者都填,则以设备编号为优先
677 * "device_id":10011,
678 * "uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
679 * "major":1002,
680 * "minor":1223
681 * }
682 * }
683 * ```
684 * 2) 当查询页面所关联的设备时:
685 * {
686 * "type": 2,
687 * "page_id": 11101,
688 * "begin": 0,
689 * "count": 3
690 * }
691 * Examples:
692 * ```
693 * api.searchBeaconPageRelation(options, callback);
694 * ```
695 * Callback:
696 *
697 * - `err`, 调用失败时得到的异常
698 * - `result`, 调用正常时得到的对象
699 *
700 * Result:
701 * ```
702 * {
703 * "data": {
704 * "relations": [
705 * {
706 * "device_id": 797994,
707 * "major": 10001,
708 * "minor": 10023,
709 * "page_id": 50054,
710 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825"
711 * },
712 * {
713 * "device_id": 797994,
714 * "major": 10001,
715 * "minor": 10023,
716 * "page_id": 50055,
717 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825"
718 * }
719 * ],
720 * "total_count": 2
721 * },
722 * "errcode": 0,
723 * "errmsg": "success."
724 * }
725 * ```
726 *
727 * @name searchBeaconPageRelation
728 * @param {Object} options 请求参数
729 * @param {Function} callback 回调函数
730 */
731make(exports, 'searchBeaconPageRelation', function (options, callback) {
732 var url = this.endpoint + '/shakearound/relation/search?access_token=' + this.token.accessToken;
733 this.request(url, postJSON(options), wrapper(callback));
734});
735
736/**
737 * 获取摇周边的设备及用户信息
738 * 接口说明:
739 * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。
740 * 详情请参见:http://mp.weixin.qq.com/wiki/3/34904a5db3d0ec7bb5306335b8da1faf.html
741 * Ticket:
742 * ```
743 * {
744 * "ticket":”6ab3d8465166598a5f4e8c1b44f44645”
745 * }
746 * ```
747 * Examples:
748 * ```
749 * api.getShakeInfo(ticket, callback);
750 * ```
751 * Callback:
752 *
753 * - `err`, 调用失败时得到的异常
754 * - `result`, 调用正常时得到的对象
755 *
756 * Result:
757 * ```
758 * {
759 * "data" : {
760 * },
761 * "errcode": 0,
762 * "errmsg": "success."
763 * }
764 * ```
765 *
766 * @name getShakeInfo
767 * @param {Object} ticket 摇周边业务的ticket,可在摇到的URL中得到,ticket生效时间为30分钟
768 * @param {Function} callback 回调函数
769 */
770make(exports, 'getShakeInfo', function (ticket, callback) {
771 var data = {
772 ticket: ticket
773 };
774
775 var url = this.endpoint + '/shakearound/user/getshakeinfo?access_token=' + this.token.accessToken;
776 this.request(url, postJSON(data), wrapper(callback));
777});
778
779/**
780 * 数据统计: 以设备为维度的数据统计接口
781 * 接口说明:
782 * 查询单个设备进行摇周边操作的人数、次数,点击摇周边消息的人数、次数;查询的最长时间跨度为30天。
783 * 详情请参见:http://mp.weixin.qq.com/wiki/0/8a24bcacad40fe7ee98d1573cb8a6764.html
784 * Options:
785 * ```
786 * {
787 * "device_identifier": {
788 * "device_id":10011, //设备编号,若填了UUID、major、minor,则可不填设备编号,若二者都填,则以设备编号为优先
789 * "uuid":"FDA50693-A4E2-4FB1-AFCF-C6EB07647825", //UUID、major、minor,三个信息需填写完整,若填了设备编号,则可不填此信息。
790 * "major":1002,
791 * "minor":1223
792 * },
793 * "begin_date": 12313123311,
794 * "end_date": 123123131231
795 * }
796 * ```
797 * Examples:
798 * ```
799 * api.getDeviceStatistics(options, callback);
800 * ```
801 * Callback:
802 *
803 * - `err`, 调用失败时得到的异常
804 * - `result`, 调用正常时得到的对象
805 *
806 * Result:
807 * ```
808 * {
809 * "data" : {
810 * {
811 * "click_pv": 0,
812 * "click_uv": 0,
813 * "ftime": 1425052800,
814 * "shake_pv": 0,
815 * "shake_uv": 0
816 * },
817 * {
818 * "click_pv": 0,
819 * "click_uv": 0,
820 * "ftime": 1425139200,
821 * "shake_pv": 0,
822 * "shake_uv": 0
823 * }
824 * },
825 * "errcode": 0,
826 * "errmsg": "success."
827 * }
828 * ```
829 *
830 * @name getDeviceStatistics
831 * @param {Object} options 请求参数
832 * @param {Function} callback 回调函数
833 */
834make(exports, 'getDeviceStatistics', function (options, callback) {
835 var url = this.endpoint + '/shakearound/statistics/device?access_token=' + this.token.accessToken;
836 this.request(url, postJSON(options), wrapper(callback));
837});
838
839/**
840 * 数据统计: 批量查询设备统计数据接口
841 * 接口说明:
842 * 查询指定时间商家帐号下的每个设备进行摇周边操作的人数、次数,点击摇周边消息的人数、次数。
843 * 只能查询最近90天内的数据,且一次只能查询一天。
844 * 此接口无法获取当天的数据,最早只能获取前一天的数据。由于系统在凌晨处理前一天的数据,
845 * 太早调用此接口可能获取不到数据,建议在早上8:00之后调用此接口。
846 * 注意:对于摇周边人数、摇周边次数、点击摇周边消息的人数、点击摇周边消息的次数都为0的设备,不在结果列表中返回。
847 * 详情请参见:<http://mp.weixin.qq.com/wiki/1/e0b035c89b0a9c95a8210204087fec69.html>
848 * Options:
849 * ```
850 * {
851 * date: 1438704000,
852 * page_index: 1
853 * }
854 * ```
855 * Examples:
856 * ```
857 * api.getDeviceStatisticsList(options, callback);
858 * ```
859 * Callback:
860 *
861 * - `err`, 调用失败时得到的异常
862 * - `result`, 调用正常时得到的对象
863 *
864 * Result:
865 * ```
866 * {
867 * "data": {
868 * "devices": [
869 * {
870 * "device_id": 10097,
871 * "major": 10001,
872 * "minor": 12102,
873 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825"
874 * "shake_pv": 1
875 * "shake_uv": 2
876 * "click_pv": 3
877 * "click_uv":4
878 * },
879 * {
880 * "device_id": 10097,
881 * "major": 10001,
882 * "minor": 12102,
883 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825"
884 * "shake_pv":1
885 * "shake_uv":2
886 * "click_pv":3
887 * "click_uv":4
888 * }
889 * ],
890 * },
891 * "date":1435075200
892 * "total_count": 151
893 * "page_index":1
894 * "errcode": 0,
895 * "errmsg": "success."
896 * }
897 * ```
898 *
899 * @name getDeviceStatisticsList
900 * @param {Object} options 请求参数
901 * @param {Function} callback 回调函数
902 */
903make(exports, 'getDeviceStatisticsList', function (options, callback) {
904 var url = this.endpoint + '/shakearound/statistics/devicelist?access_token=' + this.token.accessToken;
905 this.request(url, postJSON(options), wrapper(callback));
906});
907
908/**
909 * 数据统计: 以页面为维度的数据统计接口
910 * 接口说明:
911 * 查询单个页面通过摇周边摇出来的人数、次数,点击摇周边页面的人数、次数;查询的最长时间跨度为30天。
912 * 详情请参见:http://mp.weixin.qq.com/wiki/0/8a24bcacad40fe7ee98d1573cb8a6764.html
913 * Options:
914 * ```
915 * {
916 * "page_id": 12345,
917 * "begin_date": 12313123311,
918 * "end_date": 123123131231
919 * }
920 * ```
921 * Examples:
922 * ```
923 * api.getPageStatistics(options, callback);
924 * ```
925 * Callback:
926 *
927 * - `err`, 调用失败时得到的异常
928 * - `result`, 调用正常时得到的对象
929 *
930 * Result:
931 * ```
932 * {
933 * "data" : {
934 * {
935 * "click_pv": 0,
936 * "click_uv": 0,
937 * "ftime": 1425052800,
938 * "shake_pv": 0,
939 * "shake_uv": 0
940 * },
941 * {
942 * "click_pv": 0,
943 * "click_uv": 0,
944 * "ftime": 1425139200,
945 * "shake_pv": 0,
946 * "shake_uv": 0
947 * }
948 * },
949 * "errcode": 0,
950 * "errmsg": "success."
951 * }
952 * ```
953 *
954 * @name getPageStatistics
955 * @param {Object} options 请求参数
956 * @param {Function} callback 回调函数
957 */
958make(exports, 'getPageStatistics', function (options, callback) {
959 var url = this.endpoint + '/shakearound/statistics/page?access_token=' + this.token.accessToken;
960 this.request(url, postJSON(options), wrapper(callback));
961});
962
963/**
964 * 数据统计: 批量查询页面统计数据接口
965 * 接口说明:
966 * 查询指定时间商家帐号下的每个页面进行摇周边操作的人数、次数,点击摇周边消息的人数、次数。
967 * 只能查询最近90天内的数据,且一次只能查询一天。
968 * 此接口无法获取当天的数据,最早只能获取前一天的数据。由于系统在凌晨处理前一天的数据,
969 * 太早调用此接口可能获取不到数据,建议在早上8:00之后调用此接口。
970 * 注意:对于摇周边人数、摇周边次数、点击摇周边消息的人数、点击摇周边消息的次数都为0的设备,不在结果列表中返回。
971 * 详情请参见:<http://mp.weixin.qq.com/wiki/1/e0b035c89b0a9c95a8210204087fec69.html>
972 * Options:
973 * ```
974 * {
975 * date: 1425139200,
976 * page_index: 1
977 * }
978 * ```
979 * Examples:
980 * ```
981 * api.getPageStatisticsList(options, callback);
982 * ```
983 * Callback:
984 *
985 * - `err`, 调用失败时得到的异常
986 * - `result`, 调用正常时得到的对象
987 *
988 * Result:
989 * ```
990 * {
991 * "data": {
992 * "pages": [
993 * {
994 * "page_id": 1,
995 * "shake_pv": 1,
996 * "shake_uv": 2,
997 * "click_pv": 3,
998 * "click_uv":4
999 * },
1000 * {
1001 * "page_id": 2,
1002 * "shake_pv":1,
1003 * "shake_uv":2,
1004 * "click_pv":3,
1005 * "click_uv":4
1006 * }
1007 * ],
1008 * },
1009 * "date":1435075200
1010 * "total_count": 151
1011 * "page_index":1
1012 * "errcode": 0,
1013 * "errmsg": "success."
1014 * }
1015 * ```
1016 *
1017 * @name getPageStatisticsList
1018 * @param {Object} options 请求参数
1019 * @param {Function} callback 回调函数
1020 */
1021make(exports, 'getPageStatisticsList', function (options, callback) {
1022 var url = this.endpoint + '/shakearound/statistics/pagelist?access_token=' + this.token.accessToken;
1023 this.request(url, postJSON(options), wrapper(callback));
1024});
1025
1026/**
1027 * 查询分组列表
1028 * 接口说明:
1029 * 查询账号下所有的分组。
1030 * options:
1031 * {
1032 * begin: 0,
1033 * count: 10
1034 * }
1035 * Examples:
1036 * ```
1037 * api.listBeaconGroup(options, callback);
1038 * ```
1039 * Callback:
1040 *
1041 * - `err`, 调用失败时得到的异常
1042 * - `result`, 调用正常时得到的对象
1043 *
1044 * Result:
1045 * ```
1046 * {
1047 * "data" : {
1048 * "total_count": 100,
1049 * "groups":[
1050 * {
1051 * "group_id" : 123,
1052 * "group_name" : "test1"
1053 * },
1054 * {
1055 * "group_id" : 124,
1056 * "group_name" : "test2"
1057 * }
1058 * ]
1059 * },
1060 * "errcode": 0,
1061 * "errmsg": "success."
1062 * }
1063 * ```
1064 *
1065 * @name listBeaconGroup
1066 * @param {String} options 请求参数
1067 * @param {Function} callback 回调函数
1068 */
1069make(exports, 'listBeaconGroup', function (options, callback) {
1070 var url = this.endpoint + '/shakearound/device/group/getlist?access_token=' + this.token.accessToken;
1071 this.request(url, postJSON(options), wrapper(callback));
1072});
1073
1074/**
1075 * 查询分组详情
1076 * 接口说明:
1077 * 查询分组详情,包括分组名,分组id,分组里的设备列表
1078 * options:
1079 * {
1080 * group_id: 123,
1081 * begin: 0,
1082 * count: 10
1083 * }
1084 * Examples:
1085 * ```
1086 * api.queryGroupBeacons(options, callback);
1087 * ```
1088 * Callback:
1089 *
1090 * - `err`, 调用失败时得到的异常
1091 * - `result`, 调用正常时得到的对象
1092 *
1093 * Result:
1094 * ```
1095 * {
1096 * "data" : {
1097 * "group_id" : 123,
1098 * "group_name" : "test",
1099 * "total_count": 100,
1100 * "devices":[
1101 * {
1102 * "device_id" : 123456,
1103 * "uuid" : "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
1104 * "major" : 10001,
1105 * "minor" : 10001,
1106 * "comment" : "test device1",
1107 * "poi_id" : 12345,
1108 * },
1109 * {
1110 * "device_id" : 123457,
1111 * "uuid" : "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
1112 * "major" : 10001,
1113 * "minor" : 10002,
1114 * "comment" : "test device2",
1115 * "poi_id" : 12345,
1116 * }
1117 * ]
1118 * },
1119 * "errcode": 0,
1120 * "errmsg": "success."
1121 * }
1122 * ```
1123 *
1124 * @name queryGroupBeacons
1125 * @param {String} options 请求参数
1126 * @param {Function} callback 回调函数
1127 */
1128make(exports, 'queryGroupBeacons', function (options, callback) {
1129 var url = this.endpoint + '/shakearound/device/group/getdetail?access_token=' + this.token.accessToken;
1130 this.request(url, postJSON(options), wrapper(callback));
1131});
1132
1133/**
1134 * 新增分组
1135 * 接口说明:
1136 * 新建设备分组,每个帐号下最多只有100个分组。
1137 * group:
1138 * {
1139 * group_name: 'test'
1140 * }
1141 * Examples:
1142 * ```
1143 * api.addBeaconGroup(group, callback);
1144 * ```
1145 * Callback:
1146 *
1147 * - `err`, 调用失败时得到的异常
1148 * - `result`, 调用正常时得到的对象
1149 *
1150 * Result:
1151 * ```
1152 * {
1153 * "data" : {
1154 * "group_id": 123,
1155 * "group_name": 'test'
1156 * },
1157 * "errcode": 0,
1158 * "errmsg": "success."
1159 * }
1160 * ```
1161 *
1162 * @name addBeaconGroup
1163 * @param {Object} group 分组信息
1164 * @param {Function} callback 回调函数
1165 */
1166make(exports, 'addBeaconGroup', function (group, callback) {
1167 var url = this.endpoint + '/shakearound/device/group/add?access_token=' + this.token.accessToken;
1168 this.request(url, postJSON(group), wrapper(callback));
1169});
1170
1171/**
1172 * 编辑分组信息
1173 * 接口说明:
1174 * 编辑设备分组信息,目前只能修改分组名。
1175 * group:
1176 * {
1177 * group_id: 123,
1178 * group_name: 'test update'
1179 * }
1180 * Examples:
1181 * ```
1182 * api.updateBeaconGroup(group, callback);
1183 * ```
1184 * Callback:
1185 *
1186 * - `err`, 调用失败时得到的异常
1187 * - `result`, 调用正常时得到的对象
1188 *
1189 * Result:
1190 * ```
1191 * {
1192 * "data" : {
1193 * "group_id": 123,
1194 * "group_name": 'test update'
1195 * },
1196 * "errcode": 0,
1197 * "errmsg": "success."
1198 * }
1199 * ```
1200 *
1201 * @name updateBeaconGroup
1202 * @param {Object} group 分组信息
1203 * @param {Function} callback 回调函数
1204 */
1205make(exports, 'updateBeaconGroup', function (group, callback) {
1206 var url = this.endpoint + '/shakearound/device/group/update?access_token=' + this.token.accessToken;
1207 this.request(url, postJSON(group), wrapper(callback));
1208});
1209
1210/**
1211 * 删除分组信息
1212 * 接口说明:
1213 * 删除设备分组,若分组中还存在设备,则不能删除成功。需把设备移除以后,才能删除。
1214 * group:
1215 * {
1216 * group_id: 123
1217 * }
1218 * Examples:
1219 * ```
1220 * api.deleteBeaconGroup(group_id, callback);
1221 * ```
1222 * Callback:
1223 *
1224 * - `err`, 调用失败时得到的异常
1225 * - `result`, 调用正常时得到的对象
1226 *
1227 * Result:
1228 * ```
1229 * {
1230 * "data" : {
1231 * },
1232 * "errcode": 0,
1233 * "errmsg": "success."
1234 * }
1235 * ```
1236 *
1237 * @name deleteBeaconGroup
1238 * @param {Object} group 分组信息
1239 * @param {Function} callback 回调函数
1240 */
1241make(exports, 'deleteBeaconGroup', function (group_id, callback) {
1242 var data = {
1243 group_id: group_id
1244 };
1245
1246 var url = this.endpoint + '/shakearound/device/group/delete?access_token=' + this.token.accessToken;
1247 this.request(url, postJSON(data), wrapper(callback));
1248});
1249
1250/**
1251 * 添加设备到分组
1252 * 接口说明:
1253 * 添加设备到分组,每个分组能够持有的设备上限为10000,并且每次添加操作的添加上限为1000。只有在摇周边申请的设备才能添加到分组。
1254 * Options:
1255 * ```
1256 * {
1257 * "group_id": 123,
1258 * "device_identifier": [
1259 * {
1260 * // 设备编号,若填了UUID、major、minor,则可不填设备编号,若二者都填,则以设备编号为优先
1261 * "device_id": 10011,
1262 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
1263 * "major": 1002,
1264 * "minor": 1223
1265 * }
1266 * ]
1267 * }
1268 * ```
1269 * Examples:
1270 * ```
1271 * api.addGroupBeacons(options, callback);
1272 * ```
1273 * Callback:
1274 *
1275 * - `err`, 调用失败时得到的异常
1276 * - `result`, 调用正常时得到的对象
1277 *
1278 * Result:
1279 * ```
1280 * {
1281 * "data" : {
1282 * },
1283 * "errcode": 0,
1284 * "errmsg": "success."
1285 * }
1286 * ```
1287 *
1288 * @name addGroupBeacons
1289 * @param {Object} options 请求参数
1290 * @param {Function} callback 回调函数
1291 */
1292make(exports, 'addGroupBeacons', function (options, callback) {
1293 var url = this.endpoint + '/shakearound/device/group/adddevice?access_token=' + this.token.accessToken;
1294 this.request(url, postJSON(options), wrapper(callback));
1295});
1296
1297/**
1298 * 从分组中移除设备
1299 * 接口说明:
1300 * 从分组中移除设备,每次删除操作的上限为1000。
1301 * Options:
1302 * ```
1303 * {
1304 * "group_id": 123,
1305 * "device_identifier": [
1306 * {
1307 * // 设备编号,若填了UUID、major、minor,则可不填设备编号,若二者都填,则以设备编号为优先
1308 * "device_id": 10011,
1309 * "uuid": "FDA50693-A4E2-4FB1-AFCF-C6EB07647825",
1310 * "major": 1002,
1311 * "minor": 1223
1312 * }
1313 * ]
1314 * }
1315 * ```
1316 * Examples:
1317 * ```
1318 * api.deleteGroupBeacons(options, callback);
1319 * ```
1320 * Callback:
1321 *
1322 * - `err`, 调用失败时得到的异常
1323 * - `result`, 调用正常时得到的对象
1324 *
1325 * Result:
1326 * ```
1327 * {
1328 * "data" : {
1329 * },
1330 * "errcode": 0,
1331 * "errmsg": "success."
1332 * }
1333 * ```
1334 *
1335 * @name deleteGroupBeacons
1336 * @param {Object} options 请求参数
1337 * @param {Function} callback 回调函数
1338 */
1339make(exports, 'deleteGroupBeacons', function (options, callback) {
1340 var url = this.endpoint + '/shakearound/device/group/deletedevice?access_token=' + this.token.accessToken;
1341 this.request(url, postJSON(options), wrapper(callback));
1342});
1343
1344/**
1345 * 创建红包活动
1346 * 接口说明:
1347 * 创建红包活动,设置红包活动有效期,红包活动开关等基本信息,返回活动id。
1348 * 详情请参见:http://mp.weixin.qq.com/wiki/12/9738788d171724b080b52f6e41490cb4.html
1349 * Options:
1350 * ```
1351 * {
1352 * "use_template": 1,
1353 * "logo_url": "https://lodejs.org/images/qr.jpg"
1354 * }
1355 * ```
1356 * Body:
1357 * ```
1358 * {
1359 * "title": "抽奖活动名称",
1360 * "desc": "抽奖活动描述",
1361 * "onoff": 1,
1362 * "begin_time": 1428854400,
1363 * "expire_time": 1428940800,
1364 * "sponsor_appid": "wx476f028272e53c62",
1365 * "total": 10,
1366 * "jump_url": "https://lodejs.org",
1367 * "key": "u5pPq38tQP97yGn8iZxbBsfWvbn37poP"
1368 * }
1369 * ```
1370 * Examples:
1371 * ```
1372 * api.addLotteryInfo(options, body, callback);
1373 * ```
1374 * Callback:
1375 *
1376 * - `err`, 调用失败时得到的异常
1377 * - `result`, 调用正常时得到的对象
1378 *
1379 * Result:
1380 * ```
1381 * {
1382 * "errcode": 0,
1383 * "errmsg": "",
1384 * "lottery_id": "5794560",
1385 * "page_id": 1,
1386 * }
1387 * ```
1388 *
1389 * @name addLotteryInfo
1390 * @param {Object} options 请求参数
1391 * @param {Object} body JSON格式的结构体
1392 * @param {Function} callback 回调函数
1393 */
1394make(exports, 'addLotteryInfo', function (options, body, callback) {
1395 var url = this.endpoint + '/shakearound/lottery/addlotteryinfo?&use_template=' + options.use_template + '&logo_url=' + options.logo_url + '&access_token=' + this.token.accessToken;
1396 this.request(url, postJSON(body), wrapper(callback));
1397});
1398
1399/**
1400 * 录入红包信息
1401 * 接口说明:
1402 * 在调用"创建红包活动"接口之后,调用此接口录入红包信息。
1403 * 详情请参见:http://mp.weixin.qq.com/wiki/12/9738788d171724b080b52f6e41490cb4.html
1404 * Options:
1405 * ```
1406 * {
1407 * "lottery_id": "5794560",
1408 * "mchid": "1234567890",
1409 * "sponsor_appid": "wx476f028272e53c62"
1410 * "prize_info_list": [{
1411 * "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==",
1412 * }]
1413 * }
1414 * ```
1415 * Examples:
1416 * ```
1417 * api.setPrizeBucket(options, callback);
1418 * ```
1419 * Callback:
1420 *
1421 * - `err`, 调用失败时得到的异常
1422 * - `result`, 调用正常时得到的对象
1423 *
1424 * Result:
1425 * ```
1426 * {
1427 * "errcode": 0,
1428 * "errmsg": "",
1429 * "success_num": 1,
1430 * "repeat_ticket_list": [{
1431 * "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==",
1432 * }]
1433 * }
1434 * ```
1435 *
1436 * @name setPrizeBucket
1437 * @param {Object} options 请求参数
1438 * @param {Function} callback 回调函数
1439 */
1440make(exports, 'setPrizeBucket', function (options, callback) {
1441 var url = this.endpoint + '/shakearound/lottery/setprizebucket?access_token=' + this.token.accessToken;
1442 this.request(url, postJSON(options), wrapper(callback));
1443});
1444
1445/**
1446 * 设置红包活动抽奖开关
1447 * 接口说明:
1448 * 开发者实时控制红包活动抽奖的开启和关闭。
1449 * 详情请参见:http://mp.weixin.qq.com/wiki/12/9738788d171724b080b52f6e41490cb4.html
1450 * Examples:
1451 * ```
1452 * api.setLotterySwitch(lotteryId, onoff, callback);
1453 * ```
1454 * Callback:
1455 *
1456 * - `err`, 调用失败时得到的异常
1457 * - `result`, 调用正常时得到的对象
1458 *
1459 * Result:
1460 * ```
1461 * {
1462 * "errcode": 0,
1463 * "errmsg": ""
1464 * }
1465 * ```
1466 *
1467 * @name setLotterySwitch
1468 * @param {String} lotteryId 红包抽奖id
1469 * @param {Number} onoff 活动抽奖开关,0:关闭,1:开启
1470 * @param {Function} callback 回调函数
1471 */
1472make(exports, 'setLotterySwitch', function (lotteryId, onoff, callback) {
1473 var url = this.endpoint + '/shakearound/lottery/setlotteryswitch?lottery_id=' + lotteryId + '&onoff=' + onoff + '&access_token=' + this.token.accessToken;
1474 this.request(url, wrapper(callback));
1475});
1476
1477/**
1478 * 获取红包JSAPI参数
1479 * 接口说明:
1480 * 用于在第三方页面中,通过调用JSAPI来触发用户抽红包的操作。
1481 * 详情请参见:http://mp.weixin.qq.com/wiki/12/9738788d171724b080b52f6e41490cb4.html
1482 * Examples:
1483 * ```
1484 * api.getShakehbConfig(openid, lotteryId, key);
1485 * ```
1486 * Return:
1487 * ```
1488 * {
1489 * "openid": "o-hVKuNknQQBZFDlbE8eibQzIX3o",
1490 * "lottery_id": "5794560"
1491 * "noncestr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS"
1492 * "sign": "D6F2078841D003C09BF5263EDA3CD5F9"
1493 * }
1494 * ```
1495 *
1496 * @name getShakehbConfig
1497 * @param {String} openid 用户openid
1498 * @param {String} lotteryId 红包抽奖id
1499 * @param {String} key “创建红包活动”接口设置的key
1500 */
1501exports.getShakehbConfig = function (openid, lotteryId, key) {
1502 var params = {
1503 openid: openid,
1504 lottery_id: lotteryId,
1505 noncestr: Math.random().toString(36).substr(2, 15)
1506 };
1507
1508 var query = Object.keys(params).sort().map(function(key) {
1509 return key + '=' + params[key];
1510 }).join('&');
1511
1512 query += '&key=' + key;
1513 params.sign = crypto.createHash('md5').update(query).digest('hex').toUpperCase();
1514
1515 return params;
1516};