# 登录凭证校验

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

接口英文名：code2Verifyinfo

通过 wx.xxxLogin（如 wx.weixinAppLogin、wx.appleLogin、wx.weixinMiniProgramLogin） 获得临时登录凭证 (code) 后，传到开发者服务器，开发者服务器调用本接口获取用户标识信息，可以用于构建自定义登录态。

注意：本接口需要的多端应用secret，可在多端应用控制台应用详情页查看

## 1. 调用方式

### HTTPS 调用

```bash
GET https://api.weixin.qq.com/donut/code2verifyinfo?access_token=ACCESS_TOKEN
```

### 云调用

- 本接口不支持云调用。

### 第三方调用

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

## 2. 请求参数

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

```json
[
  {
    "参数名": "access_token",
    "类型": "string",
    "必填": "是",
    "示例": "ACCESS_TOKEN",
    "说明": "接口调用凭证，可使用 [access_token](getaccesstoken)"
  }
]
```

### 请求体 `Request Payload`

```json
[
  {
    "参数名": "appid",
    "类型": "string",
    "必填": "是",
    "说明": "多端应用 ID，在多端应用控制台应用详情页可以查看；不是小程序 Appid，也不是移动应用 Appid"
  },
  {
    "参数名": "appsecret",
    "类型": "string",
    "必填": "是",
    "说明": "多端应用secret，在多端应用控制台应用详情页可以查看；不是小程序 secret，也不是移动应用 secret"
  },
  {
    "参数名": "code",
    "类型": "string",
    "必填": "是",
    "说明": "临时登录凭证，可通过 wx.weixinAppLogin、wx.weixinMiniProgramLogin、wx.phoneSmsLogin、wx.appleLogin、[本机号码一键登录 button](/miniprogram/dev/platform-capabilities/miniapp/component/auth/phoneOneClickLogin) 获取"
  },
  {
    "参数名": "grant_type",
    "类型": "string",
    "必填": "是",
    "说明": "授权类型，固定值为\"authorization_code\""
  }
]
```

## 3. 返回参数

### 返回体 `Response Payload`

```json
[
  {
    "参数名": "errcode",
    "类型": "number",
    "说明": "错误码"
  },
  {
    "参数名": "errmsg",
    "类型": "string",
    "说明": "错误提示"
  },
  {
    "参数名": "login_info",
    "类型": "object",
    "说明": "登录信息"
  },
  {
    "参数名": "user_info",
    "类型": "object",
    "说明": "用户标识信息"
  }
]
```

### Res.login_info `Object Payload`

登录信息

```json
[
  {
    "参数名": "type",
    "类型": "string",
    "说明": "登录方式: weixinApp, weixinMiniProgram, phoneSms, apple, phoneOneClick"
  },
  {
    "参数名": "login_time",
    "类型": "number",
    "说明": "登录时间"
  }
]
```

### Res.user_info `Object Payload`

用户标识信息

```json
[
  {
    "参数名": "user_id",
    "类型": "string",
    "说明": "多端用户ID"
  },
  {
    "参数名": "openapp_info",
    "类型": "object",
    "说明": "微信移动应用信息"
  },
  {
    "参数名": "miniprogram_info",
    "类型": "object",
    "说明": "微信小程序信息"
  },
  {
    "参数名": "phone_info",
    "类型": "object",
    "说明": "手机号信息"
  },
  {
    "参数名": "apple_info",
    "类型": "object",
    "说明": "苹果账号信息"
  },
  {
    "参数名": "huawei_info",
    "类型": "object",
    "说明": "华为账号信息"
  }
]
```

### Res.user_info.openapp_info `Object Payload`

微信移动应用信息

