Smarthome API 说明文档
版本: 1.0
发布日期: 2024-03-28
历史记录
| 修订日期 | 版本 | 作者 | 说明 |
|---|---|---|---|
| 2024-3-28 | V1.0 | alva.huang | 初始版本 |
| 2024-5-11 | V1.0.1 | alva.huang | 增加头像上传,手机验证码 |
[toc]
本文档旨在说明爱智居服务端的API接口,帮助开发人员如何使用smarthome api 进行开发,并详细介绍了各API的功能,调用方式,返回结果和错误码。
此开发文档只针对智能家居控制app,小程序,以及相应的控制端app,面板app等的开发。
账户系统主要功能是用户注册,登录,修改密码,忘记密码,注销账号。用户信息维护和更新。用户权限控制。角色映射等和用户相关的功能。
200-299 请求成功 400-499 请求失败,客户端参数或信息错误 500-599 请求失败,服务端错误
| 状态码 | 说明 |
|---|---|
| 200 | 请求成功 |
| 201 | 新增成功 |
| 204 | 删除成功/更新成功 |
| 401 | 请求失败,无权限,没有登陆认证或认证token错误 |
| 403 | 请求失败,无权限 |
| 404 | 请求失败,资源不存在 |
| 405 | 请求失败,请求方法不支持 |
| 406 | 请求失败,参数错误 |
| 400 | 请求失败,参数错误 |
| 408 | 请求失败,请求超时 |
| 415 | 请求失败,不支持的媒体类型 |
| 500 | 请求失败,服务端内部错误 |
url前缀地址为 https://account.izhiju.cn/realms/zhiju 接口中未指定url前缀地址,则默认使用此前缀地址 如:{{url}}/account 实际地址为 https://account.izhiju.cn/realms/zhiju/account
用户通过微信小程序登陆,并使用微信code换取token,调用此接口完成注册和登录。 当用户第一次使用微信小程序登陆,并且没有绑定过账号时,需要传入手机号码和验证码,进行注册绑定手机号码。后续使用微信小程序登陆,不需要传入手机号码和验证码。
POST 请求URL: https://account.izhiju.cn/realms/zhiju/protocol/openid-connect/token
请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数:
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| client_id | string | wechatapp | 客户端id,微信小程序固定为wechatapp,必须字段 |
| client_secret | string | 平台相关的密钥 | 客户端密钥,必须字段 |
| grant_type | string | password | 授权类型,固定为password,必须字段 |
| wechatCode | string | code | wx.login()返回的code,必须传值 |
| smsCode | string | NULL | 手机收到的验证码,已绑定的用户可不传 |
| phoneNumber | string | NULL | 手机号,可不传 |
| areaCode | string | NULL | 区号,可不传 |
返回结果:
{
"access_token": "eyJhbGciO", //token 可做为调用其它接口的授权凭证
"expires_in": 1800, //token有效期,单位秒
"refresh_expires_in": 1800, //refresh_token有效期,单位秒
"refresh_token": "eyJhbGci", //refresh_token,用于刷新token
"token_type": "Bearer", //token类型,Bearer
"not-before-policy": 0,
"session_state": "2f2bd023-793e-4abc-a067-7dd4d49705a3",
"scope": "profile" //token权限,profile表示用户信息
}
{
"error": "wechat_code_invalid",
"error_description": "微信授权码无效,过期或已使用"
}
{
"error": "sms_code_invalid",
"error_description": "手机验证码无效"
}
{
"error": "invalid_grant",
"error_description": "Invalid user credentials"
}
POST 请求URL: https://account.izhiju.cn/realms/zhiju/protocol/openid-connect/token
请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数:
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| client_id | string | wechatapp | 客户端id,微信小程序固定为wechatapp,必须字段 |
| client_secret | string | 平台相关的密钥 | 客户端密钥,必须字段 |
| grant_type | string | password | 授权类型,固定为password,必须字段 |
| username | string | username | 用户名 |
| password | string | user password | 用户秘密 |
返回结果:
{
"access_token": "eyJhbGciO", //token 可做为调用其它接口的授权凭证
"expires_in": 1800, //token有效期,单位秒
"refresh_expires_in": 1800, //refresh_token有效期,单位秒
"refresh_token": "eyJhbGci", //refresh_token,用于刷新token
"token_type": "Bearer", //token类型,Bearer
"not-before-policy": 0,
"session_state": "2f2bd023-793e-4abc-a067-7dd4d49705a3",
"scope": "profile" //token权限,profile表示用户信息
}
{
"error": "invalid_grant",
"error_description": "Invalid user credentials"
}
{
"error": "invalid_client",
"error_description": "Invalid client or Invalid client credentials"
}
{
"error": "unsupported_grant_type",
"error_description": "Unsupported grant_type"
}
POST 请求URL: https://account.izhiju.cn/realms/zhiju/protocol/openid-connect/token
请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数:
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| client_id | string | wechatapp | 客户端id,微信小程序固定为wechatapp,必须字段 |
| client_secret | string | 平台相关的密钥 | 客户端密钥,必须字段 |
| grant_type | string | password | 授权类型,固定为password,必须字段 |
| phoneNumber | string | 手机号码 | |
| areaCode | string | 86 | 国家区号 |
| password | string | user password | 用户秘密 |
返回结果:
{
"access_token": "eyJhbGciO", //token 可做为调用其它接口的授权凭证
"expires_in": 1800, //token有效期,单位秒
"refresh_expires_in": 1800, //refresh_token有效期,单位秒
"refresh_token": "eyJhbGci", //refresh_token,用于刷新token
"token_type": "Bearer", //token类型,Bearer
"not-before-policy": 0,
"session_state": "2f2bd023-793e-4abc-a067-7dd4d49705a3",
"scope": "profile" //token权限,profile表示用户信息
}
{
"error": "invalid_grant",
"error_description": "Invalid user credentials"
}
{
"error": "invalid_client",
"error_description": "Invalid client or Invalid client credentials"
}
{
"error": "unsupported_grant_type",
"error_description": "Unsupported grant_type"
}
GET 请求URL: https://account.izhiju.cn/realms/zhiju/account
请求头参数: Content-Type: application/json Authorization: Bearer {{token}}
返回结果:
{
"error": "HTTP 401 Unauthorized",
"error_description": "For more on this error consult the server log at the debug level."
}
{
"id": "456637c0-c3a0-412a-8aeb-37f518ac11ed",
"username": "alva",
"firstName": "alva1",
"lastName": "huang",
"email": "alva@izhiju.cn",
"emailVerified": false,
"attributes": {
"phoneNumber": [
"18680533727"
],
"picture": [
"https://account.izhiju.cn/resources/2cyxv/account/keycloak.v3/logo.svg"
],
"nickname": ["test"]
}
}
GET 请求 url: https://account.izhiju.cn/realms/zhiju/sms/user/{{userId}} 请求头参数: Content-Type: application/json Authorization: Bearer {{token}}
路径参数:{{userId}} 用户ID
返回结果:
{
"id": "456637c0-c3a0-412a-8aeb-37f518ac11ed",
"username": "test",
"email": "test@example.com",
"attributes": {
"phoneNumber": [
"+86 15889485045"
],
"nickname": [
"testtest"
],
"picture": [
"https://account.izhiju.cn/realms/zhiju/avatar/by-userid/3333c9a4-52e1-4ff8-bfb2-d17ba01ad528"
]
}
}
{
"error": "HTTP 401 Unauthorized",
"error_description": "For more on this error consult the server log at the debug level."
}
{
"error_description": "user not found",
"error": "user_not_found"
}
GET 请求 url: https://account.izhiju.cn/realms/zhiju/sms/user/byphone?phoneNumber=12345678901
请求头参数: Content-Type: application/json Authorization: Bearer {{token}}
查寻参数: | 参数名 | 参数类型 | 默认值 | 说明 | | ------------- | -------- | -------------- | --------------------------------------------- | | phoneNumber | string | | 用户手机号 | | areaCode | string | 86 | 手机号所属地区码,默认不填为中国86 |
返回结果:
{
"id": "456637c0-c3a0-412a-8aeb-37f518ac11ed",
"username": "test",
"email": "test@example.com",
"attributes": {
"phoneNumber": [
"+86 1111234434"
],
"nickname": [
"testtest"
],
"picture": [
"https://account.izhiju.cn/realms/zhiju/avatar/by-userid/3333c9a4-52e1-4ff8-bfb2-d17ba01ad528"
]
}
}
{
"error": "HTTP 401 Unauthorized",
"error_description": "For more on this error consult the server log at the debug level."
}
{
"error_description": "user not found",
"error": "user_not_found"
}
POST 请求URL: https://account.izhiju.cn/realms/zhiju/account
请求头参数: Content-Type: application/json Authorization: Bearer {{token}}
{
"id": "456637c0-c3a0-412a-8aeb-37f518ac11ed",
"username": "alva", //// username 6-12个字符,仅支持字母、数字和下划线,不区分大小写
"firstName": "alva1",
"lastName": "huang",
"email": "alva@izhiju.cn",
"emailVerified": false,
"attributes": {
"phoneNumber": [
"18680533727"
],
"picture": [
"https://account.izhiju.cn/resources/2cyxv/account/keycloak.v3/logo.svg"
]
}
}
返回结果:
{
"error": "HTTP 401 Unauthorized",
"error_description": "For more on this error consult the server log at the debug level."
}
{
"errors": [
{
"field": "username",
"errorMessage": "error-user-attribute-read-only",
"params": [
"${username}"
]
},
{
"field": "username",
"errorMessage": "readOnlyUsernameMessage",
"params": [
"${username}"
]
}
]
}
POST 请求 url: https://account.izhiju.cn/realms/zhiju/sms/user
请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数: | 参数名 | 参数类型 | 默认值 | 说明 | | ------------- | -------- | -------------- | --------------------------------------------- | | phoneNumber | string | | 用户手机号 | | areaCode | string | 86 | 手机号所属地区码,默认不填为中国86 | | password | string | | 密码,6-12个字符,字母、数字 | | smsCode | string | | 短信验证码,6位数字 |
返回结果:
{
"id": "456637c0-c3a0-412a-8aeb-37f518ac11ed",
"username": "alva", //// username 6-12个字符,仅支持字母、数字和下划线,不区分大小写
"firstName": "alva1",
"lastName": "huang",
"email": "alva@izhiju.cn",
"emailVerified": false,
"attributes": {
"phoneNumber": [
"18680533727"
],
"picture": [
"https://account.izhiju.cn/resources/2cyxv/account/keycloak.v3/logo.svg"
]
}
}
{
"error": "phonenumber_is_empty",
"error_description": "Must inform a cellphone number."
}
{
"error": "phonenumber_area_not_supported",
"error_description": "This area is not supported"
}
{
"error": "password_is_empty",
"error_description": "Must inform a password."
}
{
"error": "user_already_exists",
"error_description": "用户已存在,无需重复注册"
}
{
"error": "user_already_exists",
"error_description": "用户名和手机号冲突,请更换手机号"
}
{
"error": "invalid_verification_code",
"error_description": "Invalid verification code"
}
URL: put {{url}}/sms/update-profile http/1.1 请求头参数: Authorization: Bearer {{token}} Content-Type: application/x-www-form-urlencoded
请求体参数: &smsCode=867014 &phoneNumber=18680533727 &areaCode=86
URL: put {{url}}/sms/update-profile/reset-password 请求头参数: Authorization: Bearer {{token}} Content-Type: application/x-www-form-urlencoded
请求体参数: password=4223261 //密码规则 8-16个字符,需至少包含大、小写字母和数字 &smsCode=531495 //短信验证码
URL: put {{url}}/sms/update-profile/forgot-password http/1.1 请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数: password=422326 &smsCode=867014 &phoneNumber=18680533727 &areaCode=86
URL: put {{url}}/sms/update-profile/update-password http/1.1 请求头参数: Authorization: Bearer {{token}} Content-Type: application/x-www-form-urlencoded
请求体参数: password=422326 //新密码 8-16个字符,需至少包含大、小写字母和数字 &oldPassword=4223261 //旧密码
{
"error": "HTTP 401 Unauthorized",
"error_description": "For more on this error consult the server log at the debug level."
}
{
"app": "smarthome", //app值固定为smarthome
"uid": "3333c9a4-52e1-4ff8-bfb2-d17ba01ad528" //其中uid值是用户id
}
POST 请求URL: https://account.izhiju.cn/realms/zhiju/sms/verification-code 请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数:
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| areaCode | string | 86 | 手机号所属的区号,默认86 |
| phoneNumber | string | 手机号,11位数字 |
{
"expires_in": 1714988276153,
"resend_expires": 1714988036153,
"status": 1
}
{
"error": "sms_code_send_error",
"error_description": "短信发送失败,请检查手机号码或网络状态"
}
{
"error": "phonenumber_is_empty",
"error_description": "Must inform a cellphone number."
}
{
"error": "area_not_supported",
"error_description": "不支持该区号"
}
{
"error": "sms_code_send_error",
"error_description": "短信发送失败,请检查手机号码或网络状态"
}
POST 请求URL:https://account.izhiju.cn/realms/zhiju/sms/update-profile
请求头参数: Authorization: Bearer {{token}} Content-Type: application/x-www-form-urlencoded 请求体参数:
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| areaCode | string | 86 | 手机号所属的区号,默认86 |
| phoneNumber | string | 手机号,11位数字 | |
| smsCode | string | 短信验证码,6位数字 |
修改成功,状态码204,无内容返回
错误状态码401,token过期或错误,返回结果:
{
"error_description": "need login",
"error": "auth_invalid"
}
错误状态码400,返回结果:
{
"error_description": "Must inform a phone number",
"error": "phone_number_code_empty"
}
{
"error_description": "Token code cannot be empty",
"error": "smscode_be_empty"
}
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| defaultAvatar | string |
/ |
URL for default avatar |
| alwaysRedirect | boolean |
false |
Should always redirect to static image url |
| defaultSize | string |
lg |
Default avatar size |
| storageService | string |
file |
Provider to store avatar files |
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| root | string |
/ |
FS storage root path |
| route | string |
/{realm}/avatar/{avatar_id}/avatar-{size}.png |
URL and path to avatar file (Not need change) |
| baseurl | string |
/realms/ |
Keycloak base url |
| default-avatar | string |
/{realm}/avatar/default.png |
Path to default avatar |
| 参数名 | 参数类型 | 默认值 | 说明 |
|---|---|---|---|
| size | enum<String>("xs", "sm", "md", "lg", "xl", "xxl") |
{Config.defaultSize} |
Avatar file size |
| format | enum<String>("raw", "json") |
raw |
Response format |
请求: GET /realms/{realm}/avatar/by-userid/{user_id}
没有size参数时,返回默认lg大头像,没有format参数时,默认format为raw,返回原始图片
请求参数中指定format参数为json时,返回json格式数据:
{
status: 1,
avatar: "", // avatar url for lg
avatar_tpl: "", // avatar url template, placeholder: %s
}
Request:
GET /realms/{realm}/avatar/by-username/{username}
Respose (While format=json):
{
status: 1,
avatar: "", // avatar url for lg
avatar_tpl: "", // avatar url template, placeholder: %s
}
Request:
GET /realms/{realm}/avatar/default
Respose (While format=json):
{
status: 1,
avatar: "", // avatar url for lg
avatar_tpl: "", // avatar url template, placeholder: %s
}
Request:
POST /realms/{realm}/avatar
Authorization: Bearer {{token}}
Content-Type: multipart/form-data
image=<image file>