文档目的
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))