时代首游手游SDK

文档变更记录

版本 修改内容
1.0.0 新建参考手册
2.0.0 改版UI增加手机绑定功能
2.1.0 添加支付宝快捷支付
3.0.0 改版UI
3.1.0 接口融合公共SDK接口,支持重新打包成其他平台SDK
3.1.1 更新用户校验相关字段的详细说明
3.1.2 合规化更新

文档内容

文档目的

1.提供给时代首游手游合作伙伴们规范接入文档。
2.指导公司内部游戏接入SDK

读者对象

时代首游手游合作伙伴技术部门android技术人员及管理人员。

接入流程

1.接入准备:新游接入前,请先向我方商务人员申请参数appid和appkey,并获取sdk资源包。
2.技术接入:由贵方技术人员进行技术对接。
注:目前sdk只支持android端接入。

增加权限声明

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 对外部存储设备的写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 对外部文件的写入和删除权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

注意:权限声明应在application标签外

增加Activity、Service、Receiver声明

	<activity
			android:name="com.zqgame.sdk.LoginDialogDefault"
			android:theme="@style/login_dialog"
			android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize"
			android:windowSoftInputMode="adjustUnspecified|stateHidden" >
	</activity>
	<!-- 注意:如果你的系统版本高于13,请添加 screenSize 在 LoginAnimation configChanges中-->
	<activity
			android:name="com.zqgame.sdk.LoginAnimation"
			android:configChanges="orientation|keyboard|keyboardHidden" >
	</activity> 
	<activity
			android:name="com.zqgame.sdk.PayActivity"
			android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize"
			android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
			android:windowSoftInputMode="adjustUnspecified|stateHidden" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.WebViewActivity"
			android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize"
			android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
			android:windowSoftInputMode="adjustUnspecified|stateHidden" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.GameCenterActivity"
			android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize"
			android:windowSoftInputMode="adjustUnspecified|stateHidden" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.OnlineServiceActivity"
			android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize"
			android:windowSoftInputMode="adjustUnspecified|stateHidden" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.PersonalActivity"
			android:launchMode="singleTask" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.BindPhoneActivity"
			android:launchMode="singleTask" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.BindEmailActivity"
			android:launchMode="singleTask" >
	</activity>
	<activity
			android:name="com.zqgame.sdk.ModifyPwdActivity"
			android:launchMode="singleTask" >
	</activity>       

	<activity
			android:name="com.zqgame.sdk.PaySelectActivity"
			android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" >
	</activity>
	<!-- 支付宝 -->
	<activity
			android:name="com.alipay.sdk.app.H5PayActivity"
			android:configChanges="orientation|keyboardHidden|navigation"
			android:exported="false"
			android:screenOrientation="behind" >
	</activity>
	<activity
			android:name="com.alipay.sdk.auth.AuthActivity"
			android:configChanges="orientation|keyboardHidden|navigation"
			android:exported="false"
			android:screenOrientation="behind" >
	</activity>

注意:声明应在application标签内

引用lib工程

a.将zip包中的ZQGameSDK_lib引入到eclipse工程
具体方法:File->import->General->Existing Projects into Workspace

b.游戏工程中选择依赖ZQGameSDK_lib工程
具体方法:游戏项目project 的properties-->android里library 点击Add

如果不使用Android Lib工程,可以将ZQGameSDK_lib里libs下的jar包及res下的资源拷贝过去)
c代码混淆,不要混淆jar包中的类

拷贝配置文件

将zip包中的assets里的文件拷贝到游戏Android工程的assets目录下。

注意:无需做任何更改,直接拷贝就行

代码

请确定在游戏的主Activity中调用初始化接口ZQGame.initSdk

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		appId = “xxx”;
		appKey = “xxxx”;
		ZQGame.initSdk(this, appId, appKey, 2, this);
	}

请求参数列表

参数名 描述 类型 参数说明 是否为空
context 上下文对象 Contexte 上下文对象 否
appid 游戏id int 游戏方的id 否
appkey 游戏秘钥 String 加密秘钥 否
screen 屏幕设置 int 0 自动 1 竖屏 2 横屏 否
listener 回调接口 ZQGameSdkListener 初始化回调 否

