2023年11月28日发(作者:)

企业微信开发-⽹页授权及JS-SDK计⼊流程

企业微信开发之授权登录注意事项:

1.⽹页授权及JS-SDK需要在企业微信上配置可信域名

2.企业微信授权登录⾥⾯填写你的可信域名

调⽤流程为:

A) ⽤户访问第三⽅服务,第三⽅服务通过构造OAuth2链接(参数包括当前第三⽅服务的⾝份ID,以及重定向URI),将⽤户引导到认证服

务器的授权页

B) ⽤户选择是否同意授权

C) 若⽤户同意授权,则认证服务器将⽤户重向到第⼀步指定的重定向URI,同时附上⼀个授权码。

D) 第三⽅服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。

E) 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调⽤凭证)

OAuth2接⼊流程

使⽤OAuth2前须知

关于⽹页授权的可信域名

REDIRECT_URL中的域名,需要先配置⾄应⽤的可信域名,否则跳转时会提⽰“redirect_uri参数错误

要求配置的可信域名,必须与访问链接的域名完全⼀致。举个例⼦:

假定重定向访问的链接是::8080/cgi-bin/helloworld

配置域名 是否正确 原因

:8080 配置域名与访问域名完全⼀致

配置域名必须与访问域名完全⼀致

配置域名必须与访问域名完全⼀致

*. 不⽀持泛域名设置

配置域名必须与访问域名完全⼀致,包括端⼝号

假定配置的可信域名是

访问链接 是否正确 原因

/cgi-bin/helloworld 配置域名与访问域名完全⼀致

/cgi-bin/redirect 配置域名与访问域名完全⼀致,与协议头/链接路径⽆关

/cgi-bin/helloworld 配置域名必须与访问域名完全⼀致

关于UserID机制

UserId⽤于在⼀个企业内唯⼀标识⼀个⽤户,通过⽹页授权接⼝可以获取到当前⽤户的UserId信息,如果需要获取⽤户的更多信息可以调⽤

通讯录管理 - 成员接⼝ 来获取。

缓存⽅案建议

通过OAuth2.0验证接⼝获取成员⾝份会有⼀定的时间开销。对于频繁获取成员⾝份的场景,建议采⽤如下⽅案:

1、企业应⽤中的URL链接直接填写企业⾃⼰的页⾯地址

2、成员操作跳转到步骤1的企业页⾯时,企业后台校验是否有标识成员⾝份的cookie信息,此cookie由企业⽣成

3、如果没有匹配的cookie,则重定向到OAuth验证链接,获取成员的⾝份信息后,由企业后台植⼊标识成员⾝份的cookie信息

4、根据cookie获取成员⾝份后,再进⼊相应的页⾯

构造⽹页授权链接

如果企业需要在打开的⽹页⾥⾯携带⽤户的⾝份信息,第⼀步需要构造如下的链接来获取code参数:

/connect/oauth2/authorize?

appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

参数说明:

参数 必须 说明

appid 企业的CorpID

redirect_uri 授权后重定向的回调链接地址,请使⽤urlencode对链接进⾏处理

response_type 返回类型,此时固定为:code

scope

应⽤授权作⽤域。

snsapi_base:静默授权,可获取成员的基础信息;

snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含⼿机、邮箱;

snsapi_privateinfo:⼿动授权,可获取成员的详细信息,包含⼿机、邮箱。

state 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节

#wechat_redirect 终端使⽤此参数判断是否需要带上⾝份信息

agentid 企业应⽤的id

scopesnsapi_userinfosnsapi_privateinfo时,该参数必填。

注意redirect_uri的域名必须与该应⽤的可信域名⼀致。

员⼯点击后,页⾯将跳转⾄ redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员⼯的useridcode长度最⼤为512字节。

权限说明:

企业⽆限制;第三⽅使⽤snsapi_privateinfoscope时,应⽤必须有成员敏感信息授权的权限。

根据code获取成员信息

请求⽅式:GETHTTPS

请求地址:/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE

参数说明:

参数 必须 说明

access_token 调⽤接⼝凭证

code 通过成员授权获取到的code,最⼤为512字节。每次成员授权带上的code将不⼀样,code只能使⽤⼀次,5分钟未被使⽤⾃动过

期。

权限说明:

跳转的域名须完全匹配access_token对应应⽤的可信域名。

返回结果:

a) 当⽤户为企业成员时返回⽰例如下:

{

"errcode":0,

"errmsg":"ok",

"UserId":"USERID",

"DeviceId":"DEVICEID",

"user_ticket":"USER_TICKET"

"expires_in":7200

}

参数 说明

errcode 返回码

errmsg 对返回码的⽂本描述内容

UserId 成员UserID

DeviceId ⼿机设备号(由企业微信在安装时随机⽣成,删除重装会改变,升级不受影响)

user_ticket 成员票据,最⼤为512字节。

scopesnsapi_userinfosnsapi_privateinfo,且⽤户在应⽤可见范围之内时返回此参数。

后续利⽤该参数可以获取⽤户信息或敏感信息。

expires_in user_token的有效时间(秒),随user_ticket⼀起返回

⾮企业成员授权时返回⽰例如下:

{

"errcode":0,

"errmsg":"ok",

"OpenId":"OPENID",

"DeviceId":"DEVICEID"

}

参数 说明

errcode 返回码

errmsg 对返回码的⽂本描述内容

OpenId ⾮企业成员的标识,对当前企业唯⼀

DeviceId ⼿机设备号(由企业微信在安装时随机⽣成,删除重装会改变,升级不受影响)

出错返回⽰例:

{

"errcode":40029,

"errmsg":"invalid code"

}

实现代码:

package ller;

import Token;

import ;

import QiYeConstants;

import QiYeUtil;

import ;

import Factory;

import ller;

import tMapping;

import tParam;

import rvletRequest;

import ssion;

import ortedEncodingException;

/**

* 单纯实现OAuth2验证,不使⽤注解及拦截器

* Created by zhaoxinguo on 2017/7/11.

*/

@Controller

/**

* 调⽤接⼝获取⽤户信息

*

* @param token

* @param code

* @return

*/

public String getMemberGuidByCode(String token, String code, String agentId) {

("code==" + code + " token=" + token + " agentId=" +agentId);

Result result = 2GetUserByCode(token, code, agentId);

("result= " + result);

if (code().equals("0")) {