序:
- 你注意,这篇讲的是企业授权后获取成员二维码
- 你要有心理准备,因为流程会是从先获取部门=》在获取成员=》在获取二维码,如果这不是你想要的,到这里就可以打住别往下看
- 博文除了会写如何生成成员二维码外,还会写到如何获取成员30天里,每天新增多少客户统计。
- 雪狼是eggjs的后端(node后端)。
流程:
应用suite_access_token的获取=》获取企业凭证=》获取子部门ID列表=》获取部门成员=》生成二维码(博主理解,二维码可以临时,也可以永久!你也可以看官网的解释,他默认生成的是永久才对,这也是个人理解,下文会配官网对应文档)
其实获取部门成员的id数组后你可以选中生成二维码或者统计该成员过去30天加了多少客户
正文
准备工作,你这时候,需要先有两个东西
- 对方企业微信永久授权码permanent_code
- 对方企业微信corpid
- 然后就是自己企业的SuiteID、Secret、httpspost那边收到的推送解密的suite_ticket。
这两个数据,在雪狼另一篇博文里有提怎么获取==》企业微信第三方应用获取永久授权(全流程教程)-CSDN博客
一、应用suite_access_token的获取
官方文档=》获取第三方应用凭证 - 接口文档 - 企业微信开发者中心
async accessTokenFun(){
let m = this,
{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token', {
method: 'POST',
data: {
"suite_id":this.SuiteID ,
"suite_secret":this.Secret,
"suite_ticket": this.suite_ticket
},
contentType: 'json',
dataType: 'json',
});
m.suite_access_token=result.data.suite_access_token;
await m.get_access_token();
}
3个参数
参数 | 是否必须 | 说明 |
---|---|---|
suite_id | 是 | 第三方应用id或者代开发应用模板id。第三方应用以ww或wx开头应用id(对应于旧的以tj开头的套件id);代开发应用以dk开头 |
suite_secret | 是 | 第三方应用secret 或者代开发应用模板secret |
suite_ticket | 是 | 企业微信后台推送的ticket |
别在问我ticket 怎么获取的了,去看这篇==》node企业微信代开发模板url的 Http Post业务回调-解决方案-CSDN博客
二、获取企业凭证
官方文档=》获取企业凭证 - 接口文档 - 企业微信开发者中心
async get_access_token(){
let m = this,{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token='+m.suite_access_token, {
method: 'POST',
data: {
auth_corpid:this.corpid,
permanent_code:this.permanent_code
},
contentType: 'json',
dataType: 'json',
});
this.access_token=result.data.access_token
await this.simplelist();
}
参数 | 是否必须 | 说明 |
---|---|---|
auth_corpid | 是 | 授权方corpid |
permanent_code | 是 | 永久授权码,通过get_permanent_code获取 |
拿到access_token 我们要用来获取部门列表
三、获取子部门ID列表
官方文档=》https://developer.work.weixin.qq.com/document/path/95350
在这之前记得把权限都打开在服务商后台>应用管理>选自己的应用>应用权限
注意!你得先有部门!!!
要到被授权的企业后台,先新建一个部门,在拉一个成员进来
被授权的企业要修改下,可见范围
选中要被测试的这个部门。
async simplelist(){
let m = this,{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token='+m.access_token, {
method: 'get',
data: {
},
contentType: 'json',
dataType: 'json',
});
//department_id 是一个数组,会有多个部门,记得在可见范围那加入部门
let departmentArr=result.data.department.filter((v,i)=>{
return v.parentid
})
this.department_id=departmentArr[0].id//部门id
await this.simpleUserlist();
}
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
id | 否 | 部门id。获取指定部门及其下的子部门(以及子部门的子部门等等,递归)。 如果不填,默认获取全量组织架构 |
department 是一个数组,可能会拉到公司这一级别,公司这一级别的parentid=0,id是1,而我新建的部门parentid是1,所以我return 0是false,return 1是true,来赛选子部门
上面代码,我们就获得了部门1的部门id(我只是方便测试,当然你最好跟着我先把全流程走完,你要改自己再去改多个部门)
四、获取部门成员
官方文档=》获取部门成员 - 接口文档 - 企业微信开发者中心
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
department_id | 是 | 获取的部门id |
async simpleUserlist(){
let m = this,{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token='+m.access_token+'&department_id='+this.department_id, {
method: 'get',
data: {
},
contentType: 'json',
dataType: 'json',
});
let userlist=result.data.userlist
let userIdArr=result.data.userlist.map(x=>x.userid)
// m.add_contact_way(userIdArr);//二维码
m.get_user_behavior_data(userIdArr);
}
拿到的userlist 是一个成员对象的数组,而我们只要成员id的数组,所以要处理下,让他变成[userId,userId....]的结构
五、配置客户联系「联系我」方式(主要拿来获取成员二维码)
官方文档=》客户联系「联系我」管理 - 接口文档 - 企业微信开发者中心
应用类型 | 权限要求 |
---|---|
自建应用 | 配置到「客户联系 可调用接口的应用」中 |
代开发应用 | 具有「配置「联系我」二维码」权限 |
第三方应用 | 具有「配置「联系我」二维码」权限 |
async add_contact_way(userIdArr){
let m = this,{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_contact_way?access_token='+m.access_token, {
method: 'POST',
data: {
type:2,//联系方式类型,1-单人, 2-多人
scene:2,//场景,1-在小程序中联系,2-通过二维码联系
user:userIdArr
},
contentType: 'json',
dataType: 'json',
});
let qr_code=result.data.qr_code//二维码
debugger
}
userIdArr就是我们上一步获取的部门成员的id数组了,我还是上一个参数对照表说明吧。
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
type | 是 | 联系方式类型,1-单人, 2-多人 |
scene | 是 | 场景,1-在小程序中联系,2-通过二维码联系 |
style | 否 | 在小程序中联系时使用的控件样式,详见附表 |
remark | 否 | 联系方式的备注信息,用于助记,不超过30个字符 |
skip_verify | 否 | 外部客户添加时是否无需验证,默认为true |
state | 否 | 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情”时会返回该参数值,不超过30个字符 |
user | 否 | 使用该联系方式的用户userID列表,在type为1时为必填,且只能有一个 |
party | 否 | 使用该联系方式的部门id列表,只在type为2时有效 |
is_temp | 否 | 是否临时会话模式,true表示使用临时会话模式,默认为false |
expires_in | 否 | 临时会话二维码有效期,以秒为单位。该参数仅在is_temp为true时有效,默认7天,最多为14天 |
chat_expires_in | 否 | 临时会话有效期,以秒为单位。该参数仅在is_temp为true时有效,默认为添加好友后24小时,最多为14天 |
unionid | 否 | 可进行临时会话的客户unionid,该参数仅在is_temp为true时有效,如不指定则不进行限制 |
is_exclusive | 否 | 是否开启同一外部企业客户只能添加同一个员工,默认为否,开启后,同一个企业的客户会优先添加到同一个跟进人 |
conclusions | 否 | 结束语,会话结束时自动发送给客户,可参考“结束语定义”,仅在is_temp为true时有效 |
六、获取「联系客户统计」
官方文档=》获取「联系客户统计」数据 - 接口文档 - 企业微信开发者中心
async get_user_behavior_data(userIdArr){
let m = this,{app} = m;
let nowTime=parseInt(new Date().getTime()/1000);
let dey7=nowTime-3600*24*7
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_user_behavior_data?access_token='+m.access_token, {
method: 'POST',
data: {
userid:userIdArr,
start_time:dey7,
end_time:nowTime
},
contentType: 'json',
dataType: 'json',
});
let arr=[]
result.data.behavior_data.forEach((v,i)=>{
arr.push({
time:v.stat_time,
add:v.new_contact_cnt
})
})
}
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
userid | 否 | 成员ID列表,最多100个 |
partyid | 否 | 部门ID列表,最多100个 |
start_time | 是 | 数据起始时间 |
end_time | 是 | 数据结束时间 |
start_time和end_time 是"秒"不是"毫秒"记住了!!!
他可以是统计成员,也可以是统计部门,咱这里是以成员来统计的。
behavior_data拿到手是数组,而且stat_time是按天来算的就算你传的现在的比如今天是12月1号9点,他也只会统计到12月1号0点,你懂吗,就算你现在加了一个人,这只能明天才能调接口才能统计到今天的数据。
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
behavior_data.stat_time | 数据日期,为当日0点的时间戳 |
behavior_data.new_apply_cnt | 发起申请数,成员通过「搜索手机号」、「扫一扫」、「从微信好友中添加」、「从群聊中添加」、「添加共享、分配给我的客户」、「添加单向、双向删除好友关系的好友」、「从新的联系人推荐中添加」等渠道主动向客户发起的好友申请数量。 |
behavior_data.new_contact_cnt | 新增客户数,成员新添加的客户数量。 |
behavior_data.chat_cnt | 聊天总数, 成员有主动发送过消息的单聊总数。 |
behavior_data.message_cnt | 发送消息数,成员在单聊中发送的消息总数。 |
behavior_data.reply_percentage | 已回复聊天占比,浮点型,客户主动发起聊天后,成员在一个自然日内有回复过消息的聊天数/客户主动发起的聊天数比例,不包括群聊,仅在确有聊天时返回。 |
behavior_data.avg_reply_time | 平均首次回复时长,单位为分钟,即客户主动发起聊天后,成员在一个自然日内首次回复的时长间隔为首次回复时长,所有聊天的首次回复总时长/已回复的聊天总数即为平均首次回复时长,不包括群聊,仅在确有聊天时返回。 |
behavior_data.negative_feedback_cnt | 删除/拉黑成员的客户数,即将成员删除或加入黑名单的客户数。 |
好了,原创不易,35了,在做不了几年教程了,切看且珍惜吧
文章原创,雪狼原创表情包在最底下,欢迎下载。
扩展阅读
1、小程序手机号授权登录(图文教程)
2、短信验证码收不到-解决方案
3、vue3ts的透传$attrs用法
4、vue3 清空/重置reactive
5、vite打包可视化工具rollup-plugin-visualizer图文教程
6、vue3 h函数使用图文教程
7、抖音跳微信小程序(抖音分享卡片和链接)图文教程
8、pinia 持久化插件pinia-plugin-persistedstate 安装、使用(图文详解)
9、uni-app 生成安卓证书
10、uniapp小程序限制微信群访问(图文教程)
11、前端常见4种缓存方式(图文教程)
12、es6~es13 新增数组遍历一览
13、禁debugger调试网页,禁F12(完整教程)
14、常用的19个正则-表单验证
15、报错状态码 200 300 400 500
16、周公解梦功能(附数据)
17、node开发微信群聊机器人第⑮章
18、node开发微信群聊机器人第⑭章
19、node开发微信群聊机器人第⑬章
20、Linux安装node18完整图文教程
21、VMware虚拟机、linux安装图文教程
22、我把微信群聊机器人项目开源
23、node开发微信群聊机器人第⑫章
24、node开发微信群聊机器人第⑪章
25、node开发微信群聊机器人第⑩章
26、node开发微信群聊机器人第⑨章
27、node开发微信群聊机器人第⑧章
28、node开发微信群聊机器人第⑦章
29、node开发微信群聊机器人第⑥章
30、公众号涨粉攻略(阳谋)
31、公众号涨粉攻略(阴谋)
32、node开发微信群聊机器人第⑤章
33、node开发微信群聊机器人第④章
34、node开发微信群聊机器人第③章
35、用node开发微信群聊机器人第②章
36、用node开发微信群聊机器人第①章
雪狼原创表情包
1、【我很凶】微信表情 - 来自微信表情商店,扫二维码下载表情