最近开发了一个小程序接入企业微信的需求,企业微信的权限限制诸多,网上的完整示例又少之又少,因此踩了比较多坑,与大家分享。
开发调试
在开发者工具中如果直接使用微信小程序模式,调用wx.qy接口会提示不存在,需要安装企业微信小程序模拟器插件
1. 添加企业微信模拟器插件
2. 切换企业微信小程序模式
注意:某些api模拟器也不支持,需要真机调试
3. 打开多场景调试
用企业微信扫小程序开发码,开启多场景调试。开启之后,在附件栏、工具栏、会话、工作台等场景打开此小程序时,都将使用本次扫码的开发版小程序来运行。
这个功能很好的解决了从其他入口无法进入开发版的问题,但开发调试的过程还是比较麻烦的
企业微信端小程序登录流程和微信端小程序登录不同
一开始是想调用wx.qy.selectExternalContact获取外部联系人信息,本以为有现成的api可以解决很简单,但直接调用一直调不通,提示session过期,才看到这个api的调用前提:
调用前提:
必须先调用过wx.qy.login,且session_key未过期,开发者可调用checkSession 检查当前登录态
当前成员必须在应用的可见范围
wx.qy.login
与wx.login
的用法类似,但企微端的登录和微信端的登录是两套不通的流程
- 微信端小程序登录
- 企微端小程序登录
注:
- 企业微信端也是支持wx.login的,如只需使用wx.xx(微信端api)不需要走企业微信登录。
- 如需获取到当前企业微信用户在当前企业的员工身份信息、联系人信息等企业微信相关用户信息,则必须走企业微信登录流程。
access_token必须是与小程序关联的企业微信应用secret所获得
在调用jscode2session接口走登录流程的时候,一直提示没有权限,看了下接口的权限说明:
权限说明:
access_token必须是与小程序关联的企业微信应用secret所获得。
如果没有开发过企业微信应用,可能会对这句话费解,这个概念如果没有从头看起很容易混淆。
一开始用的是企业微信本身的secrect不行,后来在论坛上查询相关帖子说是要用小程序的secrect,但要注意这里指的secrect并不是小程序本身的AppSecrect,而是在企业微信后台创建的关联了小程序的应用的secrect,可以在企业微信后台应用管理中点击查看,发送Secret到企业微信中查看。
secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥。分为以下几种:
- 自建应用secret
- 基础应用secret
- 通讯录管理secret
- 外部联系人管理secret
建议开发前先阅读文档了解清楚这些基本概念
API权限
如果在调用客户管理相关API提示没有权限的话,先来看一下接口的权限说明:
权限说明:
- 企业需要使用客户联系secret或配置到可调用应用列表中的自建应用secret所获取的accesstoken来调用
- 第三方应用需具有“企业客户权限->客户基础信息”权限
- 第三方/自建应用只能获取到可见范围内的配置了客户联系功能的成员。
可以从以下方面排查:
1. 获取accesstoken的secrect有没有用对
- 一种方法是可以直接使用客户联系secrect:
- 如果使用的是自建应用的secrect,还需要把当前应用配置到客户联系可调用列表:
2. 获取客户联系的成员是否配置应用可见范围
3. 是否配置了客户联系功能权限:
可以感受到企业微信为了保护客户的隐私信息,做了很多的权限控制,有一套完善的权限体系:
大致的调用流程如下图所示:
企业可信ip
当已经用正确的secrect获取到accesstoken后,调用接口又提示了报错:
{
"errcode": 60020,
"errmsg": "not allow to access from your ip, hint: [xxx], from ip: xx.xx.xx.xx,...
}
需要在企业微信后台配置应用的可信ip,只有配置了可信ip,才能够调到企业微信的接口。
而在配置企业可信ip前,必须要先设置可信域名 或 设置接受消息服务器URL (即使你并不需要用到…)
设置可信域名需完成域名归属认证 ,即在域名根目录上传小程序校验文件
配置完可信ip之后,终于能调通了。
总结
- 开始企业微信开发前先阅读官方文档开发指南,了解清楚基本概念、开发流程、配置方法,也便于后续阅读接口文档相关术语的理解。
- 开发者工具需安装企微插件用于调试部分企微api,对于工具无法模拟的场景需要真机开启多场景调试。
- 调用企业微信相关接口前,需仔细阅读接口的调用前提和权限说明。
- 调用openApi时,需要走企业微信内小程序登录流程、配置相关权限、配置企业可信ip。
- 不知道为啥接口调用失败可以使用错误码查询工具,在接口请求url里加上debug=1参数之后从接口返回的errmsg复制出hint值查询。