本文档为应用自动发布接口操作指南,您可在了解文档内容后,自行操作应用自动发布。
一、适用范围
接口目前已支持双包上传,您可通过此接口上传32位、64位安装包。
二、各类编程语言接口示例
三、作用
本套接口用于开发者通过接口方式向小米应用商店同步推送apk 包,包括应用查询接口、应用类别查询接口、应用推送接口;开发者可以通过该套接口提交新应用、更新应用版本和修改应用信息。
四、协议
1、采用协议
HTTP1.1,所有请求均使用POST 方式;
2、数据格式
请求应答数据均使用JSON 格式,采用UTF-8 编码;
3、传递请求参数规范
对于需要明确传递请求参数的接口,要求进行安全验证。此时请求中需要传递的参数:
- 使用RequestData 参数传递请求的JSON 字符串,具体格式见各个接口定义
- 附件(apk文件、icon图片以及截图等)按照具体接口的规定传递
- 使用SIG 参数传递请求参数的数字签名
这里看不懂没关系,后续接口部分会给出详细解释。
4、SIG 数字签名的生成方法
步骤一:计算每个参数的MD5 值(若参数为文件则计算整个文件的MD5 值);
步骤二:将各个参数及其对应的MD5 值按照下面示例格式组成JSON 数组,同时传递接口平台分配的访问密码;
访问密码:api接口的访问密码是私钥(私钥获取参考步骤三),非开发者帐号登录密码;另外每次点击重置私钥后,开发者站都会更新私钥,公钥不变。
- 将生成的数字签名转换为小写16 进制字符串
示例:
{"password":"访问密码", "sig":[ {"name":"parameterName1","hash":"MD5(名称为parameterValue1的文件)"}, {"name":"parameterName2","hash":"MD5(名称为parameterValue2的文件)"}]}
SIG的计算方式看不懂暂时没关系,后续具体接口部分还会给出详细的解释。
步骤三:使用小米应用商店分配的公钥:对生成的JSON 串进行RSA 数字签名,RSA 签名使用RSA/NONE/PKCS1Padding 方式;
以下是获取公钥、私钥的操作流程:


注意:私钥重置会导致原私钥失效,公钥加密方式可以参考文档头部的示例代码。
五、接口
地址:https://api.developer.xiaomi.com/devupload(此为接口地址,非网址)
1、应用包查询接口
通过应用包名查询小米应用商店内本账户推送的最新应用详情,用于判断是否需要进行应用推送。
1.1 请求体
请求地址:/dev/query:
接口参数:
参数名 | 可选性 | 类型 | 说明 |
RequestData | 必选 | json | 具体字段信息见下 |
SIG | 必选 | string | 加密串,如何计算具体见下 |
RequestData的参数:
参数名 | 可选性 | 类型 | 说明 |
packageName | 必选 | string | 应用包名 |
userName | 必选 | string | 用户名,在小米开发者站登录的邮箱。 |
SIG计算方法:
首先拼接json字符串:{"sig":[{"name":"RequestData","hash":"RequestData json字符串的md5 32位小写值"}],"password":"小米账号密码或者私钥"},然后通过公钥加密获取结果字符串即可。
1.2 请求示例
这里给出cURL和Postman两种示例可供参考。
cURL示例:
curl --location 'https://api.developer.xiaomi.com/devupload/dev/query' \
--form 'RequestData="{\"packageName\":\"com.test.myapplication360\",\"userName\":\"pengchen3@xiaomi.com\"}"' \
--form 'SIG="6767339b279975cf5af2e499c25240d7d2cb84e5c30283a7e5b95c5e5c2844ad82399b2352e82a8335a5e67b771304e778a040d62c3353da807b1e0a8b398e4862e7b6288be80bf5a4c1065269c29fdfda27b4f4d1578ac21f96acf8a5b25fb4b8fcfa161edfd5513a6683d9c0d42fc2a6d55745ac99156a56f90d7748b648726a824a643286b5db5d5621607e2e55116d5f8ffe478fe982861cf1d48a1edde895fe16929c6f9de361787da9d75adfe031cd29c313f85f84a5588bdfdf086fdc48c5ed3d6545bc13099a5acd8301ea55ae40ddc5dabbe4ec5bcbd34bc5d15c74c577b3e3f57ab9883d5075975f2e18d632af6e3c7b6b6349ea35d1d1dd3e9f29"'
Postman示例:

