qq群计算过去30天的qq群等级升级,那要是在想升级用不用重新传文件

技术文档 | 小米应用开发者文档 | Page 10
API功能描述:
本API提供了一个为用户的小米路由器添加远程下载的接口,用户用小米账号登录后,可以看到与当前帐号绑定的小米路由器,并选择下载到哪一台小米路由器。
参数列表:
Base64编码的下载地址,支持的链接类型:http、ftp、BT磁力链接、电驴ed2k、迅雷thunder
需要下载的文件名(可选)
来源(可选)
接入代码示例:
100个梦想的赞助商(微电影).mp4
&a href="/个梦想的赞助商(微电影).mp4"&下载本地&/a&
&button onclick="openDownloadWindow('/个梦想的赞助商(微电影).mp4', '100个梦想的赞助商(微电影).mp4')"&
下载到小米路由器
function openDownloadWindow(url, name) {
window.open("/d2r/?url=" + Base64.encodeURI(url) + "&src=demo" + "&name=" + encodeURIComponent(name), "", "", true);
实现效果实例:
100个梦想的赞助商(微电影).mp4
下载到小米路由器
小米上的中国(北京篇).mp4
下载到小米路由器
This entry was posted in
小米应用商店按照符合Android标准的原则进行设计,使用包名(Package Name)作为应用的唯一标识。即:包名必须唯一,一个包名代表一个应用,不允许两个应用使用同样的包名。包名主要用于系统识别应用,几乎不会被最终用户看到。
包名的命名规则
可以包含大写字母(A到Z)、小写字母(a到z)、数字和下划线,可以用点(英文句号)分隔,隔开的每一段都必须以字母开头。
避免包名冲突
因为包名是唯一标识,为了避免与其他应用的包名重复,产生冲突,您可以这样命名:
将您的域名反转过来作为前缀,比如如果您的域名是,那么包名可以用com.zan开头,这样可以有效的避免重复
在后面增加描述产品名称的字符,比如果果您的应用是视频应用,可以命名为com.zan.video
如果您没有域名,可以使用自己的邮箱作为前缀,比如 com.163.WoDeYouXiang
包名冲突如何处理?
如果您发现您尚未发布的应用,包名和其他开发者已经发布的应用重复了,建议立刻修改应用的包名,避免冲突。
如果您的应用已经发布了,但是在小米开发者站上传应用时,被告知已经有其他开发者上传了同包名的应用,可以按照指示,联系
应用发布后,请不要修改包名,一旦您修改了包名,就会被当作一个新的应用,旧版用户也无法收到应用商店的升级提醒。
This entry was posted in
下载最新SDK,请访问:
接入前准备
第一步:请先阅读
第二步:在看文档之前,建议您先把随本文档一起分发的两个Demo程序安装到盒子或TV上,(MiBox_SDK_Demo_OfflineGame.apk和MiBox_SDK_Demo_OnlineGame.apk),这两个程序完整演示了小米游戏SDK的工作流程,有助于您快速理解我们SDK支付的整个流程。
特别注意事项
您的应用必须在manifest中使用将其定义为电视应用,这样才能在应用上传时被系统分类为电视应用,从而进入正确的审核流程,定义方法如下:
&uses-feature
android:name=”android.hardware.type.television” android:required=”true” &
&/uses-feature&
参考:/guide/topics/manifest/uses-feature-element.html
修订记录:
修改单机、网游统一支付接口为miUniPay()
修改新的登录欢迎框
1、盒子与TV图标放置的位置说明
在apk的res文件夹下应该有drawable-mdpi,drawable-tvdpi,drawable-hdpi,drawable-xhdpi文件夹,将符合小米盒子视觉规范的应用图标放入drawable-mdpi和drawable-tvdpi;将符合小米电视视觉规范的应用图标放入drawable-hdpi和drawable-xhdpi。
小米盒子应用图标规范请参考:
小米电视应用图标规范请参考:
图标标题字体“方正兰亭粗黑”字体文件请下载参考。
2、单机游戏流程概述
单机游戏开发者在支付前要调用miLogin()函数进行登陆,登陆成功后才可以调用miUniPayOffline()函数进行支付,SDK会自己处理用户登录、注册、余额不足、已购买过等逻辑最后返回结果。对于开发者来说,只需要按以下操作引入代码即可完成单机游戏支付流程。
3、SDK调用方法
3.1 初始化
在小米开发者创建应用并获取 AppId 、AppKey和AppSecretKey,创建应用时packageName必须以“.mitv”为后缀。
将SDK包中的MiGameCenterSDKService.apk放到应用工程的的assets目录下,SDK的jar包放到工程的libs下,在buildpath中引用,然后对SDK进行初始化。
注意: 需要检查下面的一致性,如果不一致会导致调用登录和其它 SDK 接口失败
1.游戏的包名是否与提供给小米后台数据配置的包名一致;
2. AppId与 AppKey是否与申请的一致。
然后在Application.onCreate中调用以下初始化方法
MiAppInfo appInfo = new MiAppInfo();
appInfo.setAppId("请申请获得");
appInfo.setAppKey("请申请获得");
appInfo.setAppType(MiGameType.offline); // 单机游戏
MiCommplatform.Init( this, appInfo );
SDK 所需要的权限
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="com.xiaomi.sdk.permission.PAYMENT" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
3.2 调用支付
3.2.1小米帐户登陆调用代码
MiCommplatform.getInstance().miLogin( context, new OnLoginProcessListener(){
public void finishLoginProcess( int code, MiAccountInfo arg1 ){
switch( code ){
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
// 登陆成功
//获取用户的登陆后的UID(即用户唯一标识)
long uid = arg1.getUid();
//获取用户的登陆的Session(请参考4.2.3.3流程校验Session有效性)
String session = arg1.getSessionId();//若没有登录返回null
//请开发者完成将uid和session提交给开发者自己服务器进行session验证
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_LOGIN_FAIL:
// 登陆失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_CANCEL:
// 取消登录
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//登录操作正在进行中
// 登录失败
3.2.2 可消耗商品(例如:血瓶,法瓶等可重复购买的商品)
MiBuyInfoOffline offline = new MiBuyInfoOffline();
offline.setCpOrderId( UUID.randomUUID().toString() );//订单号唯一(不为空)
offline.setProductCode( “productCode” );//商品代码,开发者申请获得(不为空)
offline.setCount( 3 );//购买数量(商品数量最大9999,最小1)(不为空)
MiCommplatform.getInstance().miUniPayOffline( activiy, offline,
new OnPayProcessListener(){
public void finishPayProcess( int code ) {
switch( code ) {
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
//购买成功,请处理发货
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_CANCEL:
//取消购买
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_FAILURE:
//购买失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//操作正在执行
//购买失败
3.2.3 非消耗商品(例如:关卡等不可重复购买的商品)
MiBuyInfoOffline offline = new MiBuyInfoOffline();
offline.setCpOrderId( UUID.randomUUID().toString() );//订单号唯一(不为空)
offline.setProductCode( “productCode” );//商品代码,开发者申请获得(不为空)
offline.setCount( 1 );//购买数量(只能为1)(不为空)
MiCommplatform.getInstance().miUniPayOffline(activiy, offline,
new OnPayProcessListener(){
public void finishPayProcess( int code ) {
switch( code ) {
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
//购买成功,请处理发货
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_CANCEL:
//取消购买
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_FAILURE:
//购买失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_REPEAT:
//已购买过,无需购买,可直接使用
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//操作正在执行
//购买失败
开发方订单号
20~100字符以内,开发方生成,要求不能重复,可根据开发方规则自行生成。
productCode
规则要求:可由数字0-9,字母a-zA-Z以及特殊字符”_”,”.”,”-”组成,长度8~40位,同一款游戏内productCode要求唯一,区分字母大小写。建议使用com.xiaomi.migc.xxx的格式命名。调用时请不要弄混非消耗类商品和可消耗类商品的productCode。
非消耗类商品,取值=1
可消耗类商品,取值&=1
4、服务器接口
单机游戏如果需要,也可以提供接收订单支付结果通知的地址(可选)。
4.1 订单支付结果通知接口
此接口由开发者负责开发并在游戏上线前提交给游戏平台进行配置。
在订单支付成功后,小米游戏平台服务器会将支付结果通知给开发者预先提供的服务器上。若开发者所提供的服务器地址不可用,在一定时间段内游戏平台服务器会按照周期进行轮训(前10次,每分钟通知1次;10次后每小时通知1次)。
具体流程如下:
注:由于是异步通知模型,(3)和(4)不一定是按序号产生。因此(4)和(5)需要进行轮询处理或者使用接口进行支付结果查询。
相比后面提到的开发者主动查询订单的模式,我们推荐使用此模式。
4.2 接口及参数说明:
接口地址:各开发者服务器的通知地址(提前申请,在小米开发者站进行配置)
请求参数说明:
开发商订单ID
cpUserInfo
开发商透传信息
游戏平台订单ID
orderStatus
订单状态TRADE_SUCCESS代表成功
支付金额,单位为分,即0.01米币。
productCode
productName
productCount
支付时间,格式yyyy-MM-dd HH:mm:ss
orderConsumeType
订单类型:10:普通订单11:直充直消订单
签名,签名方法见后面说明
返回参数说明:
状态码,200成功1506
cpOrderId错误1515
appId错误1516
uid错误1525
signature错误
注意:对于同一个订单号的多次通知,开发商要自己保证只处理一次发货。
4.3 接口格式说明:
请求方式:采用HTTP GET方式
?参数1=值1&参数2=值2&….&参数n=值n,如果遇到文本参数值,需要根据情况对参数值做 UrlEncode。
返回参数:采用json格式,如:{“返回参数1″:”返回值1″,”返回参数2″:”返回值2″,….”返回参数n”:” 返回值 n”}
4.4 签名方法说明:
4.4.1 生成带签名字符串
表中各参数按字母顺序排序(不包含signature),如果第一个字母相同,按第二个字母排序,依次类推。排序后拼接成par1=val1&par2=val2&par3=val3的格式,所生成的字符串即为待签名的字符串。没有值的参数请不要参与签名。由于有些数据根据HTTP协议需求,需要进行URLencoding,这样接收方才可以接收到正确的参数,但如果这个参数参与签名,那么待签名字符串必须是字符串原值而非URLencoding的值。
4.4.2 签名算法
以appSecret作为key,使用hmac-sha1带密钥(secret)的哈希算法对代签字符串进行签名计算。签名的结果由16进制表示。hmac-sha1 带密钥(secret)哈希算法的实现参考附录。
5.1 APK打包及发布
需要注意,SDK 包是以 jar 包提供给开发者,此jar包本身已为混淆状态,您在混淆自己游戏的 APK包时,需要在proguard.cfg 里加入,以避免二次混淆。
-keep public class
com.xiaomi.gamecenter.sdk.ui.actlayout.ViewAliPayWeb$PayObject{*;}
-keepclasseswithmembers class * {
public (...);
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
5.2 服务器签名函数
Hmac-SHA1算法java实现参考:
import javax.crypto.M
import javax.crypto.SecretK
import javax.crypto.spec.SecretKeyS
public class HmacSHA1Encryption {
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
public static String HmacSHA1Encrypt( String encryptText,
String encryptKey ) throws Exception{
byte[] data = encryptKey.getBytes( ENCODING );
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec( data, MAC_NAME );
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance( MAC_NAME );
// 用给定密钥初始化 Mac 对象
mac.init( secretKey );
byte[] text = encryptText.getBytes( ENCODING );
// 完成 Mac 操作
byte[] digest = mac.doFinal( text );
StringBuilder sBuilder = bytesToHexString( digest );
return sBuilder.toString();
* 转换成Hex
* @param bytesArray
public static StringBuilder bytesToHexString( byte[] bytesArray ){
if ( bytesArray == null ){
StringBuilder sBuilder = new StringBuilder();
for ( byte b : bytesArray ){
String hv = String.format("%02x", b);
sBuilder.append( hv );
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptData 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
public static String HmacSHA1Encrypt( byte[] encryptData, String encryptKey ) throws Exception{
byte[] data = encryptKey.getBytes( ENCODING );
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec( data, MAC_NAME );
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance( MAC_NAME );
// 用给定密钥初始化 Mac 对象
mac.init( secretKey );
// 完成 Mac 操作
byte[] digest = mac.doFinal( encryptData );
StringBuilder sBuilder = bytesToHexString( digest );
return sBuilder.toString();
This entry was posted in
下载最新SDK,请访问:
接入前准备
第一步:请先阅读
第二步:在看文档之前,建议您先把随本文档一起分发的两个Demo程序安装到盒子或TV上,(MiBox_SDK_Demo_OfflineGame.apk和MiBox_SDK_Demo_OnlineGame.apk),这两个程序完整演示了小米游戏SDK的工作流程,有助于您快速理解我们SDK支付的整个流程。
特别注意事项
您的应用必须在manifest中使用将其定义为电视应用,这样才能在应用上传时被系统分类为电视应用,从而进入正确的审核流程,定义方法如下:
&uses-feature
android:name=”android.hardware.type.television” android:required=”true” &
&/uses-feature&
参考:/guide/topics/manifest/uses-feature-element.html
修订记录:
修改单机、网游统一支付接口为miUniPay()
修改新的登录欢迎框
1、盒子与TV图标放置的位置说明
在apk的res文件夹下应该有drawable-mdpi,drawable-tvdpi,drawable-hdpi,drawable-xhdpi文件夹,将符合小米盒子视觉规范的应用图标放入drawable-mdpi和drawable-tvdpi;将符合小米电视视觉规范的应用图标放入drawable-hdpi和drawable-xhdpi。
小米盒子应用图标规范请参考:
小米电视应用图标规范请参考:
图标标题字体“方正兰亭粗黑”字体文件请下载参考。
2、网络游戏
2.1 网络游戏流程概述
网络游戏开发者需要管理用户登录,并且需要记录用户登录状态,用户每次启动游戏时,必须调用 miLogin()来判断用户会话是否超时,在游戏过程中如果需要充值可以调用 miUniPayOnline()。
2.2 网游用户开户及登录流程
UID不是小米ID,但与小米ID有对照关系;
请开发者一定要使用这个UID作为用户标识,不要使用本机IMEI或IMSI
未来游戏平台支持一个小米ID对应多个UID,从而实现用户在单款游戏中创建多角色的功能。
2.3 网游用户使用米币充值流程
3、SDK调用方法
对于开发者来说,只需要引入以下代码即可完成网络游戏支付流程。
3.1 初始化
在小米开发者创建应用并获取 AppId 、AppKey和AppSecretKey,创建应用时packageName必须以“.mitv”为后缀。
将SDK包中的MiGameCenterSDKService.apk放到应用工程的的assets目录下,SDK的jar包放到工程的libs下,在buildpath中引用,然后对SDK进行初始化。
注意: 需要检查下面的一致性,如果不一致会导致调用登录和其它 SDK 接口失败
1.游戏的包名是否与提供给小米后台数据配置的包名一致;
2. AppId与 AppKey是否与申请的一致。
然后在Application.onCreate中调用以下初始化方法
MiAppInfo appInfo = new MiAppInfo();
appInfo.setAppId("请申请获得");
appInfo.setAppKey("请申请获得");
appInfo.setAppType(MiGameType.online); // 网游
MiCommplatform.Init( this, appInfo );
SDK所需要的权限
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="com.xiaomi.sdk.permission.PAYMENT" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
3.2 小米账户登录调用代码
可以通过实现OnLoginProcessListener接口来捕获登录结果。
MiCommplatform.getInstance().miLogin( context,
new OnLoginProcessListener()
public void finishLoginProcess( int code ,MiAccountInfo arg1)
switch( code )
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
// 登陆成功
//获取用户的登陆后的UID(即用户唯一标识)
String uid = arg1.getUid();
//获取用户的登陆的Session(请参考4.2.3.3流程校验Session有效性)
String session = arg1.getSessionId();//若没有登录返回null
//请开发者完成将uid和session提交给开发者自己服务器进行session验证
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_LOGIN_FAIL:
// 登陆失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_CANCEL:
// 取消登录
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//登录操作正在进行中
// 登录失败
3.3 虚拟币充值调用
MiBuyInfoOnline online = new MiBuyInfoOnline();
online.setCpOrderId(UUID.randomUUID().toString());//订单号唯一(不为空)
online.setCpUserInfo( “cpUserInfo” ); //此参数在用户支付成功后会透传给CP的服务器
online.setMiBi( 10 ); //必须是大于1的整数,10代表10米币,即10元人民币(不为空)
//用户信息
Bundle mBundle = new Bundle();
mBundle.putString( GameInfoField.GAME_USER_BALANCE, "1000" );
//用户余额
mBundle.putString( GameInfoField.GAME_USER_GAMER_VIP, "vip0" );
mBundle.putString( GameInfoField.GAME_USER_LV, "20" );
//角色等级
mBundle.putString( GameInfoField.GAME_USER_PARTY_NAME, "猎人" );
//工会,帮派
mBundle.putString( GameInfoField.GAME_USER_ROLE_NAME, "meteor" ); //角色名称
mBundle.putString( GameInfoField.GAME_USER_ROLEID, "123456" );
mBundle.putString( GameInfoField.GAME_USER_SERVER_NAME, "峡谷" );
//所在服务器
MiCommplatform.getInstance().miUniPayOnline(activity, online, mBundle,
new OnPayProcessListener()
public void finishPayProcess( int code ) {
switch( code ) {
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
//购买成功
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_CANCEL:
//取消购买
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_FAILURE:
//购买失败
MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//操作正在进行中
//购买失败
参数说明:
开发方订单号
必填参数。20~100字符以内,要求必须由开发者的业务服务器生成,因订单支付成功后游戏平台服务器会直接将支付结果通知给开发者的业务服务器,通知参数的cpOrderId是重要信息。
cpUserInfo
给网游透传参数
必填参数。用于透传用户信息,当用户支付成功后我们会将此参数透传给开发者业务服务器。(不能为null或“”)
购买米币的数量
必填参数。且数量是int型,即最少只能购买1米币对应的虚拟币.
4、服务器接口
请开发者以小米游戏中心服务器通知的结果为准为用户进行虚拟币充值。
4. 1 订单支付结果通知接口
流程说明:
在订单支付成功后,小米游戏平台服务器会将支付结果通知给开发者预先提供的服务器上。若开发者所提供的服务器地址不可用,在一定时间段内游戏平台服务器会按照周期进行轮训(前10次,每分钟通知1次;10次后每小时通知1次)。
具体流程如下:
注:由于是异步通知模型,(3)和(4)不一定是按序号产生。因此(4)和(5)需要进行轮询处理或者使用接口进行支付结果查询。
相比后面提到的开发者主动查询订单的模式,我们推荐使用此模式。
接口及参数说明:
接口地址:各开发者服务器的通知地址(提前申请,在小米开发者站进行配置)
请求方法:GET
请求参数说明:
开发商订单ID
cpUserInfo
开发商透传信息
游戏平台订单ID
orderStatus
订单状态TRADE_SUCCESS代表成功
支付金额,单位为分,即0.01米币。
productCode
productName
productCount
支付时间,格式yyyy-MM-dd HH:mm:ss
orderConsumeType
订单类型:10:普通订单11:直充直消订单
签名,签名方法见后面说明
返回参数说明:
状态码,200成功1506
cpOrderId错误1515
appId错误1516
uid错误1525
signature错误3515
订单信息不一致,用于和CP的订单校验
注意:对于同一个订单号的多次通知,开发商要自己保证只处理一次发货。
4.2 主动查询订单支付状态接口
流程说明:
此接口由小米游戏中心为开发者提供。
接口及参数说明:
接口地址:
请求方法:GET
请求参数说明:
开发商订单ID
签名,签名方法见后面说明
正确返回参数说明:
开发商订单ID
cpUserInfo
开发商透传信息
orderStatus
订单状态TRADE_SUCCESS
代表成功WAIT_BUYER_PAY 代表未支付REPEAT_PURCHASE 订购关系已经存在
支付金额,单位为分,即0.01米币
productCode
productName
productCount
支付时间,格式yyyy-MM-dd HH:mm:ss
orderConsumeType
订单类型:10:普通订单11:直充直消订单
签名,签名方法见后面说明
错误返回参数说明:
状态码1506
cpOrderId错误1515
appId错误1516
uid错误1525
signature错误
错误信息描述
4.3 用户session验证接口
流程说明:
此接口由小米游戏中心为开发者提供,用于验证登录账户的有效性。
注意:用户的唯一标识是通过SDK获得的uid,而不是Session,Session用于校验登录验证的有效性,必须经过SDK、游戏中心服务器、开发者服务器进行三方验证,如果Session失效,需要重新调用miLogin()进行登录。
接口及参数说明:
接口地址:
请求方法:GET
请求参数说明:
用户session ID
签名,签名方法见后面说明
返回参数说明:
验证正确1515
appId错误1516
uid错误1520
session错误1525
signature错误
错误信息描述
接口格式说明:
?参数1=值1&参数2=值2&….&参数n=值n,如果遇到文本参数值,需要根据情况对参数值做 UrlEncode。
返回参数:采用json格式,如:{“返回参数1″:”返回值1″,”返回参数2″:”返回值2″,….”返回参数n”:” 返回值 n”}
签名方法说明:
1、生成带签名字符串
表中各参数按字母顺序排序(不包含signature),如果第一个字母相同,按第二个字母排序,依次类推。排序后拼接成par1=val1&par2=val2&par3=val3的格式,所生成的字符串即为待签名的字符串。没有值的参数请不要参与签名。由于有些数据根据HTTP协议需求,需要进行URLencoding,这样接收方才可以接收到正确的参数,但如果这个参数参与签名,那么待签名字符串必须是字符串原值而非URLencoding的值。
2、签名算法
以appSecret作为key,使用hmac-sha1带密钥(secret)的哈希算法对代签字符串进行签名计算。签名的结果由16进制表示。hmac-sha1 带密钥(secret)哈希算法的实现参考附录。
5.1 APK打包及发布
需要注意,SDK 包是以 jar 包提供给开发者,此jar包本身已为混淆状态,您在混淆自己游戏的 APK包时,需要在proguard.cfg 里加入,以避免二次混淆。
public (...);
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
5.2 网游服务器签名函数
Hmac-SHA1算法java实现参考:
import javax.crypto.M
import javax.crypto.SecretK
import javax.crypto.spec.SecretKeyS
public class HmacSHA1Encryption {
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
public static String HmacSHA1Encrypt( String encryptText,
String encryptKey ) throws Exception{
byte[] data = encryptKey.getBytes( ENCODING );
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec( data, MAC_NAME );
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance( MAC_NAME );
// 用给定密钥初始化 Mac 对象
mac.init( secretKey );
byte[] text = encryptText.getBytes( ENCODING );
// 完成 Mac 操作
byte[] digest = mac.doFinal( text );
StringBuilder sBuilder = bytesToHexString( digest );
return sBuilder.toString();
* 转换成Hex
* @param bytesArray
public static StringBuilder bytesToHexString( byte[] bytesArray ){
if ( bytesArray == null ){
StringBuilder sBuilder = new StringBuilder();
for ( byte b : bytesArray ){
String hv = String.format("%02x", b);
sBuilder.append( hv );
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptData 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
public static String hmacSHA1Encrypt( byte[] encryptData, String encryptKey ) throws Exception{
byte[] data = encryptKey.getBytes( ENCODING );
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec( data, MAC_NAME );
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance( MAC_NAME );
// 用给定密钥初始化 Mac 对象
mac.init( secretKey );
// 完成 Mac 操作
byte[] digest = mac.doFinal( encryptData );
StringBuilder sBuilder = bytesToHexString( digest );
return sBuilder.toString();
This entry was posted in
为什么要获取BUG报告
在应用测试或使用过程中出现了BUG,但并不能得知BUG的复现过程怎么办?产生BUG的原因是什么?我该怎么解决这个BUG?——这些问题都可以通过在 MIUI系统的手机中抓取了BUG报告后,通过分析BUG报告中的数据得知。
BUG报告的抓取方法(手机)
在手机的拨号界面输入“*#*#284#*#*”,系统会自动提示:“正在生成bug报告,大概需要1分钟”
文件生成后,可在下面的路径查找到相应BUG报告的压缩包:打开“文件管理”——“分类浏览” ——“日志”
需要导出、查看文件所在路径的方法:长按相关日志后,在弹出的下拉栏中点击“更多”——“详情”,BUG报告保存的路径为:/storage/sdscard0/MIUI/debug_log/..
BUG报告的抓取方法(平板)
平板的log日志获取方式仅第一步与手机不同——点击设置-关于平板-点击处理器3次(如下图)
BUG报告抓取Q&A
Q:抓取BUG报告的方法是否适用于所有手机?
A:改BUG报告抓取方法只适用于MIUI系统的小米系列手机,其他系统、厂商的手机操作无效;
Q:BUG报告可以抓取的信息有哪些?
A:手机最近运行的一段时间内(时间长短不固定,大概为5-10分钟。要根据手机单位时间内运行时产生的数据量多少而定)产生的所有数据文件;
Q:为什么我抓取的BUG报告没有我想要的BUG信息?
A:是因为出现BUG的时间和抓取BUG报告的时间间隔太长;BUG报告只会抓取一段时间内的手机运行的数据(5-10分钟),建议您复现相关BUG后,第一时间进行BUG报告的抓取。
Q:我是用户,不是开发者,在使用过程中发现了应用的BUG,抓取了这个BUG我也看不懂,怎么办?
A:如果您在小米应用商店下载的应用使用过程中发生了闪退、未响应、获取内容失败的情况,非常欢迎您抓取相应的BUG报告后,发送给到邮箱;我们会查找出现问题的原因,并尽全力修复BUG。
This entry was posted in
小米应用商店希望用户可以用到最新版本的应用,因此我们会和第三方合作,为用户提供最新最全的应用。
当我们发现小米应用商店收录的应用版本并非最新版时,会提供来自第三方的新版本给用户。这时我们会在小米开发者站展示『其他来源』字样,提醒您应用可能需要更新。
『其他来源』的新版本一定符合以下条件
包名(PackageName)、签名(Signature)一致,保证是来自同一个开发者。
版本号(VersionCode)更高,保证是新版本。
通过小米应用商店的病毒检测、自动化测试和人工审核。
您仍然可以为小米应用商店提供独特的APK,您可以上传和『其他来源』相同版本号(VersionCode)的应用。通过审核之后,用户将优先获得您提供的APK。
如果您遇到了签名丢失等情况,导致其他来源并非您发布的应用,请联系
,我们会有工作人员帮您解决问题。
This entry was posted in
小米电视/盒子游戏产品引入流程,分为以下几个阶段:
发布及上线
1. 商务接洽
请游戏厂商请先与小米游戏商务联系,并同时提交游戏的demo,确定合作意向。签署商务合作协议并取得游戏相关的适配及开发手册。
小米游戏中心_商务合作联系人:
“”
“”
(同时请抄送)
2. 游戏定制
根据游戏特点,我们会提出针对小米电视/盒子的操作适配建议,请游戏厂商结合我们的适配建议对游戏进行修改。
确定游戏联运合作后, 需要签署相关游戏联运协议。同时启动游戏SDK对接。
注册后台帐号;
申请游戏AppId,完成基本数据配置;
游戏厂商自测通过;
小米测试通过,签名返回;
游戏厂商在小米小米开发者站后台自助上传提交。
4.提交测试
游戏厂商自测以后,请将游戏最终提交给小米测试人员进行游戏审核测试。
5.发布及上线
测试通过后将会收录及发布到小米电视/盒子游戏中心。
免费游戏不涉及结算部分,如果游戏包含计费内容,按照商务协议中约定的结算周期联系小米游戏中心结算人员进行对账结算。
小米游戏中心_结算联系人:
更多参考:
计费接入:
游戏上线、开发指南:
This entry was posted in
小米游戏平台是小米公司推出的面向所有小米手机、MIUI 用户的游戏平台,整个游戏平台整合了 MIUI 系统、开发 SDK、互联网网站、小米论坛等各方面优质资源,力求打造一个良好的安卓游戏生态系统。小米游戏平台提供游戏下载、游戏搜索、游戏计费(支持单机游戏和网络游戏)等多种平台支撑能力,接入简单快捷,是众多游戏开发商最优的选择。
小米游戏中心目前均采用游戏联运的方式接入游戏,合作分为以下几个阶段:
1. 商务阶段
请游戏厂商先与小米游戏中心商务人员联系,提交游戏相关资料,确定合作意向。
小米游戏中心_商务合作联系人:
提交资料建议包含:游戏介绍,游戏安装包,游戏内测及封测数据参考。
2. SDK接入
确定游戏联运合作后, 需要签署相关游戏联运协议。同时启动游戏SDK对接。
注册后台帐号;
申请游戏AppId,完成基本数据配置;
游戏厂商自测通过;
小米测试通过,签名返回;
游戏厂商在小米小米开发者站后台自助上传提交。
3. 游戏上线
游戏审核通过上线推广。
4. 对账结算
对游戏联运合作的游戏,按照协议约定的结算周期进行对账结算。
小米游戏中心_结算联系人:
更多游戏SDK接入,请参考
单机游戏:
网络游戏:
This entry was posted in
小米游戏中心手机单机游戏联运接入包括服务器端和客户端两部分,其中服务器端接入是可选的(取决于单机游戏是否有服务器端)。
下载最新SDK,请访问:,,,
有任何技术问题,欢迎到吐槽,寻求帮助。
赶快适配小米平板吧!
在继续看文档之前,建议您先把随本文档一起分发的两个Demo程序安装到手机上,(SDK_Demo_OfflineGame.apk和SDK_Demo_OnlineGame.apk,上面SDK中已包含),这两个程序完整演示了小米游戏SDK的工作流程,有助于您快速理解我们SDK支付的整个流程。
修订记录:
v3.3.7 接口无变化
1.单机游戏流程概述
单机游戏开发者在支付前要调用miLogin()函数进行登陆,登陆成功后才可以调用miUniPayOffline()函数进行支付,SDK会自己处理用户登录、注册、余额不足、已购买过等逻辑最后返回结果。对于开发者来说,只需要按以下操作引入代码即可完成单机游戏支付流程。
注意:在调用miLogin()函数之前,需要:1)在开发者站申请并绑定有效的appId/appKey、2)配置应用内支付模块。
2.SDK调用方法
在小米开发者创建应用并获取 AppId 、AppKey和AppSecretKey,创建应用时packageName必须以“.mi”为后缀。
将 SDK 包中的 MiGameCenterSDKService.apk 放到应用工程的的 assets 目录下, SDK 的 jar 包放到工程的 libs 下,在 buildpath 中引用,然后对 SDK 进行初始化。
注意: 需要检查下面的一致性,如果不一致会导致调用登录和其它 SDK 接口失败
1.游戏的包名是否与提供给小米后台数据配置的包名一致;
2. AppId与 AppKey是否与申请的一致。
然后在Application.onCreate中调用以下初始化方法
MiAppInfo appInfo = new MiAppInfo();
appInfo.setAppId("请申请获得");
appInfo.setAppKey("请申请获得");
appInfo.setAppType(MiGameType.offline); // 单机游戏
MiCommplatform.Init( this, appInfo );
SDK 所需要的权限
&uses-permission android:name="android.permission.GET_TASKS"
&uses-permission android:name="com.xiaomi.sdk.permission.PAYMENT" /&
2.2 调用支付
2.2.1小米帐户登陆调用代码
MiCommplatform.getInstance().miLogin( context, new OnLoginProcessListener(){
public void finishLoginProcess( int code , MiAccountInfo arg1 ) {
switch( code ) {
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
// 登陆成功
//获取用户的登陆后的 UID(即用户唯一标识)
long uid = arg1.getUid();
//若没有登录返回 null
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_LOGIN_FAIL:
// 登陆失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_CANCEL :
// 取消登录
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
// 登录操作正在进行中
// 登录失败
2.2.2 可消耗商品(例如:血瓶,法瓶等可重复购买的商品)
MiBuyInfoOffline offline = new MiBuyInfoOffline();
offline.setCpOrderId( UUID.randomUUID ().toString() );//订单号唯一(不为空)
offline.setProductCode( "productCode" );//商品代码,开发者 申请获得(不为空)
offline.setCount( 3 );//购买数量 (商品数量最大 9999,最小 1)(不为空)
MiCommplatform.getInstance ().miUniPayOffline( activiy, offline,
new OnPayProcessListener(){
public void finishPayProcess( int code ) {
switch( code ) {
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
//购买成功 ,请处理发货
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_CANCEL:
//取消购买
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_FAILURE:
//购买失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//操作正在执行
//购买失败
2.2.3非消耗商品(例如:关卡等不可重复购买的商品)
MiBuyInfoOffline offline = new MiBuyInfoOffline();
offline.setCpOrderId( UUID.randomUUID ().toString() );//订单号唯一(不为空)
offline.setProductCode( “productCode ” );//商品代码,开发者申请获得(不为空)
offline.setCount( 1 );//购买数量 (只能为 1)(不为空)
MiCommplatform.getInstance().miUniPayOffline(activiy, offline,
new OnPayProcessListener(){
public void finishPayProcess( int code ) {
switch( code ) {
case MiErrorCode.MI_XIAOMI_GAMECENTER_SUCCESS:
//购买成功,请处理发货
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_CANCEL:
//取消购买
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_FAILURE:
//购买失败
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_PAY_REPEAT:
//已购买过,无需购买,可直接使用
case MiErrorCode.MI_XIAOMI_GAMECENTER_ERROR_ACTION_EXECUTED:
//操作正在执行
//购买失败
开发方订单号
20~100字符以内,开发方生成,要求不能重复,可根据开发方规则自行生成。
productCode
规则要求:可由数字 0-9,字母 a-zA-Z 以及特殊字符”_”,”.”,”-”组成,
长度8~40位,同一款 游戏内 productCode要求唯一,区分字母大小写。建议使
用com.xiaomi.migc.xxx 的格式命名。调用时请不要弄混非消耗类商品和可
消耗类商品的productCode。
非消耗类商品,取值=1 可消耗类商品,取值&=1
3. 服务器接口
单机游戏如果需要,也可以提供接收订单支付结果通知的地址(可选)。
3.1订单支付结果通知接口
此接口由开发者负责开发并在游戏上线前提交给游戏平台进行配置。 在订单支付成功后,小米游戏平台服务器会将支付结果通知给开发者预先提供的服务器上。若开发者所提供的服务器地址不可用,在一定时间段内游戏平台服务器会按照周期进行轮询(前 10 次,每分钟通知 1 次;10次后每小时通知1次)。具体流程如下:
注:由于是异步通知模型,(3)和(4)不一定是按序号产生。因此(4)和(5)需要进行轮询处理或者使用接口进行支付结果查询。
3.2接口及参数说明:
接口地址:各开发者服务器的通知地址(提前申请,在游戏平台进行配置)
请求参数:
开发商订单ID
cpUserInfo
开发商透传信息
游戏平台订单ID
orderStatus
订单状态,TRADE_SUCCESS 代表成功
支付金额,单位为分,即0.01 米币。
productCode
productName
productCount
支付时间,格式 yyyy-MM-dd HH:mm:ss
orderConsumeType
订单类型:
10:普通订单
11:直充直消订单
partnerGiftConsume
使用游戏券金额 (如果订单使用游戏券则有,long型),如果有则参与签名
签名,签名方法见后面说明
返回参数说明:
状态码,200 成功
1506 cpOrderId 错误
1515 appId 错误
1516 uid 错误
1525 signature 错误
注意:对于同一个订单号的多次通知,开发商要自己保证只处理一次发货。
3.3接口格式说明:
请求方式:采用 HTTP GET 方式
输入参数: ?参数1=值1&参数2=值2&….&参数n=值n,如果遇到文本参数值,需要 根据情况对参数值做 UrlEncode。
返回参数:采用 json 格式,如:{“返回参数 1″:”返回值 1″,”返回参数 2″:”返回值 2″,….” 返回参数 n”:” 返回值 n”}
3.4签名方法说明:
3.4.1 生成带签名字符串
表中各参数按字母顺序排序(不包含 signature),如果第一个字母相同,按第二个 字母排序,依次类推。排序后拼接成 par1=val1&par2=val2&par3=val3 的格式,所生成 的字符串即为待签名的字符串。没有值的参数请不要参与签名。由于有些数据根据 HTTP 协议需求,需要进行 URLencoding,这样接收方才可以接收到正确的参数,但如果这个参数参 与签名,那么待签名字符串必须是字符串原值而非 URLencoding 的值。
3.4.2 签名算法
以 AppSecretKey 作为 key,使用 hmac-sha1 带密钥(secret)的哈希算法对代签字符串进行
签名计算。签名的结果由 16 进制表示。hmac-sha1 带密钥(secret)哈希算法的实现参考附录。
4.1APK打包及发布
需要注意,SDK 包是以 jar 包提供给开发者,此 jar 包本身已为混淆状态,您在混淆 自己游戏的 APK 包时,需要在 proguard.cfg 里加入,以避免二次混淆.
-keep public class com.xiaomi.gamecenter.sdk.ui.actlayout.ViewAliPayWeb$PayObject{*;} -keepclasseswithmembers class * {
public (...);
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
4.2服务器签名函数
Hmac-SHA1 算法 java 实现参考:
import javax.crypto.M
import javax.crypto.SecretK
import javax.crypto.spec.SecretKeyS
public class HmacSHA1Encryption {
private static final String MAC_NAME = "HmacSHA1" ;
private static final String ENCODING = "UTF-8";
* 使用 HMAC-SHA1 签名方法对对 encryptText 进行签名
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
public static String HmacSHA1Encrypt( String encryptText, String encryptKey ) throws Exception{
byte[] data = encryptKey.getBytes( ENCODING );
SecretKey secretKey = new SecretKeySpec( data, MAC_NAME );
Mac mac = Mac.getInstance ( MAC_NAME );
mac.init( secretKey );
byte[] text = encryptText.getBytes( ENCODING );
byte[] digest = mac.doFinal( text );
StringBuilder sBuilder = bytesToHexString ( digest );
return sBuilder.toString();
* 转换成Hex
* @param bytesArray
public static StringBuilder bytesToHexString( byte[] bytesArray ){
if ( bytesArray == null ){
StringBuilder sBuilder = new StringBuilder();
for ( byte b : bytesArray ){
String hv = String.format("%02x", b);
sBuilder.append( hv );
* 使用 HMAC-SHA1 签名方法对对 encryptText 进行签名
* @param encryptData 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
public static String HmacSHA1Encrypt( byte[] encryptData, String encryptKey ) throws Exception{
byte[] data = encryptKey.getBytes( ENCODING );
SecretKey secretKey = new SecretKeySpec( data, MAC_NAME );
Mac mac = Mac.getInstance ( MAC_NAME );
mac.init( secretKey );
byte[] digest = mac.doFinal( encryptData );
StringBuilder sBuilder = bytesToHexString ( digest );
return sBuilder.toString();
This entry was posted in

我要回帖

更多关于 qq群等级升级 的文章

 

随机推荐