微信企业号Node库API,ES6版本
获取企业号应用
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=获取企业号应用
Examples:
var result = yield api.getAgent(agentid);
Result:
{
"errcode":"0",
"errmsg":"ok" ,
"agentid":"1" ,
"name":"NAME" ,
"square_logo_url":"xxxxxxxx" ,
"round_logo_url":"yyyyyyyy" ,
"description":"desc" ,
"allow_userinfos":{
"user":[
{
"userid":"id1",
"status":"1"
},
{
"userid":"id2",
"status":"1"
},
{
"userid":"id3",
"status":"1"
}
]
},
"allow_partys":{
"partyid": [1]
},
"allow_tags":{
"tagid": [1,2,3]
}
"close":0 ,
"redirect_domain":"www.qq.com",
"report_location_flag":0,
"isreportuser":0,
"isreportenter":0
方法签名
方法 | exports.getAgent() | ||
参数 | agentid(String) | 企业号应用的id |
设置企业号应用
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=设置企业号应用
Examples:
var result = yield api.setAgent(opts);
Opts:
{
"agentid": "5",
"report_location_flag": "0",
"logo_mediaid": "xxxxx",
"name": "NAME",
"description": "DESC",
"redirect_domain": "xxxxxx",
"isreportuser":0,
"isreportenter":0
}
Callback:
err
, 调用失败时得到的异常result
, 调用正常时得到的对象
Result:
{
"errcode":"0",
"errmsg":"ok" ,
}
方法签名
方法 | exports.setAgent() | ||
参数 | opts(Object) | 更新的数据 |
获取应用概况列表
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=获取应用概况列表
Examples:
var result = yield api.listAgent();
Result:
{
"errcode": 0,
"errmsg": "ok",
"agentlist": [
{
"agentid": "5",
"name": "企业小助手",
"square_logo_url": "url",
"round_logo_url": "url"
},
{
"agentid": "8",
"name": "HR小助手",
"square_logo_url": "url",
"round_logo_url": "url"
}
]
}
方法签名
方法 | exports.listAgent() |
批量邀请成员
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8
Examples:
var result = yield api.batchInviteUser(to, callback);
To:
{
"touser":"xxx|xxx",
"toparty":"xxx|xxx",
"totag":"xxx|xxx",
"invite_tips":"xxx",
}
TaskCb:
{
"url": "xxx",
"token": "xxx",
"encodingaeskey": "xxx"
}
Result:
{
"errcode": 0,
"errmsg": "ok",
"jobid": "IoZW03y44Zcwuz-2K6T6rHTcf1uwyVbcYu2aRALKw-U"
}
方法签名
方法 | exports.batchInviteUser() | ||
参数 | to(Object) | 批量邀请的数据结构 |
|
参数 | callback(Object) | 任务执行完毕后的回调结构 |
批量更新成员
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8
Examples:
var result = yield api.batchSyncUser(mediaId, callback);
TaskCb:
{
"url": "xxx",
"token": "xxx",
"encodingaeskey": "xxx"
}
Result:
{
"errcode": 0,
"errmsg": "ok",
"jobid": "IoZW03y44Zcwuz-2K6T6rHTcf1uwyVbcYu2aRALKw-U"
}
方法签名
方法 | exports.batchSyncUser() | ||
参数 | mediaId(String) | 数据文件的mediaId |
|
参数 | callback(Object) | 任务执行完毕后的回调结构 |
全量覆盖成员
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8
Examples:
var result = yield api.batchReplaceUser(mediaId, callback);
TaskCb:
{
"url": "xxx",
"token": "xxx",
"encodingaeskey": "xxx"
}
Result:
{
"errcode": 0,
"errmsg": "ok",
"jobid": "IoZW03y44Zcwuz-2K6T6rHTcf1uwyVbcYu2aRALKw-U"
}
方法签名
方法 | exports.batchReplaceUser() | ||
参数 | mediaId(String) | 数据文件的mediaId |
|
参数 | callback(Object) | 任务执行完毕后的回调结构 |
全量覆盖部门
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8
Examples:
var result = yield api.batchReplaceParty(mediaId, callback);
TaskCb:
{
"url": "xxx",
"token": "xxx",
"encodingaeskey": "xxx"
}
Result:
{
"errcode": 0,
"errmsg": "ok",
"jobid": "IoZW03y44Zcwuz-2K6T6rHTcf1uwyVbcYu2aRALKw-U"
}
方法签名
方法 | exports.batchReplaceParty() | ||
参数 | mediaId(Object) | 数据文件的mediaId |
|
参数 | callback(Object) | 任务执行完毕后的回调结构 |
获取批量任务的结果
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8
Examples:
var result = yield api.batchGetResult(jobid);
返回结果参考微信的官方文档
方法签名
方法 | exports.batchGetResult() | ||
参数 | jobid(String) | 启动批量任务时返回的任务id |
根据appid和appsecret创建API的构造函数
CorpID是企业号的标识,每个企业号拥有一个唯一的CorpID;Secret是管理组凭证密钥。
系统管理员可通过管理端的权限管理功能创建管理组,分配管理组对应用、通讯录的访问权限。
完成后,管理组即可获得唯一的secret。
系统管理员可通过权限管理查看所有管理组的secret,其他管理员可通过设置中的开发者凭据查看。
当企业应用调用企业号接口时,企业号后台为根据此次访问的AccessToken,校验访问的合法性以及所对应的管理组的管理权限以返回相应的结果。
注:你应该审慎配置管理组的权限,够用即好,权限过大会增加误操作可能性及信息安全隐患。
如需跨进程跨机器进行操作Wechat API(依赖access token),access token需要进行全局维护
使用策略如下:
var API = require('co-wechat-enterprise-api');
var api = new API('corpid', 'corpsecret');
以上即可满足单进程使用。
当多进程时,token需要全局维护,以下为保存token的接口。
以下的例子使用了文本文件,实际使用中建议放到数据库中。
saveToken 方法接受的参数数据结构: { accessToken: 'aJvlZe6Q_vpYfdTFXWCSbJ7mVuMSXKvVGJU7BNy1wWBVE_41yOTM-ZE-axbsjNxWIWraYoOyJbcqIeyVpBHWtg' }
getToken 方法要保证返回的数据结构同上。
var api = new API('corpid', 'corpsecret', function* () {
// 传入一个获取全局token的方法
var txt = yield fs.readFile('access_token.txt', 'utf8');
return JSON.parse(txt);
}, function* (token) {
// 请将token存储到全局,跨进程、跨机器级别的全局,比如写到数据库、redis等
// 这样才能在cluster模式及多机情况下使用,以下为写入到文件的示例
yield fs.writeFile('access_token.txt', JSON.stringify(token));
});
方法签名
函数 | API() | ||
参数 | corpid(String) | 企业号的 corpid |
|
参数 | corpsecret(String) | 在公众平台上申请得到的corpsecret |
|
参数 | getToken(Generator) | 可选的。获取全局token对象的方法,多进程模式部署时需在意 |
|
参数 | saveToken(Generator) | 可选的。保存全局token对象的方法,多进程模式部署时需在意 |
用于设置urllib的默认options * Examples:
api.setOpts({timeout: 15000});
方法签名
方法 | API.prototype.setOpts() | ||
参数 | opts(Object) | 默认选项 |
设置urllib的hook
方法签名
方法 | API.prototype.request() |
用于支持对象合并。将对象合并到API.prototype上,使得能够支持扩展
Examples:
// 媒体管理(上传、下载)
API.mixin(require('./lib/api_media'));
方法签名
方法 | API.mixin() | ||
参数 | obj(Object) | 要合并的对象 |
创建部门
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=管理部门
Examples:
var result = yield api.createDepartment(name, opts);
Opts:
parentid
, 父部门id,根部门id为1order
,在父部门中的次序。从1开始,数字越大排序越靠后id
,部门ID。用指定部门ID新建部门,不指定此参数时,则自动生成Result:
{
"errcode": 0,
"errmsg": "created",
"id": 2
}
方法签名
方法 | exports.createDepartment() | ||
参数 | name(String) | 部门名字 |
|
参数 | opts(Object) | 选项 |
更新部门
Examples:
var opts = {name: 'new name', parentid: 1, order: 5};
var result = yield api.updateDepartment(id, opts);
Opts:
name
, 新的部门名字。可选parentid
, 父部门id,根部门id为1。可选order
,在父部门中的次序。从1开始,数字越大排序越靠后。可选,默认为1Result:
{
"errcode": 0,
"errmsg": "updated"
}
方法签名
方法 | exports.updateDepartment() | ||
参数 | id(Number) | 部门ID |
|
参数 | opts(Object) | 选项 |
删除部门
Examples:
var result = yield api.deleteDepartment(id);
var result = yield api.deleteDepartment([id1, id2]);
Result:
{
"errcode": 0,
"errmsg": "deleted"
}
方法签名
方法 | exports.deleteDepartment() | ||
参数 | id(Number,Array) | 部门ID |
查看所有部门
Examples:
var result = yield api.getDepartments();
Result:
{
"errcode": 0,
"errmsg": "ok",
"department": [
{
"id": 1,
"name": "广州研发中心",
"parentid": 0
},
{
"id": 2
"name": "邮箱产品部",
"parentid": 1
}
]
}
方法签名
方法 | exports.getDepartments() |
获取微信服务器IP地址
详情请见:http://mp.weixin.qq.com/wiki/index.php?title=获取微信服务器IP地址
Examples:
var result = yield api.getCallbackIP();
Result:
{
"ip_list":["127.0.0.1","127.0.0.1"]
}
方法签名
方法 | exports.getCallbackIP() |
多台服务器负载均衡时,ticketToken需要外部存储共享。
需要调用此registerTicketHandle来设置获取和保存的自定义方法。
Examples:
api.registerTicketHandle(getTicketToken, saveTicketToken);
// getTicketToken
function getTicketToken* () {
settingModel.getItem({key: 'weixin_ticketToken'}, function (err, setting) {
if (err) return callback(err);
callback(null, setting.value);
});
}
// saveTicketToken
function saveTicketToken* (_ticketToken) {
settingModel.setItem({key:'weixin_ticketToken', value: ticketToken}, function (err) {
if (err) return callback(err);
callback(null);
});
}
方法签名
方法 | exports.registerTicketHandle() | ||
参数 | getTicketToken(Function) | 获取外部ticketToken的函数 |
|
参数 | saveTicketToken(Function) | 存储外部ticketToken的函数 |
获取js sdk所需的有效js ticket
Result:
errcode
, 0为成功errmsg
, 成功为'ok',错误则为详细错误信息ticket
, js sdk有效票据,如:bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKAexpires_in
, 有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket方法签名
方法 | exports.getTicket() |
获取微信JS SDK Config的所需参数
注意事项
var param = {
debug:false,
jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'],
url: 'http://www.xxx.com'
};
var result = yield api.getJsConfig(param);
方法签名
方法 | exports.getJsConfig() | ||
参数 | param(Object) | 参数 |
发送消息分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=发送接口说明
Examples:
var result = yield api.send(agentid, to, message);
To:
{
"touser": "UserID1|UserID2|UserID3",
"toparty": " PartyID1 | PartyID2 ",
"totag": " TagID1 | TagID2 "
}
Message:
文本消息:
{
"msgtype": "text",
"text": {
"content": "Holiday Request For Pony(http://xxxxx)"
},
"safe":"0"
}
图片消息:
{
"msgtype": "image",
"image": {
"media_id": "MEDIA_ID"
},
"safe":"0"
}
图片消息:
{
"msgtype": "image",
"image": {
"media_id": "MEDIA_ID"
},
"safe":"0"
}
语音消息:
{
"msgtype": "voice",
"voice": {
"media_id": "MEDIA_ID"
},
"safe":"0"
}
视频消息:
{
"msgtype": "video",
"video": {
"media_id": "MEDIA_ID"
"title": "Title",
"description": "Description"
},
"safe":"0"
}
文件消息:
{
"msgtype": "file",
"file": {
"media_id": "MEDIA_ID"
},
"safe":"0"
}
图文消息:
{
"msgtype": "news",
"news": {
"articles":[
{
"title": "Title",
"description": "Description",
"url": "URL",
"picurl": "PIC_URL",
},
{
"title": "Title",
"description": "Description",
"url": "URL",
"picurl": "PIC_URL",
}
]
},
"safe":"0"
}
MP消息:
{
"msgtype": "mpnews",
"mpnews": {
"articles":[
{
"thumb_media_id": "id",
"author": "Author",
"content_source_url": "URL",
"content": "Content"
"digest": "Digest description",
"show_cover_pic": "0"
},
{
"thumb_media_id": "id",
"author": "Author",
"content_source_url": "URL",
"content": "Content"
"digest": "Digest description",
"show_cover_pic": "0"
}
],
"media_id": "id"
},
"safe":"0"
}
Result:
{
"errcode": 0,
"errmsg": "ok",
"invaliduser": "UserID1",
"invalidparty":"PartyID1",
"invalidtag":"TagID1"
}
方法签名
方法 | exports.send() | ||
参数 | agentid(String) | APP |
|
参数 | to(Object) | 接受消息的用户 |
|
参数 | message(Object) | 消息对象 |
创建标签
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=管理标签
Examples:
var result = yield api.createTag(name);
Result:
{
"errcode": 0,
"errmsg": "created",
"tagid": "1"
}
方法签名
方法 | exports.createTag() | ||
参数 | name(String) | 标签名字 |
更新标签名字
Examples:
var result = yield api.updateTagName(id, name);
Result:
{
"errcode": 0,
"errmsg": "updated"
}
方法签名
方法 | exports.updateTagName() | ||
参数 | id(String) | 标签ID |
|
参数 | name(String) | 标签名称。最长64个字符 |
删除标签
Examples:
var result = yield api.deleteTag(id);
Result:
{
"errcode": 0,
"errmsg": "deleted"
}
方法签名
方法 | exports.deleteTag() | ||
参数 | id(Number) | 标签ID |
获取标签列表
Examples:
var result = yield api.listTags();
Result:
{
"errcode": 0,
"errmsg": "deleted"
}
方法签名
方法 | exports.listTags() |
获取标签成员
Examples:
var result = yield api.getTagUsers(id);
Result:
{
"errcode": 0,
"errmsg": "ok",
"userlist": [
{
"userid": "zhangsan",
"name": "李四"
}
]
}
方法签名
方法 | exports.getTagUsers() | ||
参数 | id(Number) | 标签ID |
增加标签成员
Examples:
var userIdList = ['id1', 'id2'];
api.addTagUsers(id, userIdList, callback);
Callback:
err
, 调用失败时得到的异常result
, 调用正常时得到的对象Result:
a)正确时返回
{
"errcode": 0,
"errmsg": "deleted"
}
b)若部分userid非法,则返回
{
"errcode": 0,
"errmsg": "invalid userlist failed"
"invalidlist":"usr1|usr2|usr"
}
c)当包含的userid全部非法时返回
{
"errcode": 40031,
"errmsg": "all list invalid"
}
方法签名
方法 | exports.addTagUsers() | ||
参数 | id(Number) | 标签ID |
|
参数 | userIdList(Array) | 用户ID列表 |
删除标签成员
Examples:
var userIdList = ['id1', 'id2'];
api.deleteTagUsers(id, userIdList, callback);
Callback:
err
, 调用失败时得到的异常result
, 调用正常时得到的对象Result:
a)正确时返回
{
"errcode": 0,
"errmsg": "deleted"
}
b)若部分userid非法,则返回
{
"errcode": 0,
"errmsg": "invalid userlist failed"
"invalidlist":"usr1|usr2|usr"
}
c)当包含的userid全部非法时返回
{
"errcode": 40031,
"errmsg": "all list invalid"
}
方法签名
方法 | exports.deleteTagUsers() | ||
参数 | id(Number) | 标签ID |
|
参数 | userIdList(Array) | 用户ID数组 |
|
参数 | callback(Function) | 回调函数 |
创建成员
详细请看:http://qydev.weixin.qq.com/wiki/index.php?title=管理成员
Examples:
var result = yield api.createUser(user);
User:
{
"userid": "zhangsan",
"name": "张三",
"department": [1, 2],
"position": "产品经理",
"mobile": "15913215421",
"gender": 1,
"tel": "62394",
"email": "zhangsan@gzdev.com",
"weixinid": "zhangsan4dev"
}
Result:
{
"errcode": 0,
"errmsg": "created"
}
方法签名
方法 | exports.createUser() | ||
参数 | user(Object) | 成员信息 |
更新成员
Examples:
var result = yield api.updateUser(user);
User:
{
"userid": "zhangsan",
"name": "李四",
"department": [1],
"position": "后台工程师",
"mobile": "15913215421",
"gender": 1,
"tel": "62394",
"email": "zhangsan@gzdev.com",
"weixinid": "lisifordev",
"enable": 1
}
Result:
{
"errcode": 0,
"errmsg": "updated"
}
方法签名
方法 | exports.updateUser() | ||
参数 | user(Object) | 成员信息 |
删除成员
Examples:
var result = yield api.deleteUser(userid);
Result:
{
"errcode": 0,
"errmsg": "deleted"
}
方法签名
方法 | exports.deleteUser() | ||
参数 | id(Number) | 成员ID |
获取成员
Examples:
var result = yield api.getUser(userid);
Result:
{
"errcode": 0,
"errmsg": "ok",
"userid": "zhangsan",
"name": "李四",
"department": [1, 2],
"position": "后台工程师",
"mobile": "15913215421",
"gender": 1,
"tel": "62394",
"email": "zhangsan@gzdev.com",
"weixinid": "lisifordev",
"avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",
"status": 1
}
方法签名
方法 | exports.getUser() | ||
参数 | userid(Number) | 成员ID |
获取部门成员
Examples:
var result = yield api.getDepartmentUsers(departmentId, fetchChild, status);
Result:
{
"errcode": 0,
"errmsg": "ok",
"userlist": [
{
"userid": "zhangsan",
"name": "李四"
}
]
}
方法签名
方法 | exports.getDepartmentUsers() | ||
参数 | departmentId(Number) | 部门ID |
|
参数 | fetchChild(Number) | 值:1/0,是否递归获取子部门下面的成员 |
|
参数 | status(Number) | 0获取全部员工,1获取已关注成员列表,2获取禁用成员列表,4获取未关注成员列表。status可叠加 |
获取部门成员(详情)
Examples:
var result = yield api.getDepartmentUsersDetail(departmentId, fetchChild, status);
Result:
{
"errcode": 0,
"errmsg": "ok",
"userlist": [
{
"userid": "zhangsan",
"name": "李四",
"department": [1, 2],
"position": "后台工程师",
"mobile": "15913215421",
"email": "zhangsan@gzdev.com",
"weixinid": "lisifordev",
"avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",
"status": 1,
"extattr": {"attrs":[{"name":"爱好","value":"旅游"},{"name":"卡号","value":"1234567234"}]}
}
]
}
方法签名
方法 | exports.getDepartmentUsersDetail() | ||
参数 | departmentId(Number) | 部门ID |
|
参数 | fetchChild(Number) | 值:1/0,是否递归获取子部门下面的成员 |
|
参数 | status(Number) | 0获取全部员工,1获取已关注成员列表,2获取禁用成员列表,4获取未关注成员列表。status可叠加 |
邀请成员关注
详情:http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E6%88%90%E5%91%98#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8
Examples:
var result = yield api.inviteUser(userid, invite_tips);
Callback:
err
, 调用失败时得到的异常result
, 调用正常时得到的对象Result:
{
"errcode": 0,
"errmsg": "ok",
"type":1
}
方法签名
方法 | exports.inviteUser() | ||
参数 | userid(String) | userid |
|
参数 | invite_tips(String) | 邀请的一句话 |
根据Code获取用户ID
详情:http://qydev.weixin.qq.com/wiki/index.php?title=根据code获取成员信息
Examples:
var result = yield api.getUserIdByCode(code, agentid);
Result:
{
"UserId": "USERID"
}
方法签名
方法 | exports.getUserIdByCode() | ||
参数 | code(String) | OAuth授权获取的code |
|
参数 | agentid(String) | APP |
获取授权页面的URL地址
方法签名
方法 | exports.getAuthorizeURL() | ||
参数 | redirect(String) | 授权后要跳转的地址 |
|
参数 | state(String) | 开发者可提供的数据 |
|
参数 | scope(String) | 作用范围,值为snsapi_userinfo和snsapi_base,前者用于弹出,后者用于跳转 |