概述
access token(访问令牌)是一种用于身份验证和授权的令牌。 软件开发中,访问令牌通常用于访问受限资源或执行特定操作。 Access Token通常由身份验证服务器颁发,以授权客户端应用程序代表用户访问受保护的资源。 当用户进行身份验证并授权后,身份验证服务器会颁发一个Access Token给客户端应用程序。 客户端应用程序可以将Access Token附加到每个请求中,以便在服务器上进行身份验证和授权验证。 文心一言
access_token是公众号/小程序的全局唯一接口调用凭据,公众号/小程序调用各接口时都需使用access_token。开发者需要进行妥善保存。 access_token的存储至少要保留512个字符空间。 access_token的有效期目前为2个小时,需定时刷新。
【微信公众号】网页开发 /网页授权场景
- 网页授权access_token可以解决的问题:在微信浏览器中,未关注的用户应用也可以获取用户信息。
- 可以获取到的用户信息如下:
{
"openid": "OPENID",
"nickname": NICKNAME,
"sex": 1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
3. 授权给第三方的接口权限
注意,不同的应用授权作用域拉到的信息不同: scope为snsapi_base:不弹出授权页面[静态授权],直接跳转,不过只能获取用户openid; scope为snsapi_userinfo:弹出授权页面,可通过openid拿到昵称、性别、所在地。 并且, 即使在未关注的情况下,只要用户授权,也能获取其信息;
4. 开发指南
4.1 在微信浏览器中的弹出的授权页。需要scope是snsapi_userinfo
scope等于snsapi_userinfo时的授权页面。 snsapi_base没有这个页面[静默授权],不过只能拿到openid
说明:授权作用域(scope)代表用户授权给第三方的接口权限。
4.2 用户同意授权后
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
code说明: 是授权临时票据。code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期
4.3 通过code换取网页授权access_token
请求方法
获取code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
appid,公众号的唯一标识、开发者ID
secret,第三方用户唯一凭证密钥,即AppSecret
code,填写第一步获取的code参数
grant_type,填写为authorization_code
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"is_snapshotuser": 1,
"unionid": "UNIONID"
}
说明:refresh_token 拥有较长的有效期(30 天)且无法续期 note:微信公众平台-开发-基本配置 获取AppID,AppSecret
换取网页授权access_token时用到的appid,secret
4.4 拉取用户信息(需scope为snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过4.3获取的网页授权access_token和openid拉取用户信息了。
请求方法
GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
开发指南小结
1 第一步:引导用户进入授权页面同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
详细介绍见文末链接。
【微信公众号】服务间调用的凭据【稳定版】
- 功能描述:用于调用公众号全局后台接口的调用凭据,除网页授权拉取用户信息场景
- 开发指南
请求数据示例
POST https://api.weixin.qq.com/cgi-bin/stable_token
请求示例1(不传递force_refresh,默认值为false):
{
"grant_type": "client_credential",
"appid": "APPID",
"secret": "APPSECRET"
}
grant_type,获取access_token填写client_credential
返回数据示例
返回示例1:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
返回示例2: access_token有效期内重复调用该接口不会更新 access_token,过期时间会递减
{
"access_token":"ACCESS_TOKEN",
"expires_in":345
}
示例说明: 强制刷新模式,慎用,连续使用需要至少间隔30s
其他说明
access_token 的存储与更新
access_token
的存储空间至少要保留 512 个字符;- 建议开发者仅在
access_token
泄漏时使用强制刷新模式,该模式限制每天20次。考虑到数据安全,连续使用该模式时,请保证调用时间隔至少为30s,否则不会刷新; - 在普通模式调用下,平台会提前5分钟更新
access_token
,即在有效期倒计时5分钟内发起调用会获取新的access_token
。在新旧access_token
交接之际,平台会保证在5分钟内,新旧access_token
都可用,这保证了用户业务的平滑过渡;根据此特性可知,任意时刻发起调用获取到的access_token
有效期至少为 5 分钟,即expires_in
>= 300;
最佳实践
- 在使用获取Access token时,平台建议开发者使用中控服务来统一获取和刷新
access_token
。有此成熟方案的开发者依然可以复用方案并通过普通模式来调用本接口,另外请将发起接口调用的时机设置为上次获取到的access_token
有效期倒计时5分钟之内即可; - 根据以上特性,为减少其他开发者构建中控服务的开发成本,在普通调用模式下,平台建议开发者将每次获取的
access_token
在本地建立中心化存储使用,无须考虑并行调用接口时导致意外情况发生,仅须保证至少每5分钟发起一次调用并覆盖本地存储。同时,该方案也支持各业务独立部署使用,即不需要中心化存储也可以保证服务正常运行;
详细介绍见文末链接。
【微信公众号】服务间调用的凭据【原始版】
- 功能描述:用于调用公众号全局后台接口的调用凭据,除网页授权拉取用户信息场景
- 开发指南
接口调用请求说明
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回说明
正确时返回的JSON数据包如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"is_snapshotuser": 1,
"unionid": "UNIONID"
}
note:不建议使用此接口。建议使用稳定版。 因为每次调用这个接口都会返回一个新的token。重复获取将导致上次获取的access_token失效。 公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡; 【最近几个月中发现公众号后台没有保证在5分钟内新老access_token都可用】
【小程序】服务间调用的凭据【稳定版】
- 功能描述:获取小程序全局后台接口调用凭据,有效期最长为7200s
- 开发指南 【微信公众号】基础支持中的接口调用凭据【稳定版】
note: 小程序中用到appid和secret与微信公众号不同
【小程序】服务间调用的凭据【原始版】
- 功能描述:获取小程序全局后台接口调用凭据,有效期最长为7200s
- 开发指南 【微信公众号】基础支持中的接口调用凭据【原始版】
note:不建议使用此接口。建议使用稳定版。
【微信开放平台】移动应用微信登录
移动应用微信登录是基于OAuth2.0 协议标准构建的微信 OAuth2.0 授权登录系统。
在进行微信 OAuth2.0 授权登录接入之前,在微信开放平台注册开发者账号,并拥有一个已审核通过的移动应用,并获得相应的 AppID 和 AppSecret,申请微信登录且通过审核后,可开始接入流程。
授权流程说明
微信 OAuth2.0 授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信 OAuth2.0 的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过 access_token 可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。
微信 OAuth2.0 授权登录目前支持 authorization_code 模式,适用于拥有 server 端的应用授权。该模式整体流程为:
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
获取 access_token 时序图:
通过授权临时票据(code)获取 access_token 的接口与 【微信公众号】网页开发 /网页授权场景 相同。
note: 移动应用中用到appid和secret与微信公众号不同
【微信开放平台】网站应用微信登录
获取access_token的流程及通过授权临时票据(code)获取 access_token 的接口与 【微信公众号】网页开发 /网页授权场景 相同。
note: 移动应用中用到appid和secret与微信公众号不同
【企业微信】企业微信API接口调用凭据
- 功能描述:用于调用企业微信API接口
- 开发指南
请求方式:
GET https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
提示 此处标注大写的单词 ID 和 SECRET,为需要替换的变量,根据实际获取值更新。
{
"errcode": 0,
"errmsg": "ok",
"access_token": "accesstoken000001",
"expires_in": 7200
}
corpid 企业ID,获取方式参考:术语说明-corpid https://developer.work.weixin.qq.com/document/path/90665#corpid corpsecret 应用的凭证密钥,注意应用需要是启用状态 https://developer.work.weixin.qq.com/document/path/90665#secret
权限说明:
每个应用有独立的secret,获取到的access_token只能本应用使用,
所以每个应用的access_token应该分开来获取
小结
1、微信生态圈中与用户授权相关的,都是基于OAuth2.0。
OAuth2中最经典的Authorization Code模式,流程如下:
流程图中,包含四个角色。
- ResourceOwner:资源所有者,即为用户
- User-Agent:浏览器
- AuthorizationServer:认证服务器,可以理解为用户资源托管方,比如企业微信服务端
- Client:第三方服务
调用流程为:
A) 用户访问第三方服务,第三方服务通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
B) 用户选择是否同意授权
C) 若用户同意授权,则认证服务器将用户重定向到第一步指定的重定向URI,同时附上一个授权码。
D) 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
E) 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)
OAuth2接入流程
2、用户微信API接口场景,与微服务之间相互调用相同。
引用
微信网页开发 /网页授权场景: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html [微信公众号]开始开发 /获取 Stable Access token https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/getStableAccessToken.html [微信公众号]开始开发 /获取 Access token https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
[小程序]接口调用凭证 /获取稳定版接口调用凭据 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getStableAccessToken.html
[小程序]接口调用凭证 /获取稳定版接口调用凭据 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
企业内部开发服务端API开发指南获取access_token https://developer.work.weixin.qq.com/document/path/91039