企业微信允许多个企业关联同一个小程序,但是开发者在开发过程中需要注意以下几点:
- 小程序被关联到多个企业即会有多组[corpid, Secret],开发者可以使用任意一个企业的[corpid, Secret]获取access_token
- 使用获取到的access_token和code参数调用jscode2session接口
- 第二步调用会返回当前用户所在真实的corpid,如果与第一步所使用的corpid不一致,则使用真实的corpid重新进行一遍登录流程
- 如果没有使用这种流程,调用企业微信通讯录相关的接口时,会报错 “not allow to cross corp”。
1.获取企业 access_token(corpid 是 企业ID,corpsecret 是 应用的凭证密钥)
请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
{
"errcode":0,
"errmsg":"",
"access_token": "accesstoken000001",//获取到的凭证
"expires_in": 7200//凭证有效时长(秒)
}
2.通过临时登录凭证校验接code2Session,获取 session_key、用户userid以及用户所在企业微信的corpid等信息(access_token、code【开发者服务器使用临时登录凭证】、grant_type【此处固定为authorization_code】)
注意:access_token必须是与小程序关联的企业微信应用secret所获得
//正常返回的JSON数据包
{
"corpid": "CORPID",//用户所属企业的corpid
"userid": "USERID",// 用户在企业内的UserID,对应管理端的帐号,企业内唯一。注意:如果该企
//业没有关联该小程序,则此处返回加密的userid
"session_key": "kJtdi6RF+Dv67QkbLlPGjw==",//会话密钥
"errcode": 0,
"errmsg": "ok"
}
//错误时返回JSON数据包(示例为Code无效)
{
"errcode": 40029,
"errmsg": "invalid code"
}
注意:
- 企业微信的jscode2session请求url与微信的不同
- 企业微信的jscode2session返回的是userid,而微信返回的是openid
- 获取access_token时请使用企业的corpid参数,请勿使用小程序的appid
- 会话密钥 session_key 是对用户数据进行加密签名的密钥,为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
总结:
一个小程序可以关联多个企业微信,但是如果想正确的获取每个企业的信息需要:
1.任意一个企业的[corpid, Secret]获取access_token
2.通过临时登录凭证校验接口获取当前用户所在的企业corpid、用户Userid
3.判断企业corpid是否与登录凭证校验接口用到的corpid一致,如果不一致重新进行登录验证及可。
每个企业的应用(例如:XX小程序)access_token是彼此独立的,所以一个小程序在不同企业使用时,服务商进行access_token缓存时需要区分企业(corpid)来进行缓存,企业微信可能会出于运营需要,提前使access_token失效,开发者应实现access_token失效时重新获取的逻辑。