【快应用&凡泰】客户端开发指南更新时间:2026-03-05 09:50:00
一、【快应用】开发接入小米账号服务
1.接口介绍
快应用框架版本需要大于1.31.4.0
快应用调起一键登录/授权登录界面,用户确认后获取授权码,应用服务端根据授权码获取用户信息。
如果没登录系统账号,调用接口后会跳转登录小米账号的页面。 账号登录成功后自动跳转一键登录/授权登录界面。
一键登录可获取小米账号关联的手机号、openId信息、unionId信息。
授权登录可获取到小米账号的openId信息、unionId信息。
1.1 应用获取信息流程

1.2 前端说明
接口声明
{ "name": "service.account" }导入模块
import account from '@service.account' 或 const account = require('@service.account')一键登录/授权登录接口 account.unifiedLogin()
一键登录/授权登录用同一个接口,通过loginType区分类型。
成功后返回授权码authCode。
参数:
| 参数名 | 类型 | 必填 | 说明 |
| loginType | 'AUTH_LOGIN' | 'QUICK_LOGIN' | 是 | QUICK_LOGIN:一键登录AUTH_LOGIN:授权登录 |
| clientId | String | 是 | 快应用开发者在开放平台注册的clientId |
| privacyUrl | String | 是 | 业务隐私协议地址 |
| privacyText | String | 是 | 业务隐私协议文案 |
| userAgreementUrl | String | 是 | 用户协议地址 |
| userAgreementText | String | 是 | 用户协议文案 |
| state | String | 否 | 开发者自定义请求状态标识,用于防止 CSRF 攻击 |
| nonce | String | 否 | 一次性随机字符串,用于防止重放攻击 |
| phoneValid | Boolean | 否 | 是否需要小米账号校验手机号有效性true:需要校验(默认)false:不校验 |
| showOtherLoginBtn | Boolean | 否 | 是否展示“其他方式登录”按钮默认 false |
| success | Function | 否 | 成功回调 |
| fail | Function | 否 | 失败回调 |
| complete | Function | 否 | 执行结束后的回调 |
success 返回值:
| 参数名 | 类型 | 说明 |
| authCode | String | 返回的授权码。 |
应用前端代码示例
回调写法
account.unifiedLogin({
loginType: 'QUICK_LOGIN',
clientId: 'yourclientId',
state: 'xxx',
nonce: 'xxx',
privacyUrl: 'xxx',
privacyText: 'xxx',
userAgreementUrl: 'xxx',
userAgreementText: 'xxxx',
success: (data) => {
console.log('handling success', data)
},
fail: (data, code) => {
console.log(`handling fail`, data, code)
},
complete: (data, code) => {
console.log(`handling complete`, data, code)
},
})promise写法
try {
let res = await account.unifiedLogin({
loginType: 'QUICK_LOGIN',
clientId: 'yourclientId',
state: 'xxx',
nonce: 'xxx',
privacyUrl: 'xxx',
privacyText: 'xxx',
userAgreementUrl: 'xxx',
userAgreementText: 'xxxx',
})
console.log('res', res)
} catch (error) {
console.log('error', error)
}二、【凡泰】开发接入小米账号服务
1.客户端接口
1.1 登录接口
支持以下两种登录模式:
-
quickLogin:一键登录 -
authLogin:授权登录
1.2 接口定义
wx.isSupportMiLogin()
用于查询是否支持小米的一键登录和授权登录。
参数:Object
| 字段名 | 类型 | 必填 | 说明 |
| type | String | 是 | 需要判断的登录类型,支持quickLogin或authLogin |
返回值:Object
| 字段名 | 类型 | 说明 |
| data | Boolean | 是否支持登录功能 |
| errMsg | String | 成功或错误信息 |
示例:
const res = wx.isSupportMiLogin({type: 'quickLogin'})
console.log(`--- wx.isSupportMiLogin --- ${res.data}`) // true/falsewx.quickLogin(object)/wx.authLogin(object)
一键登录和授权登录方式的参数、回调事件和返回值完全一样。
参数:Object
| 字段名 | 类型 | 必填 | 说明 |
| clientId | String | 是 | 快应用开发者在开放平台注册的clientId |
| privacyUrl | String | 是 | 业务隐私协议地址 |
| privacyText | String | 是 | 业务隐私协议文案 |
| userAgreementUrl | String | 是 | 用户协议地址 |
| userAgreementText | String | 是 | 用户协议文案 |
| state | String | 否 | 开发者自定义请求状态标识,用于防止 CSRF 攻击 |
| nonce | String | 否 | 一次性随机字符串,用于防止重放攻击 |
| phoneValid | Boolean | 否 | 是否需要小米账号校验手机号有效性true:需要校验(默认)false:不校验 |
| showOtherLoginBtn | Boolean | 否 | 是否展示“其他方式登录”按钮默认 false |
- state / nonce 校验规则说明:
- 长度:1~255
- 字符集:
0-9 a-z A-Z . : / - _- 正则表达式:
^[0-9a-zA-Z:/.\-_]{1,255}$- phoneValid 说明:
- 当
phoneValid = true(默认): - 如用户90天未触达过绑定手机号,小米账号进行手机号短信验证
- 当
phoneValid = false: - 不进行手机号有效性校验
- showOtherLoginBtn 说明:
false(默认)- 不展示「其他方式登录」按钮
true- 展示「其他方式登录」按钮
- 用户点击后:
- 当前登录页关闭
- 触发
onLoginOther回调 - 后续登录流程需由开发者自行实现
返回值:Object
| 字段名 | 类型 | 说明 |
| authCode | String | 授权码,用于向服务端换取 Access Token / Refresh Token |
| state | String | 原样返回的请求状态标识 |
| nonce | String | 原样返回的一次性随机字符串 |
回调事件:
由于凡泰只支持success和fail回调,因此通过在返回数据中添加type字段区分不同回调类型
- success: success/loginOther
- fail: error/cancel
回调方法:
success | fail回调类型定义:
1.登陆成功
type: success返回参数:
{
"type": "success/loginOther",
"data": {
"authCode": "xxx",
"state": "login_state_001",
"nonce": "nonce_001"
} // 如果是loginOther回调data为空
}参数说明:
| 字段名 | 类型 | 说明 |
| authCode | String | 授权码,用于向服务端换取 Access Token / Refresh Token |
| state | String | 原样返回的请求状态标识 |
| nonce | String | 原样返回的一次性随机字符串 |
2.用户取消登录
用户主动关闭登录页或返回
type: cancel3.用户选择其他方式登录
仅在 showOtherLoginBtn = true 且用户点击时触发
type: loginOther4.登陆失败
type: error返回参数:
{
"type": "error/cancel",
"errCode": "10001", // 如果是onCancel回调,errCode为空
"errMsg": "用户未授权"
}参数说明:
| 字段名 | 类型 |
| type | String |
| errorCode | String |
| errorMsg | String |
errorCode含义:
| 一级错误码 | 二级错误码 | 错误码含义 | 建议的处理方式 |
| -1000 | - | 参数异常 | 校验参数 |
| -1001 | 10000 | 参数错误 | 用户点击后重新尝试发起 |
| 10001 | 应用未申请一键登录权限 | 引导用户通过其他方式登录 | |
| 10002 | 账号登录态失效 | 用户点击后重新尝试发起 | |
| 10003 | 服务端错误 | 用户点击后重新尝试发起 | |
| 10004 | 不支持该操作 | 引导用户通过其他方式登录 | |
| 10005 | 非法的登录方式 | 引导用户通过其他方式登录 | |
| 10006 | 用户未登录小米系统账号 | 引导用户通过其他方式登录 | |
| 10007 | 海外ROM不支持 | 引导用户通过其他方式登录 | |
| 10008 | 未设置锁屏 | 引导用户通过其他方式登录 | |
| 10009 | 已发起的流程中账号发生变化 | 用户点击后重新尝试发起 | |
| -1002 | - | 用户取消登录(当前页面已关闭) | 用户点击后重新尝试发起 |
| -1003 | - | 不支持的设备 | 引导用户通过其他方式登录 |
| -1004 | - | 链接小米账号App失败 | 用户点击后重新尝试发起 |
| -1005 | 1 | 跨进程请求异常-DeadObjectException,小米账号进程被杀 | 用户点击后重新尝试发起 |
| 2 | 跨进程请求异常-RemoteException,小米账号进程内异常 | ||
| 3 | 跨进程请求异常-其他Exception,小米账号进程内异常 | ||
| -1006 | -1 | 小米账号内部异常 | 用户点击后重新尝试发起 |
| 10000 | 参数错误 | 用户点击后重新尝试发起 | |
| 10001 | 应用未申请一键登录权限 | 引导用户通过其他方式登录 | |
| 10002 | 账号登录态失效 | 用户点击后重新尝试发起 | |
| 10003 | 服务端错误 | 用户点击后重新尝试发起 | |
| 10004 | 不支持该操作 | 引导用户通过其他方式登录 | |
| 10005 | 非法的登录方式 | 引导用户通过其他方式登录 | |
| 10006 | 用户未登录小米系统账号 | 引导用户通过其他方式登录 | |
| 10007 | 海外ROM不支持 | 引导用户通过其他方式登录 | |
| 10008 | 未设置锁屏 | 引导用户通过其他方式登录 | |
| 10009 | 已发起的流程中账号发生变化 | 用户点击后重新尝试发起 | |
| 30002 | 非法的一键登录intent | 用户点击后重新尝试发起 | |
| 30003 | 用户未完成登录 | 用户点击后重新尝试发起 | |
| 30004 | 当前账号不支持手机号登录 | 引导用户通过其他方式登录 | |
| 30005 | 没有权限取消一键登录 | 引导用户通过其他方式登录 | |
| -1007 | - | 上次登录未完成 | 用户点击后重新尝试发起 |
| -1008 | -1 | 小米账号版本不支持 | 引导用户通过其他方式登录 |
| -2 | XMSF版本不支持 | 引导用户通过其他方式登录 | |
| -1009 | - | 跨进程调用小米账号异常 | 引导用户通过其他方式登录 |
示例:
// 一键登录
wx.quickLogin({
"clientId": "288230376152047****",
"state": "login_state_***",
"nonce": "nonce_***",
"privacyUrl": "https://privacy.mi.com/*******",
"privacyText": "小米账号隐私协议*****",
"userAgreementUrl": "https://privacy.mi.com/*****",
"userAgreementText": "小米账号用户协议*****",
"showOtherLoginBtn": true,
"phoneValid": false,
success: (res) => { // 成功回调
// 根据 res.type 区分不同场景
// res = {type: 'success'/'loginOther', ...otherData}
if (res.type === 'success') {
this.log('--- wx.quickLogin --- success', res)
} else if (res.type === 'loginOther') {
this.log('--- wx.quickLogin --- loginOther', res)
}
},
fail: (res) => { // 失败回调
// 根据 res.type 区分不同错误场景
// res = {type: 'cancel'/'error', errMsg: '', errCode: 0}
if (res.type === 'cancel') {
this.log('--- wx.quickLogin --- cancel', res)
} else if (res.type === 'error') {
this.log('--- wx.quickLogin --- fail', res)
}
}
})
// 授权登录
wx.authLogin({
"clientId": "288230376152047****",
"state": "login_state_***",
"nonce": "nonce_***",
"privacyUrl": "https://privacy.mi.com/*******",
"privacyText": "小米账号隐私协议*****",
"userAgreementUrl": "https://privacy.mi.com/*****",
"userAgreementText": "小米账号用户协议*****",
"showOtherLoginBtn": true,
"phoneValid": false,
success: (res) => { // 成功回调
// 根据 res.type 区分不同场景
// res = {type: 'success'/'loginOther', ...otherData}
if (res.type === 'success') {
this.log('--- wx.quickLogin --- success', res)
} else if (res.type === 'loginOther') {
this.log('--- wx.quickLogin --- loginOther', res)
}
},
fail: (res) => { // 失败回调
// 根据 res.type 区分不同错误场景
// res = {type: 'cancel'/'error', errMsg: '', errCode: 0}
if (res.type === 'cancel') {
this.log('--- wx.quickLogin --- cancel', res)
} else if (res.type === 'error') {
this.log('--- wx.quickLogin --- fail', res)
}
}
})文档内容是否有帮助?
有帮助
无帮助