# 换取用户授权凭证

[调试诊断](https://developers.weixin.qq.com/console/devtools/debug?utm_source=api_tools)

> 接口应在服务器端调用，不可在前端（小程序、网页、APP等）直接调用，具体可参考[接口调用指南](/doc/oplatform/developers/dev/guide.md)。

接口英文名：snsAccessToken

通过code换取网页授权用户access_token

此接口与[获取接口调用凭据](/doc/service/api/base/api_getaccesstoken)不同，为用户级别的授权 token 获取。该 token 仅能获取授权用户的相关信息，无法用于调用其他接口。

注意：此接口频率限制为 5 万/分钟

## 1. 调用方式

### HTTPS 调用

```bash
GET https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx520c15f417810387&secret=SECRET&code=CODE&grant_type=authorization_code
```

### 云调用

- 本接口不支持云调用。

### 第三方调用

- 本接口不支持第三方平台调用。

## 2. 请求参数

### 查询参数 `Query String Parameters`

```json
[
  {
    "参数名": "appid",
    "类型": "string",
    "必填": "是",
    "示例": "wx520c15f417810387",
    "说明": "公众号的唯一标识"
  },
  {
    "参数名": "secret",
    "类型": "string",
    "必填": "是",
    "示例": "-",
    "说明": "公众号的 appsecret"
  },
  {
    "参数名": "code",
    "类型": "string",
    "必填": "是",
    "示例": "-",
    "说明": "填写第一步获取的 code 参数"
  },
  {
    "参数名": "grant_type",
    "类型": "string",
    "必填": "是",
    "示例": "authorization_code",
    "说明": "填写为 authorization_code"
  }
]
```

### 请求体 `Request Payload`

无

## 3. 返回参数

### 返回体 `Response Payload`

```json
[
  {
    "参数名": "access_token",
    "类型": "string",
    "说明": "网页授权接口调用凭证,注意：此access_token与基础支持的access_token不同"
  },
  {
    "参数名": "expires_in",
    "类型": "number",
    "说明": "access_token接口调用凭证超时时间，单位（秒）"
  },
  {
    "参数名": "refresh_token",
    "类型": "string",
    "说明": "用户刷新access_token"
  },
  {
    "参数名": "openid",
    "类型": "string",
    "说明": "用户唯一标识，请注意，在未关注公众号时，用户访问公众号的网页，也会产生一个用户和公众号唯一的OpenID"
  },
  {
    "参数名": "unionid",
    "类型": "string",
    "说明": "用户统一标识（针对一个微信开放平台账号下的应用，同一用户的 unionid 是唯一的），只有当scope为\"snsapi_userinfo\"时返回"
  },
  {
    "参数名": "is_snapshotuser",
    "类型": "number",
    "说明": "是否为快照页模式虚拟账号，只有当用户是快照页模式虚拟账号时返回，值为1"
  }
]
```

## 4. 注意事项

#### 网页授权access_token和普通access_token的区别

1. 微信网页授权是通过 `OAuth2.0` 机制实现的，在用户授权给公众号后，公众号可以获取到一个网页授权特有的接口调用凭证（网页授权access_token），通过网页授权 access_token 可以进行授权后接口调用，如获取用户基本信息；
2. 其他微信接口，需要通过基础支持中的[获取接口调用凭据]()接口来获取到的普通 access_token 调用。

#### 网页授权的两种scope的区别说明

1. 以 `snsapi_base` 为 `scope` 发起的网页授权，是用来获取进入页面的用户的 `openid` 的，并且是**静默授权**并自动跳转到回调页的。用户感知的就是直接进入了回调页（往往是业务页面）
2. 以 `snsapi_userinfo`为 `scope` 发起的网页授权，是用来获取用户的基本信息的。但这种授权需要用户手动同意，并且由于用户同意过，所以无须关注，就可在授权后获取该用户的基本信息。
3. 用户管理类接口中的“获取用户基本信息接口”，是在用户和公众号产生消息交互或关注后事件推送后，才能根据用户OpenID来获取用户基本信息。这个接口，包括其他微信接口，都是需要该用户（即openid）关注了公众号后，才能调用成功的。

#### UnionID机制

1. 请注意，网页授权获取用户基本信息也遵循 `UnionID` 机制。即如果开发者有在多个公众号，或在公众号、移动应用之间统一用户账号的需求，需要前往微信开放平台（open.weixin.qq.com）绑定公众号后，才可利用 `UnionID` 机制来满足上述需求。
2. `UnionID` 机制的作用说明：如果开发者拥有多个移动应用、网站应用和公众账号，可通过获取用户基本信息中的unionid来区分用户的唯一性，因为同一用户，对同一个微信开放平台下的不同应用（移动应用、网站应用和公众账号），unionid是相同的。

## 5. 代码示例

请求示例

``` bash
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_cod
```

返回示例

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

## 6. 错误码

以下是本接口的错误码列表，其他错误码可参考 [通用错误码](/doc/oplatform/developers/errCode/README.md)；调用接口遇到报错，可使用官方提供的 [API 诊断工具](https://developers.weixin.qq.com/console/devtools/debug?utm_source=api_errcode) 辅助定位和分析问题。

```json
[
  {
    "错误码": "40029",
    "错误描述": "invalid code",
    "解决方案": "无效的code参数"
  }
]
```

## 7. 适用范围

本接口在不同账号类型下的可调用情况：

```json
[
  {
    "服务号": "仅认证",
    "移动应用": "✔",
    "网站应用": "✔"
  }
]
```

- 仅认证：表示仅允许企业主体已认证账号调用，未认证或不支持认证的账号无法调用。
- ✔：该账号可调用此接口。
- 其他未明确声明的账号类型，如无特殊说明，均不可调用此接口。