1.3 返回结果
参数名 | 可选性 | 类型 | 说明 |
result | 必选 | int | 0:表示成功,非0 表示查询失败,其中-7 表示包名被其他开发者占用,需要进行认领 |
packageInfo | 可选 | object | 应用包详细信息,如果为空表示不存在相应包,具体信息见下 |
create | 可选 | boolean | 是否允许新增该包名的应用 |
updateVersion | 可选 | boolean | 是否允许应用版本更新 |
updateInfo | 可选 | boolean | 是否允许应用信息更新 |
message | 可选 | string | 响应消息 若为正常响应则可为空,若非正常响应则返回错误信息 |
packageInfo信息:
参数名 | 类型 | 说明 |
appName | string | 应用名 |
versionName | string | 版本名 |
versionCode | long | 版本号 |
packageName | string | 包名 |
1.4 返回示例
{
"result": 0,
"updateVersion": false,
"updateInfo": false,
"create": true,
"message": "查询成功",
"packageInfo": {
"appName": "com.test.myapplication360",
"packageName": "com.test.myapplication360",
"versionCode": 1,
"versionName": "1.0.0"
}
}
2、应用类别查询接口
查询小米应用商店的应用分类。
2.1 请求体
地址:/dev/category
请求参数:无
cURL示例:
curl --location --request POST 'https://api.developer.xiaomi.com/devupload/dev/category'
Postman示例:

2.2 返回结果(JSON 字符串)
参数名 | 可选性 | 类型 | 说明 |
result | 必选 | int | 0:表示成功,非0 表示查询失败 |
message | 可选 | string | 响应消息 若为正常响应则可为空,若非正常响应则返回错误信息 |
categories | 可选 | list | 应用分类列表,若非正常响应可以为空 |
categories 应用分类实体字段:
参数名 | 类型 | 说明 |
categoryId | string | 分类id |
categoryName | string | 分类名称 |
2.3 返回示例
{"result":0,"message":"查询成功", "categories":[ {"categoryId":1,"categoryName":"理财"}, {"categoryId":2,"categoryName":"聊天与社交"}, {"categoryId":3,"categoryName":"旅行与交通"}, {"categoryId":4,"categoryName":"生活"}, {"categoryId":5,"categoryName":"实用工具"}, {"categoryId":6,"categoryName":"摄影摄像"}, {"categoryId":7,"categoryName":"图书与阅读"}, {"categoryId":8,"categoryName":"体育运动"}, {"categoryId":9,"categoryName":"时尚与购物"}, {"categoryId":10,"categoryName":"效率办公"}, {"categoryId":11,"categoryName":"新闻"}, {"categoryId":12,"categoryName":"学习与教育"}, {"categoryId":13,"categoryName":"娱乐消遣"}, {"categoryId":14,"categoryName":"医疗与健康"}, {"categoryId":17,"categoryName":"动作冒险"}, {"categoryId":16,"categoryName":"策略"}, {"categoryId":19,"categoryName":"角色扮演"}, {"categoryId":18,"categoryName":"竞速"}, {"categoryId":21,"categoryName":"体育运动"}, {"categoryId":20,"categoryName":"棋牌"}, {"categoryId":23,"categoryName":"益智解密"}, {"categoryId":22,"categoryName":"音乐游戏"}, {"categoryId":25,"categoryName":"飞行模拟"}, {"categoryId":27,"categoryName":"影音视听"}, {"categoryId":26,"categoryName":"重力感应"}]}
3、应用推送接口
推送应用到小米应用商店。
3.1 请求体
请求地址:/dev/push
接口参数:
可选参数名 | 可选性 | 类型 | 说明 |
RequestData | 必选 | json字符串 | 具体字段信息见下 |
SIG | 必选 | string | 加密字符串,具体拼接加密方式见下 |
apk | 可选 | file | Apk 包,上传类型为新增和更新时必传 |
secondApk | 可选 | file | secondApk包,双包发布时必传,上传方式和Apk包一致。双包上传时,无顺序限制,即apk字段可以为32位包,secondApk字段可以为64位包,反之亦可。 |
icon | 必选 | file | 应用图标 |
screenshot_1 | 可选 | file | 应用的第1 幅截图,synchroType=0 时必选 |
screenshot_2 | 可选 | file | 应用的第2 幅截图,synchroType=0 时必选 |
screenshot_3 | 可选 | file | 应用的第3 幅截图,synchroType=0 时必选 |
screenshot_4 | 可选 | file | 应用的第4 幅截图,可选,截图显示顺序为1-5 |
screenshot_pad_1 | 可选 | file | 平板应用的第1幅截图 synchroType=0且suitableType=1或2时必选 |
screenshot_pad_2 | 可选 | file | 平板应用的第2幅截图 synchroType=0且suitableType=1或2时必选 |
screenshot_pad_3 | 可选 | file | 平板应用的第3幅截图 synchroType=0且suitableType=1或2时必选 |
screenshot_pad_4 | 可选 | file | 平板应用的第4幅截图 synchroType=0且suitableType=1或2时必选 |
screenshot_pad_5 | 可选 | file | 平板应用的第5幅截图,可选 |
RequestData数据字段:
参数名 | 可选性 | 类型 | 说明 |
userName | 必选 | string | 在小米开发者站登录的邮箱 |
synchroType | 必选 | int | 更新类型:0=新增,1=更新包,2=内容更新 |
appInfo | 必选 | json字符串 | 具体信息见下 |
appinfo具体字段:
参数名 | 可选性 | 类型 | 说明 |
appName | 必选 | string | 应用名称 |
packageName | 必选 | string | 包名 |
publisherName | 可选 | string | 开发者名称,不传默认使用开发者站注册的名称 |
versionName | 可选 | string | 版本名,默认使用apk 中的VersionName |
category | 必选 | 应用分类(为从appstore 拉取的类型id) 新增synchroType=0 时必选 | |
keyWords | 必选 | string | 应用搜索关键字,空格分隔,新增时必选 |
desc | 必选 | string | 应用介绍,新增时必选 |
updateDesc | 可选 | string | 更新说明,当为更新应用时必选 |
brief | 必选 | string | 一句话简介,新增时必选 |
privacyUrl | 必选 | string | 隐私政策 |
testAccount | 可选 | json字符串 | 测试账号,json格式为:{"zh_CN":"测试账号内容"},300字符以内 |
onlineTime | 可选 | long (毫秒) | 上线时间。新增和更新版本时,设置定时上线时间 |
suitableType | 可选 | int | 设备发布类型: 0=手机,1=平板,2=手机和平板 可选项,若不传则默认为手机 |
SIG计算方法:
首先拼接json字符串:
{
"sig": [
{
"name": "RequestData",
"hash": "RequestData json字符串的md5 32位小写值"
},
{
"name": "apk",
"hash": "apk文件的md5 32位小写值"
},
{
"name": "icon",
"hash": "icon文件的md5 32位小写值"
},
{
"name": "screenshot_1",
"hash": "screenshot_1文件的md5 32位小写值"
},
{
"name": "screenshot_2",
"hash": "screenshot_2文件的md5 32位小写值"
},
{
"name": "screenshot_3",
"hash": "screenshot_3文件的md5 32位小写值"
},
{
"name": "screenshot_4",
"hash": "screenshot_4文件的md5 32位小写值"
},
{
"name": "screenshot_pad_1",
"hash": "screenshot_pad_1文件的md5 32位小写值"
},
{
"name": "screenshot_pad_2",
"hash": "screenshot_pad_2文件的md5 32位小写值"
},
{
"name": "screenshot_pad_3",
"hash": "screenshot_pad_3文件的md5 32位小写值"
},
{
"name": "screenshot_pad_4",
"hash": "screenshot_pad_4文件的md5 32位小写值"
}
],
"password": "小米账号密码或者私钥"
}
如果有secondApk,截图screenshot_5,screenshot_pad_5等,都必须依照这个格式拼接json字符串。然后通过公钥加密获取结果字符串即可。
3.2 请求示例:
这里给出cURL和Postman两种示例可供参考。
cURL示例:
curl --location 'https://api.developer.xiaomi.com/devupload/dev/push' \
--form 'RequestData="{\"userName\":\"pengchen3@xiaomi.com\",\"appInfo\":{\"appName\":\"应用名称\",\"packageName\":\"com.test.myapplication360\",\"publisherName\":\"开发者名称\",\"category\":2,\"keyWords\":\"关键字1 关键字2\",\"versionName\":\"版本名\",\"desc\":\"应用详情\",\"web\":\"应用官网\",\"brief\":\"一句话简介\",\"privacyUrl\":\"http://\",\"testAccount\":\"{\\\"zh_CN\\\":\\\"xxx\\\"}\",\"onlineTime\":1698771600000},\"synchroType\":0}"' \
--form 'SIG="25d318e71bfad463465654a1ff2c07989d6da7f7dbfdfc4ae6fce356f0e07f2253961235b885a609d3b436132516e411782f4a0f5e78cddfb607cc22e752d2f58fb4ecae2f06704b7fe8ebc728cbcbe9dfd796fdd48a8d653eaacc33dcb4d8d2a6816f695ab7128e2901bba5902547821b1bd95bd23679891aa2df8a1d12b50ebaa577b3025b3ba47a2df345008ac8baf3a20304f5f0901f253efc8de22e44bfbfe3aa16fb6ef8fddc2b63563d7d1d29d9a68133ac7f606bb1bdb8ab0e0ee463d61c2e638cab5f12f5d6db5b7975ab15b1b85b532c8739eb5d4e1ab41f8ea3c2faab1688203bdd74ececb1cefd3e01c113e6f66c95f9cb6afc0a933b71d41c1571a08ed38700464077f85bd23980beada9ab2ffddaa7c37eeb77ad70078c1925b0366df3716bf3dbbb659a1f9c51d9162874caa3d221d5b57fc531ed8108815f1b52a5103340b9cdd0d810c79f734665ecfdba979c6a9e524e3f270578253ed2bbd68721676e21419caae5ad8a9e12c315bd0af696f5a53ebb6bc12f497608868b999a73579cc3a3fbb864b98a243505bd8c8c888a977c6fda7e74cbf029e4b359374f00668865076deea76e3d5828ac24e03616d1c6e314146943ab53e2ab7972612fd3ec828acbc0439e406e11faf6f5955f1ce9c2f8f92b1b8b1b67604916a354a214aa539b5fbed51e6760f38354a8dc1ccf0569eed810eec3b3ddabe7677f0bb086d17cf2e024c397888adce4b9b484b1c7d1a641c12f9cd2dbbfe32cfd9715453b95fddbc3e0777826ad9e928a0299425f177f1747c7e9225b21648b28cb31e876a069d1f27d1bb885e00955b239f69a12faf1321a474d2e9aef762896b562d9cc2e47a27b02627085448d5bda60e9a02d68092723d6d58d6e150a4561"' \
--form 'apk=@"/Users/xxx/developer/apk/app-release.apk"' \
--form 'icon=@"/Users/xxx/developer/image/icon.png"' \
--form 'screenshot_1=@"/Users/xxx/developer/image/1.jpg"' \
--form 'screenshot_2=@"/Users/xxx/developer/image/2.jpg"' \
--form 'screenshot_3=@"/Users/xxx/developer/image/3.jpg"' \
--form 'screenshot_4=@"/Users/xxx/developer/image/4.jpg"'\
--form 'screenshot_pad_1=@"/home/mi/文档/平板截图1.png"' \
--form 'screenshot_pad_2=@"/home/mi/文档/平板截图2.png"' \
--form 'screenshot_pad_3=@"/home/mi/文档/平板截图3.png"' \
--form 'screenshot_pad_4=@"/home/mi/文档/平板截图4.png"'
Postman示例:

