# 简介
在公众号授权托管给第三方平台后,第三方平台可以根据本文档相关说明,代替授权公众号发起网页授权。关于 OAuth2.0 的详细介绍,可以参考OAuth2.0 协议标准
作为第三方平台开发商,需要拥有自己的 appid 以及 secret(在创建第三方平台并获得审核成功后可以获取),以及确保授权的公众号具备授权作用域的权限,以及用于回调的域名。
# 开发前必读
# 微信网页授权能力调整公告
为进一步规范能力使用,保障用户合法权益,平台将对微信网页授权能力进行调整。 当开发者在网页中在不规范使用发起 snsapi_userinfo 网页授权时,微信将默认打开网页快照页模式进行基础浏览。 能力调整将于 2022 年 7 月 12 日 24 时生效。详情点击查看原公告《微信网页授权能力调整公告》。
# 授权流程
微信目前支持 Authorization code 授权模式,主要流程分为两步:
1. 获取code
2. 通过code换取accesstoken
流程图:
# 第一步:请求 CODE
# 请求方法
在确保微信公众账号拥有授权作用域(scope 参数)的权限的前提下(一般而言,已微信认证的服务号拥有 snsapi_base 和 snsapi_userinfo),使用微信客户端打开以下链接(严格按照以下格式,包括顺序和大小写,并请将参数替换为实际内容):
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE&component_appid=component_appid#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有 scope 参数对应的授权作用域权限。
# 参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的 appid |
redirect_uri | 是 | 重定向地址,需要 urlencode,这里填写的是第三方平台的【公众号开发域名】,注意这个配置需要勾选公众号相关全权限集才可以看到 |
response_type | 是 | 填 code |
scope | 是 | 授权作用域,拥有多个作用域用逗号(,)分隔 |
state | 否 | 重定向后会带上 state 参数,开发者可以填写任意参数值,最多 128 字节 |
component_appid | 是 | 服务方的 appid,在申请创建公众号服务成功后,可在公众号服务详情页找到 |
# 返回说明
用户允许授权后,将会重定向到 redirect_uri 的网址上,并且带上 code, state 以及 appid
redirect_uri?code=CODE&state=STATE&appid=APPID
若用户禁止授权,则重定向后不会带上 code 参数,仅会带上 state 参数
redirect_uri?state=STATE
# 第二步:通过 code 换取 access_token
# 请求方法
获取第一步的 code 后,请求以下链接获取 access_token:
https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=APPID&code=CODE&grant_type=authorization_code&component_appid=COMPONENT_APPID&component_access_token=COMPONENT_ACCESS_TOKEN
需要注意的是,由于安全方面的考虑,对访问该链接的客户端有 IP 白名单的要求。
# 参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的 appid |
code | 是 | 填写第一步获取的 code 参数 |
grant_type | 是 | 填 authorization_code |
component_appid | 是 | 服务开发方的 appid |
component_access_token | 是 | 服务开发方的 access_token |
# 返回说明
正确的返回:
{
"access_token": "ACCESS_TOKEN",
"expires_in": 7200,
"refresh_token": "REFRESH_TOKEN",
"openid": "OPENID",
"scope": "SCOPE"
}
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token 接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新 access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
错误返回样例:
{
"errcode": 40029,
"errmsg": "invalid code"
}
# 第三步:刷新 access_token(如果需要)
由于 access_token 拥有较短的有效期,当 access_token 超时后,可以使用 refresh_token 进行刷新,refresh_token 拥有较长的有效期(30 天),当 refresh_token 失效的后,需要用户重新授权。
# 请求方法
获取第一步的 code 后,请求以下链接获取 access_token:
https://api.weixin.qq.com/sns/oauth2/component/refresh_token?appid=APPID&grant_type=refresh_token&component_appid=COMPONENT_APPID&component_access_token=COMPONENT_ACCESS_TOKEN&refresh_token=REFRESH_TOKEN
# 参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的 appid |
grant_type | 是 | 填 refresh_token |
refresh_token | 是 | 填写通过 access_token 获取到的 refresh_token 参数 |
component_appid | 是 | 服务开发商的 appid |
component_access_token | 是 | 服务开发方的 access_token |
# 返回说明
正确的返回:
{
"access_token": "ACCESS_TOKEN",
"expires_in": 7200,
"refresh_token": "REFRESH_TOKEN",
"openid": "OPENID",
"scope": "SCOPE"
}
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token 接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新 access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
错误返回样例::
{
"errcode": 40029,
"errmsg": "invalid code"
}
# 第四步:通过网页授权 access_token 获取用户基本信息(需授权作用域为 snsapi_userinfo)
如果网页授权作用域为 snsapi_userinfo,则此时开发者可以通过 access_token 和 openid 拉取用户信息了。
请求方法
GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此 access_token 与基础支持的 access_token 不同 |
openid | 用户的唯一标识 |
lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明
正确时返回的 JSON 数据包如下:
{
"openid": " OPENID",
"nickname": "NICKNAME",
"sex": "1",
"province": "PROVINCE",
"city": "CITY",
"country": "COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege": ["PRIVILEGE1", "PRIVILEGE2"],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 | 描述 |
---|---|
openid | 用户的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为 1 时是男性,值为 2 时是女性,值为 0 时是未知 |
province | 用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为 CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有 0、46、64、96、132 数值可选,0 代表 640*640 正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像 URL 将失效。 |
privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
unionid | 只有在用户将公众号绑定到微信开放平台账号后,才会出现该字段。详见: 获取用户个人信息(UnionID 机制) |
错误时微信会返回 JSON 数据包如下(示例为 openid 无效):
{
"errcode": 40003,
"errmsg": " invalid openid "
}