```json
[
  {
    "参数名": "appid",
    "类型": "string",
    "说明": "微信移动应用appid"
  },
  {
    "参数名": "openid",
    "类型": "string",
    "说明": "微信移动应用对应的openid"
  },
  {
    "参数名": "unionid",
    "类型": "string",
    "说明": "unionid"
  },
  {
    "参数名": "headimgurl",
    "类型": "string",
    "说明": "用户头像，最后一个数值代表正方形头像大小（有 0、46、64、96、132 数值可选，0 代表640*640正方形头像），用户没有头像时该项为空"
  },
  {
    "参数名": "nickname",
    "类型": "string",
    "说明": "普通用户昵称"
  }
]
```

### Res.user_info.miniprogram_info `Object Payload`

微信小程序信息

```json
[
  {
    "参数名": "appid",
    "类型": "string",
    "说明": "微信小程序appid"
  },
  {
    "参数名": "openid",
    "类型": "string",
    "说明": "微信小程序对应的openid"
  },
  {
    "参数名": "unionid",
    "类型": "string",
    "说明": "unionid，小程序需要绑定在微信开放平台才会返回；否则为空"
  }
]
```

### Res.user_info.phone_info `Object Payload`

手机号信息

```json
[
  {
    "参数名": "phone",
    "类型": "string",
    "说明": "手机号"
  }
]
```

### Res.user_info.apple_info `Object Payload`

苹果账号信息

```json
[
  {
    "参数名": "bundleid",
    "类型": "string",
    "说明": "苹果应用id"
  },
  {
    "参数名": "apple_user_id",
    "类型": "string",
    "说明": "苹果用户id"
  },
  {
    "参数名": "apple_email",
    "类型": "string",
    "说明": "苹果用户邮箱账号"
  },
  {
    "参数名": "is_apple_email_verified",
    "类型": "boolean",
    "说明": "邮箱是否已验证（true/false）"
  },
  {
    "参数名": "is_apple_email_private",
    "类型": "boolean",
    "说明": "邮箱是否为私人邮箱（true/false）"
  }
]
```

### Res.user_info.huawei_info `Object Payload`

华为账号信息

```json
[
  {
    "参数名": "client_id",
    "类型": "string",
    "说明": "华为 client_id"
  },
  {
    "参数名": "huawei_open_id",
    "类型": "string",
    "说明": "华为 open_id"
  },
  {
    "参数名": "huawei_union_id",
    "类型": "string",
    "说明": "华为 union_id"
  },
  {
    "参数名": "huawei_display_name",
    "类型": "string",
    "说明": "华为账号昵称"
  },
  {
    "参数名": "huawei_picture",
    "类型": "string",
    "说明": "华为账号头像"
  },
  {
    "参数名": "huawei_email",
    "类型": "string",
    "说明": "华为账号邮箱"
  },
  {
    "参数名": "is_huawei_email_verified",
    "类型": "boolean",
    "说明": "邮箱是否已验证（true/false）"
  },
  {
    "参数名": "type",
    "类型": "string",
    "说明": "类型"
  }
]
```

## 4. 注意事项

### 4.1 账号绑定说明

##### 账号之间没有绑定

- 当 type 是 weixinMiniProgram（小程序登录） 的时候返回 miniprogram_info
- 当 type 是 weixinApp（微信登录） 的时候返回 openapp_info
- 当 type 是 phoneSms（手机验证码登录） 和 phoneOneClick（一键本机号码登录） 的时候返回 phone_info
- 当 type 是 apple 的时候返回 apple_info

##### 账号之间有绑定

- 例如，小程序登录（wx.weixinMiniProgramLogin）后通过 `wx.miniapp.bindPhone` 引导用户完成了手机号绑定，那么，当 type 是 weixinMiniProgram（小程序登录） 的时候会同时返回 miniprogram_info 和 phone_info
- 同理，手机登录（wx.phoneSmsLogin）后通过 `wx.miniapp.bindWeixin` 引导用户完成了微信绑定，那么，当 type 是 phoneSms（手机验证码登录） 的时候会同时返回 phone_info 和 openapp_info
- 以此类推，不同的登录方式之间可以引导进行账号的绑定；code2Verifyinfo 接口会依据 type 以及已绑定的账号类型情况而同时返回对应的信息