3.3 返回结果
参数名 | 可选性 | 类型 | 说明 |
result | 必选 | int | 返回码:0 表示成功,非0 表示推送失败 |
message | 可选 | string | 响应消息 若上传成功则可为空,否则返回错误信息 |
3.4 返回示例
{
"message": "提交新应用成功",
"result": 0
}
4、常见错误码
错误码 | 错误描述 |
-10000 | 需要检查自己的代码是否有问题,比如:参数格式是否正确,是否是json;公钥加密是否正确,是否按照示例代码的加密方式加密;等等 |
-2 | 包名与apk中解析出的不一致。即json串appinfo填写的包名(packageName)和上传的apk里面的包名,不一致。 |
-20014 | 密码错误,请检查是否点击生产了私钥,如果是,请使用私钥,否则使用小米账号密码。开放平台页面每次点击重置私钥,都会触发私钥发生改变。 |
-32 | 请检查是否已经创建包名,然后才可以上传apk。删除应用后,也需要重新创建包名。 |
-92 | APK不满足要求,请检查当前操作是否为同版本同apk更新。 |
-20002 | 数字签名异常。请检查SIG明问字符串是否拼接正确,并且使用正确公钥加密方式。 |
-20029 | RequestData参数非json格式异常。 |
-20030 | SIG的明文参数非json格式异常。 |
-20034 | testAccount参数非json格式异常 |
5、FAQ
Q:是否有测试环境或者沙盒环境可供接口调用?
A:暂时没有开放,可以线上调试推送应用,成功后,在开放平台页面撤回审核即可。
Q:是否有查询审核中的app或者在架的app应用信息、状态的接口?
A:暂时没有开放。
Q:上传的文件大小限制?
A:不超过2G。
Q:每日是否有接口调用次数限制?
A:非恶意调用,暂时无限制。
以上为应用自动发布接口操作指南,如您仍有问题,可联系客服,与我们取得联系。