initFinish初始化完成回调接口返回参数列表

参数名 描述 类型 参数说明
code 返回结果 int ZQGame.SUCCESS 成功 ZQGame.FAILED失败 ZQGame.CANCEL 取消 ZQGame.UNKNOWN 未知

代码

在游戏各个Activity(除闪屏Activity外)生命周期中调用SDK生命周期接口

public void onStop() {
	    super.onStop();
	     ZQGame.onStop(this);
	}
	public void onDestroy() {
	    super.onDestroy();
	    ZQGame.onDestroy(this);
	}
	public void onResume() {
	    super.onResume();
	    ZQGame.onResume(this);
	}
	public void onPause() {
	    super.onPause();
	    ZQGame.onPause(this);
	}
	public void onRestart() {
	    super.onRestart();
	    ZQGame.onRestart(this);
	}
	protected void onNewIntent(Intent intent) {
	    super.onNewIntent(intent);
	    ZQGame.onNewIntent(this,intent);
	}
	protected void onActivityResult(int requestCode, int resultCode,
	    Intent data) {
	    super.onActivityResult(requestCode, resultCode, data);
	    ZQGame.onActivityResult(this,requestCode,resultCode, data);
	}

代码

在游戏各个Activity(除闪屏Activity外)生命周期中调用SDK生命周期接口

ZQGame.login(this, this);

请求参数列表

参数名 描述 类型 参数说明 是否为空 实例
context 上下文对象 Contexte 上下文对象 否
listener 回调接口 ZQGameSdkListener 登录回调 否 实现loginFinish()方法

返回 参数列表与LoginData

参数名 描述 类型 参数说明 是否为空
code 登陆结果 int ZQGame.SUCCESS 成功 ZQGame.FAILED失败 ZQGame.CANCEL 取消 ZQGame.UNKNOWN 未知 否
ld 登陆返回信息实体 LoginData 见LoginData说明 否

LoginData说明

获取函数 描述 类型 参数说明 是否为空
ld.getUserId() 获取uid String 服务器二次验证需要用到此参数。 用户名或密码, 主要包含字母、下划线、@、数字, 可能为空。
创建游戏角色以服务器二次验证端返回user_id为准
否
ld.getSessionI 获取session String 服务器二次验证需要用到此参数 否
d()
ld.getExtData() 获取额外参数 String 服务器二次验证需要用到此参数 否

当同一账号在,不同设备登陆时, 当前账号将被强制登出。Cp方应该在onSessionInvalid回调接口中实现游戏的注销,返回到游戏初始登陆界面。

代码

@Override
	public void onSessionInvalid(int code, LoginData ld) {
		Log.d(TAG, "登陆失效");
		if( code == ZQGame.SUCCESS) {
			//注销游戏逻辑
		}
		
	}

游戏在创建角色之后,需要调用ZQGame.createRole接口提交角色的一些基本信息。

代码

playerData.setServerNo("1");
_playerData.setServerName("测试一服");
_playerData.setRoleId("123");
_playerData.setRoleName("黑暗森林");
_playerData.setPartyName("利剑联盟");
_playerData.setLevel("12");
ZQGame.createRole(this, _playerData); 

参数说明

参数名 描述 类型 参数说明 是否为空 实例
Context 上下文对象 Contexte 上下文对象 否
_playerData 玩家信息 PlayerData 玩家信息实体类,数据尽量传真实数据,无则传默认值 否
setServerNo 游戏区服ID String 默认值为1, 必须是数字 否 “1”
setServerName 游戏区服名称 String 游戏区服名称,没有则传空值”” 否 “测试一服”
setRoleName 角色名称 String 角色名 否 “黑暗森林”
setRoleId 角色ID String 角色ID,必须是数字, 没有可传“1” 否 “1”
setPartyName 工会联盟名称 String 工会联盟名称,没有可传”” 否 “利剑联盟”
setLevel 玩家等级 String 玩家等级,必须是数值类型,没有传“1” 否 “1”

游戏在创建角色之后,需要调用ZQGame.enterGame(this, _playerData);接口提交角色的一些基本信息。

代码

ZQGame.enterGame(this, _playerData); 

参数说明

