# 简介

在公众号授权托管给第三方平台后,第三方平台可以根据本文档相关说明,代替授权公众号发起网页授权。关于 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 "
}