微信企业号是微信为企业客户提供的移动服务,旨在提供企业移动应用入口。它可以帮助企业建立员工、上下游供应链与企业IT 系统间的连接。利用企业号,企业或第三方服务商可以快速、低成本的实现高质量的企业移动轻应用,实现生产、管理、协作、运营的移动化。
公司微信申请企业号后就没怎么用过,只是作为管理员需要添加同事时需要扫下码验证,对于企业号的存在意义及使用场景没有切身体会,这才有了在实现项目需求过程中踩了些坑,整理下细节事项,避免后续再被绊倒。
菜单项在「应用中心」配置;通过「通讯录」管理哪些同事有权限看到菜单;用户查看菜单链接时微信通过「权限管理组」把认证的用户信息回调给开发者;这样就完成了查看菜单的权限在微信端搞定,跳转至菜单链接时传来微信的认证接力信息,菜单链接内的权限由开发者根据业务需求自行控制;下面的笔记就是来记录实现这段认证逻辑的中注意事项。
通讯录
可以邀请关注,也可以直接新增成员;通讯录一定要录入,同时用户也要关注企业号,二者缺一不可。
强调的是一定要把手机号或邮箱录入,微信认证成功响应的用户信息就是这里配置的信息,业务权限上的关联只能通过手机号或邮箱(本项目中是使用邮箱)。
通讯录中的组织架构或标签对后续操作影响不大,人少时直接添加用户,人多时使用标签、组织快捷些。
菜单项
「可见范围」是对企业号内查看菜单项的权限配置,应该细致些,否则同事有权限看到菜单但点击进入又提示无权限会引来电话询问的。
「主页URL」是核心,是通过呼叫微信的接口回调至自家项目的链接,注意事项如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数 | 必须 | 说明 |
---|---|---|
appid | 是 | 企业的CorpID |
redirect_uri | 是 | 授权后重定向的回调链接地址, 请使用urlencode对链接进行处理 |
response_type | 是 | 返回类型,此时固定为:code |
scope | 是 | 应用授权作用域,此时固定为:snsapi_base |
state | 否 | 重定向后会带上state参数, 企业可以填写a-zA-Z0-9的参数值, 长度不可超过128个字节 |
#wechat_redirect | 是 | 微信终端使用此参数判断是否需要带上身份信息 |
具体配置可参考文档:企业号开发者中心 - OAuth2.0验证接口说明。
企业的 CorpID 可以在「设置」「企业号信息」模块下看到;不要把测试环境(自家企业号)的主页URL 拷贝至客户就行了,切记一定要修改 CorpID 为客户企业号的。
「可信域名」就是回调函数中传参数的链接域名或 ip。
权限管理组
若上述配置成功,在从微信菜单项跳转至自家链接时,微信会给点击访问菜单的用户临时分配一串值,通过 code
参数追加在菜单链接后面,微信认证的流程开始了。
获取 access_token
get https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
reponse
{
"access_token": "accesstoken000001",
"expires_in": 7200
}
参数 | 必须 | 说明 |
---|---|---|
corpid | 是 | 企业Id |
corpsecret | 是 | 管理组的凭证密钥 |
具体配置可参考文档:企业号开发者中心 - 获取AccessToken
corpid
是企业号的属性,很容易获取, corpsecret
是哪来的,答案是来自权限管理组。
如果对「权限管理组」不了解,不要擅自对已创建的管理组修改,建议新建管理组。
「应用权限」选择「应用中心」创建的菜单项,可多选。
「通讯录权限」此处选择的通讯录范围应该大于或等于「应用中心」中配置的「可见范围」,这样建议的前提是牢牢把关好「可见范围」。
「CorpID」企业号内所有出现的值都是一致的。
「Secret」对权限管理组是唯一分配的,并与「通讯录权限」紧密关联;「应用中心」「可见范围」大于「权限管理」「通讯录权限」的那部分用户就无法通过微信接口获取该用户的信息。
访问菜单项的用户信息
get https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
response
// 企业成员授权时
{
"UserId":"USERID",
"DeviceId":"DEVICEID"
}
// 非企业成员授权时
{
"OpenId":"OPENID",
"DeviceId":"DEVICEID"
}
非企业号成员授权时,直接提示权限受限信息;企业号授权成员继续。
�get https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=USERID
response
{
"errcode": 0,
"errmsg": "ok",
"userid": "zhangsan",
"name": "李四",
"department": [1, 2],
"position": "后台工程师",
"mobile": "15913215421",
"gender": "1",
"email": "zhangsan@gzdev.com",
"weixinid": "lisifordev",
"avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",
"status": 1,
"extattr": {"attrs":[{"name":"爱好","value":"旅游"},{"name":"卡号","value":"1234567234"}]}
}
具体配置可参考文档:企业号开发者中心 - 获取成员
到此就获取到了访问者的邮箱,再到本地数据库中匹配,若未查询到或业务权限不足,继续提示更明细的权限受限原因;有权限,就可以看到该用户权限内的内容。
切换环境或企业号配置时,切记清除旧的 access_token 缓存,使用新的 corpid/secret 重新获取并更新缓存。
琐碎细节
去除微信页面安全风险提示
企业号从名字就能看出来品牌很重要,通过自家企业号菜单访问的网页竟然提示什么安全风险,客户无论如何是接受不了的;当然在测试阶段就优化掉了,让客户少说话多点头,这样大家都轻松。
企业号内无「业务域名」模块,很疑惑这样合理吗,公众号(订阅号)什么场景需要业务域名呢?
每个公众号只支持三个业务域名,若企业号项目很多时,建议由客户的公众号来配置此类操作,合理使用资源。
access_token
有效期两小时,有效期内响应的值不变;定时任务要尽量频率快,比较是否过期,而不是与微信接口多交互。
code
是临时的,但 UserID
是固定的,可以把用户的明细信息缓存下来,后续就少了一次微信接口交互,本地访问肯定更高效些;但要记得定时刷新用户信息,万一后台用户信息的联系方式有调整呢;高效性与及时性的平衡要权重好。