### 4.2 常问问题

- **Q：为什么我的返回信息中没有 phone_info / openapp_info？**
- A：code2Verifyinfo 接口根据开发者调用的登录方式和账号间的绑定关系来返回对应信息。

  - 场景一：账号间没有绑定关系

    比如，传入[微信小程序登录 wx.weixinMiniProgramLogin](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.weixinMiniProgramLogin) 获取的 code，code2verifyinfo 将返回微信小程序信息 miniprogram_info，但返回信息中不包含微信移动应用信息 openapp_info，手机号信息 phone_info，苹果信息 apple_info

  - 场景二：账号间存在绑定关系

    比如，某用户的手机号和苹果账号绑定，如果传入其中一种登录方式获取的 code，code2verifyinfo 将同时返回手机号信息 phone_info 和苹果信息 apple_info

    开发者可以调用 [wx.miniapp.checkBindInfo](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.miniapp.checkBindInfo) 检查当前用户是否已经绑定某种账号

- **Q：wx.login、wx.miniapp.login 获取的 code 可以在 code2verifyinfo 使用吗？**
- A：wx.login、wx.miniapp.login 获取的 code 不支持在 code2verifyinfo 使用。

- **Q：调用 code2verifyinfo 失败，报错为 {"errcode": 43001, "errmsg": "系统失败 rid: xxx"}，如何解决？**
- A：请使用 get 发起请求。

## 5. 代码示例

请求示例

```json
{
  appid: 'aaa',
  appsecret: 'bbb',
  code: 'ccc',
  grant_type: 'authorization_code'
}
```

返回示例

```json
{
    "errcode": 0,
    "login_info": {
        "type": "weixinApp",
        "login_time": 12345678,
        "appid": "aaa"
    },
    "user_info": {
        "user_id": "xxx",
        "openapp_info": {
            "appid": "bbb",
            "openid": "ccc",
            "unionid": "ddd",
            "headimgurl": "HEADIMGURL",
            "nickname": "NICKNAME"
        },
        "phone_info": {
            "phone": "137xxxxxxx"
        },
        "apple_info": {
            "bundleid": "eee",
            "apple_user_id": "fff",
            "apple_email": "xxx@test.com",
            "is_apple_email_verified": false,
            "is_apple_email_private": false
        },
        "huawei_info": {
            "client_id": "6917575068155340466",
            "huawei_open_id": "AAAVXQFo5cL1lFLxQ0dhhVLvnIhlU",
            "huawei_union_id": "",
            "huawei_display_name": "over",
            "huawei_picture": "https://upfile-drcn.platform.hicloud.com/QYbytCcQAMsmzK77575068155340466.jpeg",
            "huawei_email": "",
            "is_huawei_email_verified": false,
            "type": "huawei-app"
        },
        "miniprogram_info": {
            "appid": "bbb",
            "openid": "ccc",
            "unionid": "ddd"
        }
    }
}
```

## 6. 错误码

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

```json
[
  {
    "错误码": "-1",
    "错误描述": "system error"
  },
  {
    "错误码": "10001000",
    "错误描述": "code过期"
  },
  {
    "错误码": "10001001",
    "错误描述": "code错误"
  },
  {
    "错误码": "10001002",
    "错误描述": "appid错误"
  },
  {
    "错误码": "10001003",
    "错误描述": "appsecret填错了，或者是参数传成了“secret”。正确的参数是“appsecret”"
  },
  {
    "错误码": "10001004",
    "错误描述": "grant_type错误"
  },
  {
    "错误码": "10001005",
    "错误描述": "多端应用未接入身份管理"
  }
]
```

## 7. 适用范围

本接口支持「多端应用」账号类型调用。其他账号类型如无特殊说明，均不可调用。
