# 授权后接口调用（UnionID）

本文介绍网站应用微信登录后，通过授权 code 获取 access_token 及相关接口调用的完整流程。

## 1、通过 code 获取网站授权 access_token

**接口说明**

通过 code 获取网站授权 access_token 的接口。

**请求说明**

```
HTTP 请求方式：GET
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
```

**参数说明**

| 参数 | 是否必须 | 说明 |
| :--- | :--- | :--- |
| appid | 是 | 应用唯一标识，在微信开放平台提交应用审核通过后获得 |
| secret | 是 | 应用密钥 AppSecret，在微信开放平台提交应用审核通过后获得 |
| code | 是 | 填写第一步获取的 code 参数 |
| grant_type | 是 | 填 authorization_code |

**返回说明**

正确的返回：

```json
{
    "access_token": "ACCESS_TOKEN",
    "expires_in": 7200,
    "refresh_token": "REFRESH_TOKEN",
    "openid": "OPENID",
    "scope": "SCOPE",
    "unionid": "UNIONID"
}
```

| 参数 | 说明 |
| :--- | :--- |
| access_token | 接口调用凭证 |
| expires_in | access_token 接口调用凭证超时时间，单位（秒） |
| refresh_token | 用户刷新 access_token |
| openid | 授权用户唯一标识 |
| scope | 用户授权的作用域，使用逗号（,）分隔 |
| unionid | 用户统一标识。针对一个微信开放平台账号下的应用，同一用户的 unionid 是唯一的 |

错误返回样例：

```json
{
    "errcode": 40029,
    "errmsg": "invalid code"
}
```

## 2、刷新或续期网站授权 access_token 使用

**接口说明**

access_token 是调用授权关系接口的调用凭证，由于 access_token 有效期（目前为 2 个小时）较短，当 access_token 超时后，可以使用 refresh_token 进行刷新，access_token 刷新结果有两种：

1. 若 access_token 已超时，那么进行 refresh_token 会获取一个新的 access_token，新的超时时间；
2. 若 access_token 未超时，那么进行 refresh_token 不会改变 access_token，但超时时间会刷新，相当于续期 access_token。

refresh_token 拥有较长的有效期（30 天）且无法续期，当 refresh_token 失效后，需要用户重新授权后才可以继续获取用户头像昵称。

**请求方法**

使用 /sns/oauth2/access_token 接口获取到的 refresh_token 进行以下接口调用：

```
HTTP 请求方式：GET
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
```

**参数说明**

| 参数 | 是否必须 | 说明 |
| :--- | :--- | :--- |
| appid | 是 | 应用唯一标识 |
| grant_type | 是 | 填 refresh_token |
| refresh_token | 是 | 填写通过 access_token 获取到的 refresh_token 参数 |

**返回说明**

正确的返回：

```json
{
    "access_token": "ACCESS_TOKEN",
    "expires_in": 7200,
    "refresh_token": "REFRESH_TOKEN",
    "openid": "OPENID",
    "scope": "SCOPE"
}
```

错误返回样例：

```json
{
    "errcode": 40030,
    "errmsg": "invalid refresh_token"
}
```

## 3、检验 access_token 是否有效

**接口说明**

检验授权凭证（access_token）是否有效。

**请求说明**

```
HTTP 请求方式：GET
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
```

**参数说明**

| 参数 | 是否必须 | 说明 |
| :--- | :--- | :--- |
| access_token | 是 | 调用接口凭证 |
| openid | 是 | 普通用户标识，对该公众账号唯一 |

**返回说明**

正确的 JSON 返回结果：

```json
{
    "errcode": 0,
    "errmsg": "ok"
}
```

错误的 JSON 返回示例：

```json
{
    "errcode": 40003,
    "errmsg": "invalid openid"
}
```

## 4、获取用户个人信息

**接口说明**

此接口用于获取用户个人信息。开发者可通过 OpenID 来获取用户基本信息。如果开发者拥有多个移动应用、网站应用和公众账号，可通过获取用户基本信息中的 unionid 来区分用户的唯一性，因为只要是同一个微信开放平台账号下的移动应用、网站应用和公众账号，用户的 unionid 是唯一的。同一用户对同一个微信开放平台下的不同应用，unionid 是相同的。请注意，在用户修改微信头像后，旧的微信头像 URL 将会失效，因此开发者应该自己在获取用户信息后，将头像图片保存下来，避免微信头像 URL 失效后的异常情况。

根据相关法律法规，为进一步规范开发者调用用户信息相关接口或功能，保障用户合法权益，Open 平台授权接口将不再返回用户性别及地区信息，能力调整已于 2021 年 10 月 20 日 24 时生效。详情点击查看原公告 [《微信公众平台用户信息相关接口调整公告》](https://developers.weixin.qq.com/community/develop/doc/00028edbe3c58081e7cc834705b801?blockType=1)。

**请求说明**

```
HTTP 请求方式：GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
```

**参数说明**

| 参数 | 是否必须 | 说明 |
| :--- | :--- | :--- |
| access_token | 是 | 调用凭证 |
| openid | 是 | 普通用户的标识，对当前开发者账号唯一 |
| lang | 否 | 国家地区语言版本，zh_CN 简体，zh_TW 繁体，en 英语，默认为 en |

**返回说明**

正确的 JSON 返回结果：

```json
{
    "openid": "OPENID",
    "nickname": "NICKNAME",
    "sex": 1,
    "province": "PROVINCE",
    "city": "CITY",
    "country": "COUNTRY",
    "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
```

| 参数 | 说明 |
| :--- | :--- |
| openid | 普通用户的标识，对当前开发者账号唯一 |
| nickname | 普通用户昵称 |
| sex | 普通用户性别，1 为男性，2 为女性 |
| province | 普通用户个人资料填写的省份 |
| city | 普通用户个人资料填写的城市 |
| country | 国家，如中国为 CN |
| headimgurl | 用户头像，最后一个数值代表正方形头像大小（有 0、46、64、96、132 数值可选，0 代表 640*640 正方形头像），用户没有头像时该项为空 |
| privilege | 用户特权信息，JSON 数组，如微信沃卡用户为（chinaunicom） |
| unionid | 用户统一标识。针对一个微信开放平台账号下的应用，同一用户的 unionid 是唯一的 |

建议：开发者最好保存用户 unionID 信息，以便以后在不同应用中进行用户信息互通。

错误的 JSON 返回示例：

```json
{
    "errcode": 40003,
    "errmsg": "invalid openid"
}
```

## 调用频率限制

| 接口名 | 频率限制 |
| :--- | :--- |
| 通过 code 换取 access_token | 1 万/分钟 |
| 刷新 access_token | 5 万/分钟 |
| 获取用户基本信息 | 5 万/分钟 |