与创建角色接口一致。

游戏在创建角色之后,需要调用ZQGame.enterGame(this, _playerData);接口提交角色的一些基本信息。

代码

ZQGame.userUpLevel(this, _playerData);

参数说明

与创建角色接口一致。

代码

_payData.setAmount(100);
			_payData.setGameMoneyAmount(10);
			_payData.setGameMoneyName("钻石");
			_payData.setProductId("1");
			_payData.setGameOrderId("20150923165500233300");
			_payData.setProductName("6元礼包");
			_payData.setUserBalance("0");
			_payData.setUserId(uid);
			_payData.setVipLevel("0");
			_payData.setPtOrderId("20150923165500233300");
			ZQGame.pay(this, _payData, this);

请求参数说明

参数名 描述 类型 参数说明 是否为空 实例
Context 上下文对象 Contexte 上下文对象 否
listener 回调接口 ZQGameSdkListener 充值回调 否 实现payFinish()方法
setAmount 充值金额 int 订单金额, 单位为分 否 100
setGameMoneyAmount 充值游戏币数量 int 充值游戏币数量 否 10
setGameOrderId 游戏订单号 String 游戏订单号,CP方订单号 否 “20150923165500233300”
setProductId 产品id String 游戏支付项产品id, 没有则传设置支付项次序1,2,3,4,5,6… 否 “1”
setProductName 产品名称 String 产品名称 否 “6元礼包”
setUserBalance 玩家游戏币余额 String 玩家游戏币余额,数字类型,没有则传”0” 否 “0”
setUserId 用户ID String 用户ID, 以服务器端二次校验回传为准 否
setVipLevel 玩家VIP等级 String 玩家VIP等级,没有填”0” 否 “0”
setPtOrderId 平台订单号 String 我方服务器端回传订单号,没有则可以传空”” 否
setNoticeUrl 我方平台回调地址 String 服务器端回传,没有则可以传空”” 否
setCreateTime 订单时间戳 long 服务器回传 否

回调接口payFinish返回参数

参数名 描述 类型 参数说明 是否为空 实例
code 充值流程走完 int ZQGame.SUCCESS 成功 ZQGame.FAILED失败 ZQGame.CANCEL 取消 ZQGame.UNKNOWN 未知 否

代码

ZQGame.showToolBar(this);

接口说明

此接口,需要游戏方用于调出游戏浮标。 登陆成功后将会默认调出

代码

ZQGame.closeToolBar(this);

接口说明

此接口,需要游戏方用于关闭游戏浮标。

代码

ZQGame.logout(this,this);

接口说明

此接口,用于游戏切换、注销账号。 参数为 Context和ZQGameSdkListener. 需要实现回调方法 logoutFinish(int code), ZQGame.SUCCESS 成功 ZQGame.FAILED失败 ZQGame.CANCEL 取消 ZQGame.UNKNOWN 未知

代码

ZQGame.exitGame(this, this);

接口说明

此接口,需要游戏方,退出游戏的时候调用此接口. 需要实现exitGame(int code)回调。

实名认证

用户在使用SDK提供的登录能力时,SDK如检测到用户未进行实名认证,会弹窗提示用户进行实名认证并中断登录流程。

时长防沉迷

SDK根据《国家新闻出版署关于进一步管理切实防止未成年人沉迷网络游戏通知》,需要游戏实现以下限制:

第一条:所有网络游戏企业仅可在周五、周六、周日和法定节假日每日20时至21时向未成年人提供1小时网络游戏服务,其他时间均不得以任何形式向未成年人提供网络游戏服务。

第二条:所有网络游戏用户必须使用真实有效身份信息进行游戏账号注册并登录网络游戏,网络游戏企业不得以任何形式(含游客体验模式)向未实名注册和登录的用户提供游戏服务

未成年人支付限制

使用SDK支付能力的游戏,未成年支付限制由SDK统一处理,游戏方不需要额外开发。如果用户达到了防沉迷充值限制,在进行游戏充值时,会弹窗提示用户无法充值,游戏开发者也会收到支付失败的回调。

