目录
为更好地保护企业与用户的数据,企业微信对代开发应用账号相关的ID和敏感信息权限将做全面的升级,涉及的ID有corpid、userid、external_userid与unionid。
基本的原则如下:
需要开发者重点关注的是,与第三方saas应用不同,本次id升级不区分是否新授权的企业。而是按照应用安装时间回收。2022年6月28日23点59分后, 授权的代开发应用返回的ID都为升级后的ID;对于历史授权的企业,所有接口与回调返回的ID暂时不变,后续再另行通知统一的升级时间,服务商可以提前为历史授权的企业将corpid、userid、external_userid进行转换,转换完成之后再调用设置迁移完成接口迁移到升级后的模式。
假设一个企业的明文corpid是CorpIdA。
升级之后,以服务商A为例,区分是否新安装的代开发应用,如果是新安装的代开发应用,则获取到密文CorpId, 取值等同于以第三方应用名义获取到的CorpId, 示意图如下:
所有接口无论是入参,还是返回结果,涉及corpid的字段名皆不变;所有回调事件,涉及corpid的字段名皆不变。
例如,获取企业永久授权码中,corpid字段在升级之后依然保持字段名为corpid。
例如,获取企业凭证中,auth_corpid字段在升级之后依然保持字段名为auth_corpid。
例如,变更授权通知中,AuthCorpId字段依然保持字段名AuthCorpId。
例如,成员关注及取消关注事件中,ToUserName字段在升级之后依然保持字段名为ToUserName。
在一些使用corpid作为url或小程序路径参数时,升级之后,参数名不变,仅需将参数值替换为升级后的ID。例如,微信进入居民上报小程序中,path参数中的strcorpid字段在升级之后依然保持字段名为strcorpid。
【注意】corpid明文不区分大小写,而corpid密文则大小写敏感,故使用corpid的地方,不能再转为纯小写或纯大写。
【重要】从2022年6月20日20点开始,对于新安装的代开发应用,将启用升级后的corpid。第三方应用理论上代码不需要做任何调整,即可兼容升级之后的corpid。
对于历史已授权的代开发应用,所有接口与回调返回的corpid仍然为明文corpid。服务商可以调用corpid转换将其转换为密文corpid,再调用设置迁移完成接口将该企业迁移到升级后的模式
用于将企业主体的corpid转换为服务商的密文corpid,服务商可通过第三方应用和代开发应用调用该接口。
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/corpid_to_opencorpid?provider_access_token=ACCESS_TOKEN
请求参数:
{
"corpid":"xxxxx"
}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
provider_access_token | 是 | 应用服务商的provider_access_token,获取方法参见服务商的凭证 |
corpid | 是 | 待获取的企业ID |
权限说明:
仅限第三方服务商,转换已获授权企业的corpid
返回结果:
{
"errcode":0,
"errmsg":"ok",
"open_corpid":"AAAAAA"
}
参数说明:
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
open_corpid | 该服务商第三方应用下的企业ID |
假设一个企业的明文userid是UserIdA。
升级之后,以服务商A为例,区分是否新安装的代开发应用,如果是新安装的代开发应用,则获取到密文userid, 取值等同于以第三方应用名义获取到的userid, 示意图如下:
所有接口无论是入参,还是返回结果,涉及userid的字段名皆不变;所有回调事件,涉及userid的字段名皆不变。
例如,获取部门成员中,userid字段在升级之后依然保持字段名为userid。
例如,日历接口中,organizer字段在升级之后依然保持字段名为organizer。
例如,成员通知事件中,UserID字段依然保持字段名UserID。
例如,成员关注及取消关注事件中,FromUserName字段在升级之后依然保持字段名为FromUserName。
在一些使用userid作为url或小程序路径参数时,升级之后,参数名不变,仅需将参数值替换为升级后的ID。例如,微信进入居民上报小程序中,path参数中的userid字段在升级之后依然保持字段名为userid。
【注意】userid明文不区分大小写,而userid密文则大小写敏感,故使用userid的地方,不能再转为纯小写或纯大写。
【重要】 从2022年6月20日20点开始,对于新授权的代开发应用,将启用升级后的userid。
对于历史已授权的代开发应用,所有接口与回调返回的userid仍然为明文userid。服务商可以调用userid转换将其转换为密文userid,再调用设置迁移完成接口将该企业迁移到升级后的模式
用于将企业明文的userid转换为服务商主体加密的open_userid,服务商可通过第三方应用和代开发应用调用该接口。
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/batch/userid_to_openuserid?access_token=ACCESS_TOKEN
请求参数:
{
"userid_list":["aaa", "bbb"]
}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 代开发自建应用或第三方应用的接口凭证 |
userid_list | 是 | 获取到的成员ID列表,最多不超过1000个 |
权限说明:
仅代开发自建应用或第三方应用可调用
成员需要在应用的可见范围内
请确保传入userid的正确性,若出错的次数较多,会导致1天不可调用,(具体限制阈值由授权企业的员工规模决定)
返回结果:
{
"errcode": 0,
"errmsg": "",
"open_userid_list": [
{
"userid": "aaa",
"open_userid": "xxxxx",
}
],
"invalid_userid_list":["bbb"]
}
参数说明:
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
open_userid_list | 该服务商第三方应用下的成员ID |
open_userid_list.userid | 转换成功的userid |
open_userid_list.open_userid | 转换成功的userid对应的该服务商应用下的成员ID |
假设一个用户同时属于三家企业的客户,这三家企业分别授权了服务商A与服务商B的应用。
升级之前,属于不同企业的同一个客户:
升级之后,新安装的代开发应用获取的external_userid跟第三方应用获取到的一样,具体如下:
所有接口无论是入参,还是返回结果,涉及external_userid的字段名皆不变;所有回调事件,涉及external_userid的字段名皆不变。
例如,获取客户详情中,external_userid字段在升级之后依然保持字段名为external_userid。
例如,企业客户事件中,ExternalUserID字段依然保持字段名ExternalUserID。
【重要】从2022年6月20日20点开始,对于新授权的代开发应用,将启用升级后的external_userid。对于历史已授权的代开发应用,服务商可以调用转换external_userid接口将其转换为升级后的external_userid,再调用设置迁移完成接口将该企业迁移到升级后的模式。
用于将企业主体的external_userid转换为服务商主体加密的external_userid,服务商可通过第三方应用和代开发应用调用该接口。
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_new_external_userid?access_token=ACCESS_TOKEN
请求参数:
{
"external_userid_list":["xxxxx","yyyyyy"]
}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证。服务商可通过“获取企业access_token”获得此调用凭证 |
external_userid_list | 是 | 旧外部联系人id列表,建议200个,最多不超过1000个 |
权限说明:
仅代开发自建应用或第三方应用可调用
客户联系和家校场景中,external_userid对应的跟进人需要在应用可见范围内
微信客服场景中,仅支持48小时内客服会话的external_userid
返回结果:
{
"errcode":0,
"errmsg":"ok",
"items":[
{
"external_userid":"xxxxx",
"new_external_userid":"AAAA"
},
{
"external_userid":"yyyyy",
"new_external_userid":"BBBB"
}
]
}
如果传入了新的external_userid,则原样返回。
参数说明:
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
new_external_userid | 新外部联系人id |
转换external_userid接口不支持客户群的场景,如果需要转换客户群中无好友关系的群成员external_userid,需要调用本接口,调用时需要传入客户群的chat_id。
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get_new_external_userid?access_token=ACCESS_TOKEN
请求参数:
{
"chat_id":"wrOgQhDgAAMYQiS5ol9G7gK9JVAAAA",
"external_userid_list":["xxxxx","yyyyyy"]
}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证。服务商可通过“获取企业access_token”获得此调用凭证 |
chat_id | 是 | 客户群ID |
external_userid_list | 是 | 旧外部联系人id列表,最多不超过1000个 |
权限说明:
仅代开发自建应用或第三方应用可调用
客户群的群主需要在应用可见范围内
返回结果:
{
"errcode":0,
"errmsg":"ok",
"items":[
{
"external_userid":"xxxxx",
"new_external_userid":"AAAA"
},
{
"external_userid":"yyyyy",
"new_external_userid":"BBBB"
}
]
}
如果传入了新的external_userid,则原样返回。
参数说明:
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
new_external_userid | 新外部联系人id |
为了更好的保护微信用户的隐私,企业微信接口将不再返回企业客户的微信unionid。服务商需要在企业客户在微信中使用服务时,根据从微信开放平台获取的unionid与openid,调用企业微信提供的转换接口,查询出对应的微信用户external_userid。
从2022年6月20日20点开始新授权代开发应用不再返回unionid。如果为历史授权企业调用接口设置迁移完成,该企业也将不再返回unionid。
场景一:用户使用企业主体的小程序或公众号
当微信用户在微信中使用的小程序或公众号是第三方服务商为企业代开发的,其主体为授权的企业,此时可调用企业主体unionid转换为第三方external_userid接口转换为代开发应用升级后的external_userid。
场景二:用户使用第三方主体的小程序或公众号
当微信用户在微信中使用第三方应用的小程序或公众号时,第三方可将获取到的unionid与openid,调用第三方主体unionid转换为第三方external_userid接口转换为企业客户或学生家长的external_userid。
注意:以上两个接口调用频次有限,每个服务商每小时仅可调用5万次,每天仅可调用24万次,应由用户的主动行为来触发查询(例如用户进入小程序时触发),严禁批量进行ID转换,如有发现违规行为,将封禁服务商的接口调用权限。同时对于场景二,建议服务商的小程序路径或公众号页面链接带上corpid参数,如此可明确地转换出该企业对应的external_userid,以获得更好的性能。
服务商完成了代开发应用的新旧id(userid/corpid/external_userid)的迁移,即可主动将该企业设置为“迁移完成”,设置之后,该代开发应用获取到的将是升级后的id。注意,该接口需要使用provider_access_token来调用。
注意:
1. 当该企业同时是服务商, 并对自己授权的情况,无需调用本接口。
2. 设置迁移完成后,接口不再吐出unionid。
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/service/finish_openid_migration?provider_access_token=ACCESS_TOKEN
请求参数:
{
"corpid":"xxxxx",
"agentid":1111,
"openid_type":[
1,3
]
}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
provider_access_token | 是 | 应用提供商的provider_access_token,获取方法参见服务商的凭证 |
corpid | 是 | 企业corpid |
agentid | 是 | 企业代开发应用id |
openid_type | 是 | id类型:1-userid与corpid; 3-external_userid |
注:
1.userid与corpid只能同时设置为升级模式,external_userid可以单独升级。
2.此接口还可为第三方应用设置迁移完成状态,若只传入正确corpid,未传入代开发应用agentid,则视为:更新该企业下同服务商所有第三方应用的对应升级状态。
权限说明:
该企业授权了该服务商代开发应用
返回结果:
{
"errcode":0,
"errmsg":"ok"
}
参数说明:
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
新授权代开发应用或代开发应用设置迁移完成后,均可能会返回新的openid,服务商可使用此接口查询回收状态,注意与设置迁移完成接口不同,该接口需要使用应用access_token来调用。
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/corp/get_openid_migration?access_token=ACCESS_TOKEN
参数说明:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 应用access_token,获取方法参见“获取企业access_token” |
权限说明:
仅代开发自建应用和第三方应用可以调用
返回结果:
{
"errcode": 0,
"errmsg": "",
"migration_info" :
[
{
"openid_type": 1,
"status": 0
},
{
"openid_type": 3,
"status": 1
}
]
}
参数说明:
参数 | 说明 |
---|---|
errcode | 返回码 |
errmsg | 对返回码的文本描述内容 |
migration_info.openid_type | id类型:1-corpid/userid,3-external_userid |
migration_info.status | id回收状态:0-未升级,1-已升级 |
升级后,2022年6月20日20点起,新授权的代开发应用,成员信息权限调整为成员基本信息和成员敏感信息。
企业管理员确认后,可通过接口直接获取成员基本信息,包括:姓名、部门名、职务、座机、对外职务、对外属性和拓展属性。
相关接口:读取成员、获取部门成员详情、导出成员详情
企业管理员确认且员工手动授权后,可获取个人敏感信息,包括:头像、性别、手机号、邮箱、企业邮箱、地址和员工企业微信二维码。
注意:企业管理员确认后,并不能通过通讯录接口直接获取到成员敏感信息,需要成员在oauth2授权登录时,通过「获取访问用户敏感信息」接口获取。
历史已授权的代开发应用,成员敏感信息权限暂时保持不变,服务商可继续调用通讯录接口获取员工敏感信息。
从2022 年6月28日23点开始,所有代开发应用将返回服务商主体加密的corpid、userid和external_userid,且无法直接通过后台接口获取手机号等敏感信息。
推荐方案:
基于企业微信开发时,存在三种 “应用对接场景”:
代开发应用将无法通过接口从企业微信获取客户 unionid(如果代开发应用没有依赖 unionid,则无影响)。
推荐方案:
新授权的代开发应用,不能直接通过接口直接获取包括邮箱、手机号在内的员工敏感信息。企业管理员确认后,需要成员在oauth2登录时主动授权。
推荐方案:
企业微信内应用登录的身份标识,应基于无需用户授权的第三方服务商主体下的userid,并实现应用的基本功能。在此基础上,应用可基于合理必要的场景,向用户申请敏感信息授权。
推荐方案:
第三方服务商不可通过企业自建应用及企业“管理工具 - 通讯录同步”的secret违规获取企业通讯录数据,服务商需要通过第三方应用或代开发应用为企业开发应用。