1接入说明
1.1、文档面向对象:
接入厂商的产品,技术人员,平台技术人员。
1.2、注意事项:
● 接口参数大小写敏感。
● request和response的编码格式为UTF-8。
1.3、名词定义
名称 | 说明 |
---|---|
CP | 游戏合作商 |
APP | 接入平台的游戏 |
APP_ID | 接入时由平台分配的游戏ID。 |
APP_KEY | 接入时由当乐分配的游戏/应用密钥。 |
运营方 XX | 运营商口袋则一般命名为KD KD_ _sdkib |
1.4、版本更新说明
2018-07-18 v8.1:更新方式,替换jar包,替换assets下的文件
1、增加提交角色信息接口(详见demo):GameSDK.defaultSDK().submitRoleInfo(new RoleInfo("角色id", "角色名", "区服id", "区服名", 1, 1));
2、闪屏由SDK显示,接入时去掉闪屏,以免重复显示造成测试不通过
3、增加“android.permission.RECORD_AUDIO”权限检查,未配置的需要增加此权限,否则会导致初始化失败
4、支付参数去掉回调地址
2集成SDK
集成3733_SDK,配置清单文件AndroidMamifest.xml
2.1、步骤1,获取必要的参数
从平台处,获取以下参数,用于对接
参数 | 说明 |
---|---|
app_id | 游戏ID |
app_key | 游戏加密密钥 |
client_id | SDK ID 标识此次对接demo的sdk |
client_key | SDKkey 此次对接demo的渠道key |
2.2、步骤2,导入SDK
文档以Eclipse开发环境为例
方式一:
导入jar包:
右键项目工程,在弹出的菜单中最下面的Properties选项(或直接按Alt+Enter键),打开如图所示界面:
按照红圈依次选择Java Build Path------>Libraries--------->Add External JARs,在弹出的文件选择器中选择demo/libs目录下的所以jar文件,然后点击确定即可
方式二:
在文件管理器中打开demo/libs目录,选中所有jar包及armeabi文件夹,然后在工程目录的libs下粘贴即可导入jar包及so
导入so:
在文件管理器中打开demo/libs目录,选中所有armeabi文件夹,复制,然后在工程目录的libs下粘贴即可
导入assets文件:
在文件管理器中打开demo/assets目录,选中所有文件/文件夹,复制,然后在工程目录的assets下粘贴即可
2.3、步骤3,配置AndroidManifest.xml
注:若有误差,以Demo为准
配置权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="org.simalliance.openmobileapi.SMARTCARD" /> <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc.hce" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.webkit.permission.PLUGIN" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--targetSdkVersion>=30时必选,安卓11及以上获取系统应用信息需要此权限--> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
配置Activity:
<!--3733 SDK --> <activity android:name="com.c3733.sdk.SDKActivity" android:configChanges="screenSize|orientation|keyboard" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" > </activity> <!-- 现在支付 --> <activity android:name="com.ipaynow.plugin.activity.PayMethodActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="false" android:screenOrientation="behind" android:theme="@android:style/Theme.Dialog" > </activity> <activity android:name="com.ipaynow.plugin.inner_plugin.prepay_plugin.activity.PrePayActivity" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize" > </activity> <activity android:name="com.ipaynow.plugin.inner_plugin.prepay_plugin.activity.NotifyActivity" android:configChanges="orientation|screenSize" android:exported="false" android:screenOrientation="behind" > </activity> <activity android:name="com.ipaynow.plugin.inner_plugin.wechatwp.activity.WeChatNotifyActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:exported="false" android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" /> <activity android:name="com.ipaynow.plugin.presenter.PayMethodActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:exported="false" android:screenOrientation="behind" android:theme="@android:style/Theme.Dialog" > </activity> <!-- 微信插件版支付 --> <activity android:name="com.ipaynow.plugin.inner_plugin.wechatpg.activity.WXPayActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:launchMode="singleTop" android:screenOrientation="behind" android:theme="@android:style/Theme.Dialog" /> <!-- 支付宝 --> <activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity> <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:exported="false" android:screenOrientation="behind" > </activity> <!-- 微付通支付activity --> <activity android:name="com.switfpass.pay.activity.QQWapPayWebView" android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
配置参数:
参数也可使用代码配置,具体见Demo
<meta-data android:name="HS_APPID" android:value="1" /> <meta-data android:name="HS_CLIENTID" android:value="1" /> <meta-data android:name="HS_CLIENTKEY" android:value="36ba570b88802fd382d65c627e15f697" /> <meta-data android:name="HS_AGENT" android:value="default" />
2.4、步骤4,SDK业务接口
SDK接口均在UI线程中调用,具体参见Demo
2.4.1、初始化(必须接入)
GameSDK.defaultSDK().init(MainActivity.this, new OnInitListener() { @Override public void initSuccess() { // 初始化完成,可在此调用登录 } @Override public void initFailure(String msg) { // 初始化失败 Log.e("Demo", "初始化失败:" + msg); } });
2.4.2、登录(必须接入)
GameSDK.defaultSDK().login(MainActivity.this, new OnLoginListener() { @Override public void loginSuccess(LoginCallback callback) { String mem_id = callback.mem_id; String token = callback.user_token; // 登录成功 } @Override public void loginError(String msg) { // 登录失败 Log.e("Demo", "登录失败:" + msg); } @Override public void loginCancel() { // 取消登录,从登录界面返回 } });
2.4.3、退出登录监听
该接口为玩家从SDK内退出登录的通知事件
GameSDK.defaultSDK() .registerOnLogoutNotifyListener(new OnLogoutNotifyListener() { @Override public void onLogout() { // 用户在SDK内退出登录,此处游戏做退出登录相关操作 } });
2.4.4、支付(如开计费必须接入)
PayParams params = new PayParams("1", 0.01, "1", "商品名称-金币", 商品描述-10金币", "扩展参数"); GameSDK.defaultSDK().pay(this, params, new OnPaymentListener() { @Override public void paySuccess(PaymentInfo info) { // 支付成功 double amount = info.amount; String msg = info.msg; } @Override public void payError(String msg) { // 支付失败 Log.e("Demo", "支付失败:" + msg); } @Override public void payCancel() { // 取消支付 } });
2.4.5、退出登录
游戏切换账号时调用
GameSDK.defaultSDK().logout();
2.4.6、退出(必须接入)
在游戏界面按返回键时调用
@Override public void onBackPressed() { GameSDK.defaultSDK().exit(this, new OnExitListener() { @Override public void onExit() { //退出游戏,一些退出的相关操作可以放在这里执行 } @Override public void onBackGame() { //返回游戏 } }); }
2.4.7、提交角色信息(必须接入)
手动接入:
提交玩家在游戏内的角色信息,提交时机:在玩家创建角色或角色等级发生变化或更改角色名时调用
/* * 提交游戏角色信息,在创建角色和角色等级发生变化或更改角色名时调用 * * 参数说明:1:角色id,2:角色名,3:区服id,4:区服名,5:角色等级,6:角色创建时间,时间戳,单位秒,以服务端时间为准 */ GameSDK.defaultSDK().submitRoleInfo(new RoleInfo("角色id", "角色名", "区服id", "区服名", 1, 1));
注:从此版本开始,不再提供浮球相关接口,由SDK内部控制
对接QuickSDK按下图
3SDK功能
3.1、获取SDK实例
GameSDK实例可通过GameSDK.defaultSDK()获取,SDK的一些功能需要再等在初始化完成之后才能使用,初始化完成之后不可再次初始化。
3.2、初始化
接口定义:
public void init(Activity context, OnInitListener listener)
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
context | Activity | Activity对象,确保为游戏主Activity |
listener | OnInitListener | 初始化接口的回调 |
3.3、登录
接口定义:
public void login(Activity act, OnLoginListener listener)
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
act | Activity | Activity对象,确保为游戏主Activity |
listener | OnInitListener | 登录接口的回调 |
3.4、登录回调说明
loginSuccess()
回调参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
mem_id | string | 登录成功后,用户的mem_id(唯一) |
loginError()
参数名 | 类型 | 参数说明 |
---|---|---|
msg | string | 错误说明 |
3.5、支付
接口定义:
public void pay(Activity act, PayParams params, OnPaymentListener listener)
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
act | Activity | Activity对象,确保为游戏主Activity |
params | PayParams | 支付参数 |
listener | OnPaymentListener | 支付接口回调 |
支付参数:
参数名 | 类型 | 参数说明 |
---|---|---|
roleid | String | 角色id |
money | double | 金额,不低于0.01 |
serverid | String | 服务器id |
productname | String | 商品名称 |
productdesc | String | 商品描述 |
attach | String | 扩展参数 |
pay params | String | 额外的支付参数json字符串 |
3.6、支付回调
paySuccess()
回调参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
amount | double | 支付金额 |
msg | double | 支付描述 |
payError()
回调参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
msg | String | 支付失败说明 |
3.7、退出框
接口定义:
public void exit(Activity act, OnExitListener listener)
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
act | Activity | Activity对象,确保为游戏主Activity |
listener | OnExitListener | 退出框回调 |
回调说明:
onExit():玩家点击“确认退出”的回调,在这里根据需求做相关操作
onBackGame():玩家点击“返回游戏”的回调
3.8、提交角色信息
接口定义:
public void submitRoleInfo(RoleInfo params)
参数说明:
参数名 | 类型 | 参数说明 |
---|---|---|
params | RoleInfo | 角色信息 |
角色信息:
参数名 | 类型 | 参数说明 |
---|---|---|
roleId | String | 角色id |
roleName | String | 角色名 |
serverId | String | 区服id |
serverName | String | 区服名 |
roleLevel | long | 角色等级 |
createTime | long | 角色创建时间,以服务端时间为准 |
4温馨提示
1.由于 SDK 的同步系统暂时并不能绝对保证一个订单只同步一次(订单本身是唯一的),因此建议合作商在发放游戏虚拟货币的时候做一次订单的判断,避免同一订单多次发放。
2.总结运营阶段的经验,SDK 发现支付合作商有时候一个订单会同步两次状态, 第一次为失败,第二次成功(实际为成功)。因此建议合作商接收 SDK 同步的订单时处理一下此类情况,例如:系统考虑支持同一个订单,第一次同步失败状态,第二次同步成功状态,系统照常发放游戏币。
5运行环境
● 目前该 sdk 只支持 Android 2.2 或以上版本的手机系统
● 手机必须处于网络环境中,2.5G/3G/WIFI 等等
6混淆
3733_SDK 包是以 jar 包文件提供给用户的,其中 jar 包已经半混淆状态, 您在混淆自己 APK 包的时候请不要将 3733SDK 的 jar 包一起混淆,因为里面有自定义UI控件,若被混淆后会因为无法找到相关类而抛异常。您可以在用ant 构 建混淆包的 build.xml里面对应位置或者在 proguard.cfg里加入:-libraryjars libs/3733_sdk.jar 以避免3733SDK 的相关的 jar 包被混淆。