消费限制:
游戏内未满8周岁的用户,不提供游戏付费服务;8周岁以上未满16周岁的用户,单次充值金额不得超过50元人民币,每月充值金额累计不得超过200元人民币;16周岁以上未满18周岁的用户,单次充值金额不得超过100元人民币,每月充值金额累计不得超过400元人民币。

登陆验证(必接)

测试接口:http://sdk.zqbconnect.com/(app_id)/sdk/login_request

请求方法:GET

参数:(app_id,app_key接入时向我方申请)

参数名 描述 类型 参数说明 是否为空 实例
user_id 用户ID或账号 string 客户端返回的userId 否
session 客户端SDK返回的session或者token string 渠道返回session,用以验证玩家登陆 否
ext 扩展字段 String 将客户端SDK返回的扩展内容传入 否
sign 签名 String 所传字段的MD5值,详情参考签名章节 否 “”

返回结果:json

参数名 描述 类型 参数说明 是否为空 实例
status 验证结果 int 200验证成功,其他验证失败 否
data 验证成功后返回的数据 json 返回登入数据 否

Data字段:

参数名 描述 类型 参数说明 是否为空 实例
user_id 用户ID或账号 string 平台用户唯一凭证。 游戏创建用户以这个为准 否
session 客户端SDK返回的session或者token string session,用以验证玩家登陆 否
ext 扩展字段 String 扩展内容回传 否

5.2创建支付订单(必接)

测试接口:http://sdk.zqbconnect.com/(app_id)/sdk/create_order
请求方法:GET
参数:(app_id,app_key接入时向我方申请)

参数名 描述 类型 参数说明 是否为空 实例
gameorder 游戏内部订单号 string 最长60个字符 否
roleid 角色ID int 支付玩家的ID 否
rolename 角色昵称 string 玩家在游戏内的昵称 否
serverid 区服ID int 玩家所属区服ID 否
amount 支付金额 int 订单支付金额(单位:分) 否
goodsid 商品ID int 当前购买商品的ID 否
goodsname 商品名称 string 当前购买的商品名称 否
goodsdesc 商品描述 string 当前购买的商品描述 否
createtime 订单创建时间 int 下单的时间戳 否
ext 扩展字段 string 客户端SDK传的扩展内容 否
sign 签名 string 所传内容的md5值,参考签名章节 否

返回结果:json

参数名 描述 类型 参数说明 是否为空 实例
status 验证结果 int 200验证成功,其他验证失败 否
data 验证成功后返回的数据 json 返回登入数据 否

Data字段:

参数名 描述 类型 参数说明 是否为空 实例
gameorder 游戏订单号 string 游戏订单号 否
platorder 渠道订单号 string 可能为空,部分渠道有该字段内容
roleid 角色ID int 支付玩家的ID 否
rolename 角色昵称 String 玩家在游戏内的昵称 否
serverid 区服ID int 玩家所属区服ID 否
amount 支付金额 int 订单支付金额(单位:分) 否
goodsid 商品ID int 当前购买商品的ID 否
goodsname 商品名称 string 当前购买的商品名称 否
goodsdesc 商品描述 string 当前购买的商品描述 否
createtime 订单创建时间 int 下单的时间戳 否
notify_url 回调地址 string 我方回调地址 否
status 创建结果 int 1创建订单成功,其余失败 否
ext 扩展字段 string 客户端SDK传的扩展内容 否

支付回调(必接)

接口:游戏方提供
请求方法:GET
参数:

参数名 描述 类型 参数说明 是否为空 实例
orderid 我方订单 string 最长60个字符 否
gameorder 游戏订单 string 否
roleid 角色ID int 否
serverid 角色区服ID int 否
amount 充值金额 int 单位分 否
sign 签名 string 所有字段拼接而成的字符串md5值 否

返回:游戏方接收到回调后需返回SUCCESS

签名

将所有值按参数字母顺序排序拼接:(空值不参与签名,所有字符串需utf8编码)
如:user_id=’u1001x’, session=’dsfrgzfggjfgafdg’, ext=’6’, 拼接后的字符串:’6dsfrgzfggjfgafdgu1001x’ 最后接上我方app_key,计算MD5值 sign=MD5(‘%s%s’%(‘6dsfrgzfggjfgafdgu1001x’,app_key))