海外游戏对接文档--安卓
版本
当前版本 3.5.1 历史版本
SDK功能
- 登录,切换账号,绑定。
- 支付
- 广告
- 上报游戏角色信息,上报游戏事件
- google评论功能和firebase的推送
- NAVER游戏接口
- 数数科技上报接口
- adjust数据上报
- 客服功能
- Facebook分享功能
1.SDK接入前准备工作
1.1接入前准备工作:发行中间层提供参数说明(参数由发行层技术提供)
参数 | 类型 | 参数描述 |
---|---|---|
game_id | string | 发行中间层分配的游戏id, |
appKey | string | 发行中间层分配的游戏key |
appSecret | string | 发行中间层分配的游戏secret |
url | string | 发行中间层的服务端域名 |
2.SDK快速接入
2.1 开发环境
- com.android.tools.build:gradle 4.0.0 版或更高版本,build.gradle需要添加以下配置和依赖
//如下所示,对plugins声明区段进行Kotlin插件声明
plugins {
id 'com.android.application'
id 'kotlin-android'
}
repositories {
mavenCentral()
maven {url 'https://android-sdk.is.com/'}
maven {url 'https://artifact.bytedance.com/repository/pangle'}
}
//第三方SDK依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.facebook.android:facebook-login:12.2.0'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'com.google.firebase:firebase-messaging:23.2.1'
implementation 'com.google.firebase:firebase-analytics:21.3.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation "androidx.viewpager2:viewpager2:1.0.0"
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation "com.squareup.retrofit2:retrofit:2.6.4"
implementation "com.squareup.retrofit2:converter-gson:2.6.4"
implementation 'com.github.bumptech.glide:glide:3.7.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
//ironsource广告依赖
implementation 'com.ironsource.sdk:mediationsdk:7.9.0'
// Add AdMob and Ad Manager Network
implementation 'com.google.android.gms:play-services-ads:23.0.0'
implementation 'com.ironsource.adapters:admobadapter:4.3.43'
// Add Applovin Network
implementation 'com.ironsource.adapters:applovinadapter:4.3.41'
implementation 'com.applovin:applovin-sdk:12.1.0'
// Add Facebook Network
implementation 'com.ironsource.adapters:facebookadapter:4.3.45'
implementation 'com.facebook.android:audience-network-sdk:6.16.0'
// Add Pangle Network
implementation 'com.ironsource.adapters:pangleadapter:4.3.26'
implementation 'com.pangle.global:ads-sdk:5.8.0.8'
// Add UnityAds Network
implementation 'com.ironsource.adapters:unityadsadapter:4.3.35'
implementation 'com.unity3d.ads:unity-ads:4.9.3'
implementation 'com.google.android.gms:play-services-appset:16.0.0'
//appsflyer依赖
implementation 'com.appsflyer:af-android-sdk:6.5.4'
implementation 'com.appsflyer:oaid:6.2.4'
//数数SDK依赖
implementation 'cn.thinkingdata.android:ThinkingAnalyticsSDK:2.8.3.3'
//kotlin依赖
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.21"
//AIHelp 客服系统依赖
implementation 'net.aihelp:android-aihelp-aar:3.4.+'
//adjust依赖
implementation 'com.adjust.sdk:adjust-android:4.38.2'
implementation 'com.android.installreferrer:installreferrer:2.2'
implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
implementation 'cn.thinkingdata.android:TAThirdParty:1.2.0'
//下拉刷新控件
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
}
- SDK压缩包相关的文件
AndroidManifest.xml:AndroidManifest.xml里面的配置需要加到游戏里面,其中com.google.android.gms.ads.APPLICATION_ID需要换成自己游戏的参数,具体参数找运营要
res:res/values/vlues.xml中的几个字段需要添加到游戏相应的目录下面。
assets:assets目录下面的文件复制到游戏的assets里
DMM支付特殊处理
- SDK内含启动Activity,请勿将游戏端的 Activity设置为启动 Activity。启动Activity指的是在intent-filter中赋予了action : android.intent.action.MAIN和category : android.intent.category.LAUNCHER要素的Activity。对于想要在应用程序启动时调用的 Activity,需在sdk_configuration.xml的 mainActivity标签指定Activity类的完整类名。
- 需要将DMM GAMES Platform上使用的游戏信息定义为 Android 资源的xml文件,命名为"sdk_configuration.xml",放入到res/xml下面。XML文件示例如下所示。
<?xml version="1.0" encoding="utf-8"?>
<properties>
<gameName>熱戰少女</gameName>
<mainActivity>com.mk.MKdemo.DemoActivity</mainActivity>
<!--正式环境-->
<!-- <appId>Put Application ID here(when Production Build)</appId>-->
<!-- <consumerKey>Put Consumer Key here(when Production Build)</consumerKey>-->
<!-- <consumerSecret>Put Consumer Secret here(when Production Build)</consumerSecret>-->
<!--沙盒环境-->
<appIdSandbox>773665</appIdSandbox>
<consumerKeySandbox>yKMdlYxrj4QMn2HC</consumerKeySandbox>
<consumerSecretSandbox>ACqWUDt1e66=[hGzXfC#$3lcX7U-ZoAg</consumerSecretSandbox>
<!--环境模式-->
<!-- When Production Build, Remove below a line. -->
<developmentMode>sandbox</developmentMode>
<!-- 超时时间(毫秒 -->
<webViewTimeoutValue>90000</webViewTimeoutValue>
</properties>- XML内各项目相关说明如下所示。
标签名 说明 gameName 指定向用户显示的游戏名称。 mainActivity 指定本SDK初始化后调用的启动游戏所需 Activity 的完整类名。 appId 指定正式环境下的DMM GAMES Platform 的 应用程序ID。
※在沙盒环境下运行时无需定义。consumerKey 指定正式环境中的DMM GAMES Platform的consumerKey。
※在沙盒环境下运行时无需定义。consumerSecret 指定正式环境下的DMM GAMES Platform的consumerSecret。
※在沙盒环境下运行时无需定义。appIdSandbox 指定沙盒环境中的DMM GAMES Platform的应用程序ID。
※在正式环境下运行时无需定义。consumerKeySandbox 指定沙盒环境中的DMM GAMES Platform的consumerKey。
※在正式环境下运行时无需定义。consumerSecretSandbox 指定沙盒环境中的DMM GAMES Platform的consumerSecret。
※在正式环境下运行时无需定义。developmentMode 指定在正式环境或沙盒环境的其中一方下运行sandbox或release,不设置此标签时默认值release webViewTimeoutValue 将本SDK显示的WebView界面内的超时时间指定为毫秒。不设置此标签时默认值30000ms 自动依赖(推荐使用):
- build.gradle 文件中添加如下配置依赖:
repositories {
maven {url 'https://nexus.mjutech.com/repository/maven-releases/'}
//onestore支付需要
maven { url 'https://repo.onestore.co.kr/repository/onestore-sdk-public'}
//DMM支付需要
maven { url 'https://repos-app.games.dmm.com/'}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation 'com.mk.overseas.sdk:mksdk-libs:3.5.1'
implementation 'com.navercorp.nng.android.sdk:naver-libs:1.1.3.1'
implementation 'com.u8.sdk.oversea:u8sdk-libs:3.4.0'
implementation 'com.oaid.sdk:oaid_sdk:1.0.25'
}- 支付依赖(6选1,没有特殊要求的都选google支付)
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
//google 支付
implementation 'com.mk.overseas.sdk.pay.google:mkgooglepay:6.0.4'
implementation 'com.android.billingclient:billing:6.0.1'
//onestore支付
implementation 'com.mk.overseas.sdk.pay.onestore:mkonestorepay:7.0.2'
implementation "com.onestorecorp.sdk:sdk-iap:21.00.01"
implementation "com.onestorecorp.sdk:sdk-configuration-kr:1.0.0"
//xsolla支付
implementation 'com.mk.overseas.sdk.pay.xsolla:mkxsollapay:0.17.7'
implementation 'com.xsolla.android:payments:0.17.1'
implementation 'com.xsolla.android:store:2.5.2'
//QooApp支付
implementation 'com.qooapp.opensdk:qooapp-opensdk:2.0.8'
implementation 'com.mk.overseas.sdk.pay.qoo:mkqoopay:2.1.2'
//DMM支付
implementation 'com.mk.overseas.sdk.pay.dmm:mkdmmpay:1.2.3'
//SDK本体1
implementation "com.dmm.games.android:games-store-sdk:1.2.2"
implementation "com.dmm.games.android:billingclient:1.0.1"
// 在沙盒环境中运行时,必需定义以下2个库
implementation "com.dmm.games.android:auth-sandbox:1.2.2"
implementation "com.dmm.games.android:webview-cookie-sandbox:1.2.2"
// 在正式环境中运行时,必需定义以下2个库
implementation "com.dmm.games.android:auth-games-store:1.2.2"
implementation "com.dmm.games.android:webview-cookie-service:1.2.2"
//samsung支付,java版本要使用17,gradle使用的是8.7,gradle插件版是8.5.2
//classpath "com.android.tools.build:gradle:8.5.2"
//distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
//build.gradle里面需要添加namespace,添加位置自己百度
implementation 'com.samsung.android.sdk.iap.lib:samsung:6.2.0'
implementation 'com.mk.overseas.sdk.pay.samsung:mksamsungpay:6.2.1'
}手动依赖:
- 把压缩包libs下面的jar和aar包复制到游戏工程的libs下,并在build.gradle里面的dependencies添加引用
- 支付依赖(5选1,没有特殊要求的都选google支付)
repositories {
//onestore支付需要
maven { url 'https://repo.onestore.co.kr/repository/onestore-sdk-public'}
//DMM支付需要
maven { url 'https://repos-app.games.dmm.com/'}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
//google 支付
implementation 'com.android.billingclient:billing:6.0.1'
//onestore支付
implementation "com.onestorecorp.sdk:sdk-iap:21.00.01"
implementation "com.onestorecorp.sdk:sdk-configuration-kr:1.0.0"
//xsolla支付
implementation 'com.xsolla.android:payments:0.17.1'
implementation 'com.xsolla.android:store:2.5.2'
//QooApp支付无
//DMM支付
//SDK本体1
implementation "com.dmm.games.android:games-store-sdk:1.2.3"
implementation "com.dmm.games.android:billingclient:1.0.1"
// 在沙盒环境中运行时,必需定义以下2个库
implementation "com.dmm.games.android:auth-sandbox:1.2.2"
implementation "com.dmm.games.android:webview-cookie-sandbox:1.2.2"
implementation "com.squareup.okhttp3:okhttp:4.3.1"
// 在正式环境中运行时,必需定义以下2个库
implementation "com.dmm.games.android:auth-games-store:1.2.2"
implementation "com.dmm.games.android:webview-cookie-service:1.2.2"
//samsung支付无
//samsung支付,java版本要使用17,gradle使用的是8.7,gradle插件版是8.5.2
//classpath "com.android.tools.build:gradle:8.5.2"
//distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
//build.gradle里面需要添加namespace,添加位置自己百度
}
- 添加 Firebase 配置文件
- ①将 Firebase Android 配置文件添加到您的应用:
- 点击下载 google-services.json 以获取 Firebase Android 配置文件 (google-services.json(运营提供))。 将配置文件移动到应用的模块(应用级)目录中。
- 将 Google 服务插件和kotlin插件 添加到 Gradle 文件中。
- 在根级(项目级)Gradle 文件 (build.gradle) 中添加规则,以纳入 Google 服务 Gradle 插件和kotlin插件。此外,请确认您拥有 Google 的 Maven 代码库。
buildscript {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
dependencies {
// Add the following line:
classpath 'com.google.gms:google-services:4.3.0' // Google Services plugin
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"
}
}
allprojects {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
}
//在您的模块(应用级)Gradle 文件(通常是 app/build.gradle)中,应用 Google 服务 Gradle 插件:
apply plugin: 'com.android.application'
// Add the following line:
apply plugin: 'com.google.gms.google-services'
android {
}
打包的targetSdkVersion根据google要求设置,编译版本compileSdkVersion最好设置成33(最低要求31).
其它配置
- 工程的gradle.properties里面添加以下配置:(此配置是把项目中用到support转换成androidX)
android.useAndroidX=true
android.enableJetifier=true
2.2 Application 配置
方式一:如果游戏层没有自己的Application,那么游戏需要将AndroidManifest.xml中的application指定为 com.u8.sdk.U8Application。
<application
android:name="com.u8.sdk.U8Application"
··· >
···
</application>
方式二:如果游戏有自己的Application,则可以看我们的自定义Application
- 1.游戏中AndroidManifest.xml中,将application节点的android:name属性设置为 com.u8.sdk.U8Application
- 2.如果游戏有自己的Application需求,或者需要在Application的生命周期方法中,做一些操作。 那么可以实现IApplicationListener里面的接口。
- 3.上面定义了游戏的Application,紧接着,在AndroidManifest.xml中,将上面我们定义的GameProxyApplication,配置到meta-data中,android:name为U8_Game_Application。
示例,我们定义一个GameProxyApplication实现IApplicationListener接口:
<application
···
android:name="com.u8.sdk.U8Application" >
<meta-data android:name="U8_Game_Application" android:value="com.u8.sdk.test.GameProxyApplication" />
···
</application>
2.3 SDK初始化(必接)
所有接口调用,都通过com.u8.sdk.platform.U8Platform 单例类来调用 登录成功使用sdkUserID和游戏账号绑定
该方法必须在游戏启动Activity的onCreate方法中调用
U8Platform.getInstance().init(this, new U8InitListener() {
@Override
public void onSwitchAccount(UToken data) {
//游戏中通过SDK切换到新账号的回调,游戏收到该回调,需要引导用户重新登录,重新加载该新用户对应的角色数据
//登录成功
//进入游戏
//从UToken中获取用户信息
//渠道SDK登录并去u8server登录认证成功,会回调改方法。
//UToken中的参数如下:
//sdkUserID:渠道SDK平台用户唯一ID,游戏服务器需要将游戏账户ID和该sdkUserID进行绑定。
//userID:U8Server生成的唯一用户ID,
//isVistor:是否是游客账号,true 是;false 不是
//username:U8Server生成的用户名,
//sdkUserName:渠道SDK平台用户名,可能为空,部分渠道SDK没有返回用户名
//token:U8Server生成的会话ID,游戏服务器拿该字段去U8Server做二次登录验证
//extension:U8Server返回的扩展字段,部分渠道SDK需要,游戏中无需使用该字段的值
//timestamp:U8Server生成的时间戳,游戏服务器去U8Server做二次登录验证时,传给U8Server
String sdkUserID = data.getSdkUserID();
Boolean isvistor = data.getVistor();
}
@Override
public void onPayResult(int code, String msg) {
Log.d("U8SDK", "pay result. code:"+code+";msg:"+msg);
switch(code){
case U8Code.CODE_PAY_SUCCESS:
//支付成功
break;
case U8Code.CODE_PAY_FAIL:
//支付失败
break;
case U8Code.CODE_PAY_CANCEL:
//支付取消
break;
case U8Code.CODE_PAY_UNKNOWN:
//支付未知错误
break;
}
}
@Override
public void onLogout() {
//用户登出回调(需要收到该回调需要返回游戏登录界面,并调用login接口,打开SDK登录界面)
}
@Override
public void onLoginResult(int code, UToken data) {
switch(code){
case U8Code.CODE_LOGIN_SUCCESS:
//登录成功
//进入游戏
//从UToken中获取用户信息
//渠道SDK登录并去u8server登录认证成功,会回调改方法。
//UToken中的参数如下:
//sdkUserID:渠道SDK平台用户唯一ID,游戏服务器需要将游戏账户ID和该sdkUserID进行绑定。
//userID:U8Server生成的唯一用户ID,
//isVistor:是否是游客账号,true 是;false 不是
//username:U8Server生成的用户名,
//sdkUserName:渠道SDK平台用户名,可能为空,部分渠道SDK没有返回用户名
//token:U8Server生成的会话ID,游戏服务器拿该字段去U8Server做二次登录验证
//extension:U8Server返回的扩展字段,部分渠道SDK需要,游戏中无需使用该字段的值
//timestamp:U8Server生成的时间戳,游戏服务器去U8Server做二次登录验证时,传给U8Server
String sdkUserID = data.getSdkUserID();
Boolean isvistor = data.getVistor();
break;
case U8Code.CODE_LOGIN_FAIL:
//登录失败
break;
}
}
@Override
public void onInitResult(int code, String msg) {
Log.d("U8SDK", "init result.code:"+code+";msg:"+msg);
switch(code){
case U8Code.CODE_INIT_SUCCESS:
//初始化成功
break;
case U8Code.CODE_INIT_FAIL:
//初始化失败
break;
}
}
@Override
public void onShareResult(int code, String msg) {
Log.d("U8SDK", "share result.code:"+code+";msg:"+msg);
switch(code){
case U8Code.CODE_SHARE_SUCCESS:
//分享成功
break;
case U8Code.CODE_SHARE_FAILED:
//分享失败
break;
}
}
@Override
public void onBindAccountResult(int code, String msg) {
switch(code){
case U8Code.CODE_BIND_SUCCESS:
//绑定成功,sdk内部绑定成功会在这个回调里面收到通知
break;
}
}
@Override
public void onProductQueryResult(List<ProductQueryResult> result) {
}
});
//firebase初始化
U8Platform.getInstance().getFirebasePushData(new OnFirebasePushListener() {
@Override
public void firebaseToken(String token) {
//获取firebase的token
}
@Override
public void firebasePushMsg(String msg) {
//app处于前台时候,收到消息通知的信息
}
});
2.4 生命周期函数(必接)
在游戏启动Activity的如下生命周期函数中,调用对应的方法。
public void onActivityResult(int requestCode, int resultCode, Intent data){
U8SDK.getInstance().onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
public void onStart(){
U8SDK.getInstance().onStart();
super.onStart();
}
public void onPause(){
U8SDK.getInstance().onPause();
super.onPause();
}
public void onResume(){
U8SDK.getInstance().onResume();
super.onResume();
}
public void onNewIntent(Intent newIntent){
U8SDK.getInstance().onNewIntent(newIntent);
super.onNewIntent(newIntent);
}
public void onStop(){
U8SDK.getInstance().onStop();
super.onStop();
}
public void onDestroy(){
U8SDK.getInstance().onDestroy();
super.onDestroy();
}
public void onRestart(){
U8SDK.getInstance().onRestart();
super.onRestart();
}
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
U8SDK.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults);
}
2.5 登录接口(必接)
login(Activity context)
接口说明:
- 登录接口,初始化成功之后调用,打开SDK登录界面,登录成功或者失败,会触发上面初始化监听器中的onLoginResult回调函数
参数说明:
- context:android 的上下文
调用示例:
U8Platform.getInstance().login(context);
2.6 登录接口(正常接2.5,特殊的游戏调用这个)
accountLogin(String account)
接口说明:
- 登录接口,初始化成功之后调用,针对于有生成唯一标识且使用这个标识作为SDK账号的游戏调用此接口,登录成功或者会触发初始化监听器中的onLoginResult回调函数
参数说明:
- account:设备号或者账号标识,游戏里生成的唯一标识
调用示例:
U8Platform.getInstance().accountLogin(account);
2.7 上报游戏角色信息(必接)
备注:登录成功之后调用;调用的时候,暂时没有数据的参数值需要传默认值(自己定),不可传空。
submitExtraData(UserExtraData extraData)
接口说明:
- 要求在 选择服务器,创建角色,登录游戏,角色升级等时刻,要上报游戏中玩家数据,以便后台统计用户数据。所以,游戏层需要在特定的地方多次调用该方法。
参数说明:
- extraData:角色信息传递参数的对象
关于UserExtraData对象:
参数名称 | 参数类型 | 是否必传 |
---|---|---|
dataType | int | 是 |
serverID | String | 是(没有的传默认值"1") |
serverName | String | 是(没有的传默认值"1") |
roleID | String | 是(没有的传默认值"1") |
roleName | String | 是(没有的传默认值"1") |
roleLevel | String | 是(没有的传默认值"1") |
moneyNum | String | 是(没有的传默认值"1") |
roleCreateTime | long | 是 |
roleLevelUpTime | long | 是 |
vip | String | 是(没有vip系统的传默认值"1") |
userTags | String | 否 |
customData | JSONObject | 否 |
eventID | String | 否 |
eventData | String | 否 |
UserExtraData中的dataType类型如下:
- public static final int TYPE_SELECT_SERVER = 1; //选择服务器
- public static final int TYPE_CREATE_ROLE = 2; //创建角色
- public static final int TYPE_ENTER_GAME = 3; //进入游戏
- public static final int TYPE_LEVEL_UP = 4; //等级提升
- public static final int TYPE_EXIT_GAME = 5; //退出游戏
- public static final int TYPE_AD_EVENT = 6; //广告播放成功
- public static final int TYPE_DEVICE_ACTIVE = 7; //设备启动
- public static final int TYPE_PID_EVENT = 8; //渠道登录成功
- public static final int TYPE_BIND_THIRED = 9; //绑定第三方
- public static final int TYPE_DEVICE_ENTER_GAME =10; //设备进入游戏
- public static final int TYPE_DEVICE_ENTER_SERVICE =11; //设备开始进服
- public static final int TYPE_OTHER_EVENT =12; //其他事件
- public static final int TYPE_CHANGE_ROLE_NAME =13; //修改角色昵称
游戏必须要调用的类型如下(括号里面是上传事件用到的eventID):
1:选择服务器; 2:创建角色(af_complete_registration); 3:进入游戏(af_login); 4:等级提升(af_level_achieved);10:设备进入游戏(loading_success); 11:设备开始进服(loading_start); 12:其他事件(设备加载过程(loading_xx),角色完成引导(af_tutorial_completion)等);13:修改角色昵称(af_change_role_name)
调用示例:
UserExtraData data = new UserExtraData();
data.setDataType(UserExtraData.TYPE_CREATE_ROLE);
data.setMoneyNum(100);
data.setRoleCreateTime(System.currentTimeMillis()/1000);
data.setRoleID("1");
data.setRoleName("1");
data.setRoleLevel("1");
data.setRoleLevelUpTime(System.currentTimeMillis()/1000);
data.setServerID(10);
data.setServerName("server_10");
data.setVip("1");
data.setEventId("af_complete_registration");
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("ceshi","ceshi");
} catch (JSONException e) {
e.printStackTrace();
}
data.setCustomData(jsonObject);
data.setUserTags("ceshi");
Map<String, Object> eventData = new HashMap<String, Object>();
eventData.put("af_test_value","af_test_value");
data.setEventData(eventData);
U8Platform.getInstance().submitExtraData(data);
2.8 用户中心(选接)
showAccountCenter(int isEnterGame)
接口说明:
- 部分渠道会提供用户中心界面显示用户信息,调用此接口可以拉起渠道的用户中心界面,在用户中心界面会有相应的绑定和切换操作。
参数说明:
- isEnterGame 是否游戏内展示入口 0,是;1,否 //描述:如果游戏可以在选服阶段(1)和游戏内界面(0)展示用户中心入口
调用示例:
U8Platform.getInstance().showAccountCenter(isEnterGame);
2.9 支付充值(必接)
pay(Activity context, PayParams payParams)
接口说明:
- 充值接口,打开SDK充值界面。 充值成功或者失败,会触发初始化监听器中的onPayResult接口
参数说明:
- context:android 的上下文
- payParams:支付参数的传递对象
关于PayParams对象:
参数名称 | 参数类型 | 参数说明 |
---|---|---|
productId | String | 充值商品ID,游戏内的商品ID |
productName | String | 商品名称,比如100元宝,500钻石... |
productDesc | String | 商品描述,比如 充值100元宝,赠送20元宝 |
price | double | 充值金额{单位:美元} |
buyNum | int | 购买数量,一般都是1 |
coinNum | int | 玩家当前身上剩余的游戏币 |
serverId | String | 玩家所在服务器的ID |
serverName | String | 玩家所在服务器的名称 |
roleID | String | 玩家角色ID |
roleName | String | 玩家角色名称 |
roleLevel | String | 玩家角色等级 |
vip | String | 玩家vip等级 |
payNotifyUrl | String | 游戏服务器支付回调地址,渠道SDK支付成功,异步通知U8Server,U8Server根据该地址,通知游戏服务器发货 |
paySubNotifyUrl | String | 游戏服务器订阅支付回调地址,渠道SDK支付成功,异步通知U8Server,U8Server根据该地址,通知游戏服务器发货 |
extension | String | 支付成功之后,U8Server通知游戏服务器时,原样返回给游戏服务器。不要传null和"";长度不超过255 |
skuType | String | 商品类型,订阅商品"subs";普通商品"inapp",google支付用到,其余支付不会用到 |
product_detail | String | 商品的道具列表,道具信息请按照上面示例传参(非必传) |
调用示例:
PayParams params = new PayParams();
params.setBuyNum(1); //购买数量,固定1
params.setCoinNum(100); //当前玩家身上拥有的游戏币数量
params.setExtension(System.currentTimeMillis()+""); //游戏自定义数据,充值成功,回调游戏服的时候,会原封不动返回。备注:不要传null和"";长度不超过255
params.setPrice(1); //单位:美元
params.setProductId("1"); //产品ID
params.setProductName("元宝"); //产品名称
params.setProductDesc("购买100元宝"); //产品描述
params.setRoleId("1"); //角色ID
params.setRoleLevel(1); //角色等级
params.setRoleName("测试角色名"); //角色名称
params.setServerId("10"); //服务器ID
params.setServerName("测试"); //服务器名称
params.setVip("vip1"); //角色VIP等级
params.setPayNotifyUrl("http://www.game.com/pay/callback"); //支付成功,U8Server异步通知该地址,告诉游戏服务器发货
params.setPaySubNotifyUrl("http://andtest-api.m-co.cn/subtest.php"); //支付成功,U8Server异步通知该地址,告诉游戏服务器订阅成功
params.setSkuType("inapp");//商品类型,订阅商品"subs";普通商品"inapp",google支付用到,其余支付不会用到
List<String> product_details = new ArrayList<>();
JSONObject product_detail_1 = new JSONObject();
product_detail_1.put("mj_daoju_id","ceshi_1");//道具id,游戏自己定义
product_detail_1.put("mj_daoju_name","daoju_1");//道具名称,游戏自己定义
product_detail_1.put("mj_daoju_type","daoju_type_1");//道具类型,游戏自己定义
product_detail_1.put("mj_daoju_value",0.01);//道具价值,游戏自己定义
product_details.add(product_detail_1.toString());
JSONObject product_detail_2 = new JSONObject();
product_detail_2.put("mj_daoju_id","ceshi_2");
product_detail_2.put("mj_daoju_name","daoju_2");
product_detail_2.put("mj_daoju_type","daoju_type_2");
product_detail_2.put("mj_daoju_value",0.01);
product_details.add(product_detail_2.toString());
params.setProduct_detail(product_details.toString());//商品的道具列表
U8Platform.getInstance().pay(this, params);
2.10 获取商品信息列表接口(必接)
备注:这个接口会有预注册奖励发放和补单逻辑处理,因此此接口需要在创角完成之后调用
getGoogleProductList(String server_id,GoogleProductListListener googleProductListListener)
接口说明:
- 商品信息列表接口,获取google商品列表价格等信息,需要使用
参数说明:
- server_id:玩家所在服务器的ID
- googleProductListListener:回调接口
调用示例:
U8Platform.getInstance().getGoogleProductList(server_id,new GoogleProductListListener {
/**
* 获取google商品列表
*/
public void onGoogleProductList(String productList);
});
回调说明:
- productList 商品列表,类型:json格式的数组
参数名称 | 参数类型 | 参数说明 |
---|---|---|
symbol | String | 国际标准代号 |
price | String | 后台商品价格,带货币符号 |
product_id | String | 商品id和google后台配置一致 |
title | String | 商品描述 |
priceAmountMicros | long | google后台商品价格X1000000 |
priceCurrencyCode | String | 国际标准代号 |
回调数据示例:
[{symbol=KRW, priceAmountMicros=8500000000, price=₩8,500, product_id=com.mujoysg.demo.month, title=月卡 (Mujoysg-Demo), priceCurrencyCode=KRW}, {symbol=KRW, priceAmountMicros=16000000000, price=₩16,000, product_id=com.mujoysg.demo.month1, title=无敌 (Mujoysg-Demo), priceCurrencyCode=KRW}]
2.11 恢复订阅商品接口(google渠道用到,选接)
recoverySub(String server_id,String extra, RecoverySubListener recoverySubListener)
接口说明:
- 恢复订阅商品接口,google渠道用到。
参数说明:
- server_id:玩家所在服务器的ID
- extra:玩家所在服务器的ID
- recoverySubListener:回调接口
调用示例:
U8Platform.getInstance().recoverySub(server_id, extra, new RecoverySubListener {
/**
* 恢复订阅成功
*/
public void onRecoverySubSuccess();
/**
* 恢复订阅失败
*/
public void onRecoverySubFail();
});
2.12 拉起激励视频广告接口(选接)
gameRewardVideoAd(Activity context, RewardVideoAdInfo rewardVideoAdInfo,RewardVideoAdListener rewardVideoAdListener)
接口说明:
- 激励视频广告接口,拉起渠道的激励视频广告,广告播放完成触发接口携带的回调监听器中的回调函数,里面有广告相关回调信息
参数说明:
- context:android的上下文
- rewardVideoAdInfo:需要传递的参数对象
- rewardVideoAdListener:回调接口
关于RewardVideoAdInfo对象:
参数名称 | 参数类型 | 参数说明 |
---|---|---|
rewardVideoName | String | 广告类型名称 |
callbackUrl | String | 用户激励视频回调地址 |
rewardVideoAccount | String | 奖励数量 |
mediaExtra | String | 用户激励视频透传参数 |
Extra | String | 用户其它透传参数 |
Orientation | int | 期望视频播放的方向1:竖屏,2:横屏 |
eventID | String | appsflyer定义的事件appflyers_event(af定义的) |
eventData | String | appsflyer定义的事件描述appflyers_value(af定义的) |
调用示例:
RewardVideoAdInfo info = new RewardVideoAdInfo();
info.setRewardVideoAdID("111111");//广告id
info.setRewardVideoName("激励视频奖励的名称");//奖励的名称
info.setRewardVideoAccount(1); //奖励的数量
info.setOrientation(1);//1:竖屏,2:横屏
info.setUserId("111111111111");//用户id
info.setMediaExtra("视频额外参数");//视频透传参数
info.setExtra("额外参数");//透传参数
Map<String, Object> eventData = new HashMap<String, Object>();
eventData.put("ads_type","zhuanpan");
info.setEventId("af_showads");
info.setEventData(eventData);
U8Platform.getInstance().gameRewardVideoAd(MainActivity.this, info, new RewardVideoAdListener(){
@Override
public void onRequestADFail(int errorCode){
//请求失败,errorCode错误码
}
@Override
public void onRewardVideoAdComplete() {
//视频播放完成
}
@Override
public void onRewardVideoAdCancel() {
//视频播放过程中取消回调
}
@Override
public void onRewardVideoAdClose(Boolean isNeedServerNotice) {
//视频播放完成,关闭视频界面回到游戏界面
//isNeedServerNotice 是否需要服务通知发放奖励,true 是有服务端通知,false是没有服务端通知
}
@Override
public void onRequestADSuccess() {
//请求视频广告成功
}
@Override
public void onRewardVideoAdSkipped() {
//视频跳过
}
});
2.13 google评论(功能不稳定,弃用)
openGoogleComment(String comment_reason,OnGoogleCommentListener commentListener)
接口说明:
- google评论接口,拉起google评论界面
参数说明:
- comment_reason:游戏里面的触发条件
- commentListener:回调接口
调用示例:
U8Platform.getInstance().openGoogleComment(comment_reason, new OnGoogleCommentListener() {
@Override
public void googleCommentSuceess() {
//评论成功
}
@Override
public void googleCommentFail() {
//评论失败
}
});
2.14 打开NAVER游戏—主页横幅接口(选接)
openNaverComment(Activity activity)
接口说明:
- 打开NAVER社区接口,调用此接口进入到NAVER渠道界面,此接口没有回调。
参数说明:
- context:android的上下文
调用示例:
U8Platform.getInstance().openNaverComment(activity);
2.15 数数科技上报接口(必接)
submitTAUserInfo(int eventType,String eventID,JSONObject jsonObject)
接口说明:
- 调用数数科技上报接口,上报事件和用户属性数据
参数说明:
- eventType:上报类型(0:事件上报;1:用户数据上报set;2:用户数据上报setOnce;3:用户数据上报add);4:设置事件的公共属性;6:设置一次性事件上报;7:设置可更新事件上报
- eventID:上报事件名(用户数据上报set,add,setOnce和设置公共属性时传null或"",事件上报不能为null和"")
- jsonObject:上报属性数据(必传,不可传null)
调用示例:
U8Platform.getInstance().submitTAUserInfo(eventType, eventID, jsonObject);
上报时机:角色名称,登出角色和切换角色以示例标准传,其余的事件按照运营提供的文档传参
角色名称修改时上报,类型:set(eventType=1),jsonObject.put("mj_role_name",role_name);
登出角色后时上报 类型:事件上报(eventType=0);eventID="mj_logout_role"(固定的)
切换角色时上报 类型:事件上报(eventType=0);eventID="mj_change_role"(固定的)
角色名称修改
JSONObject jsonObject = new JSONObject();
jsonObject.put("mj_role_name","role_武侠");
U8Platform.getInstance().submitTAUserInfo(1, "", jsonObject);
登出角色
JSONObject jsonObject = new JSONObject();
U8Platform.getInstance().submitTAUserInfo(0, "mj_logout_role", jsonObject);
切换角色
JSONObject jsonObject = new JSONObject();
U8Platform.getInstance().submitTAUserInfo(0, "mj_change_role", jsonObject);
上报公共属性
JSONObject jsonObject = new JSONObject();
jsonObject.put("game_version","1.1.1");
U8Platform.getInstance().submitTAUserInfo(4, "", jsonObject);
2.16 初始化问卷接口(选接)
initUserSurver(String roleID, String serverID,String callbackUrl,OnInitUserSurverListener onInitUserSurverListener)
接口说明:
- 初始化问卷接口,是否显示问卷入口。
参数说明:
- roleID:玩家角色ID
- serverID:玩家所在服务器的ID
- callbackUrl:问卷回调地址
- onInitUserSurverListener:初始化问卷回调
调用示例:
U8Platform.getInstance().initUserSurver(roleID, serverID, callbackUrl, new OnInitUserSurverListener {
//初始化问卷,是否显示问卷入口
public void initUserSurver(Boolean isUserSurveyOpen);
//true:显示问卷入口,false:不显示问卷入口
});
2.17 打开问卷接口(选接)
openUserSurveyActivity()
接口说明:
- 打开问卷接口,调用此接口进入到问卷显示界面。
调用示例:
U8Platform.getInstance().openUserSurveyActivity();
2.18 打开NAVER游戏—维护页接口(选接)
openNaverCommentSorry(Activity activity)
接口说明:
- 打开NAVER社区维护页接口,调用此接口进入到NAVER渠道维护页界面,此接口没有回调。
参数说明:
- context:android的上下文
调用示例:
U8Platform.getInstance().openNaverCommentSorry(activity);
2.19 打开NAVER游戏—公告栏接口(选接)
openNaverCommentBoard(Activity activity,int boardId)
接口说明:
- 打开NAVER社区公告栏接口,调用此接口进入到NAVER渠道公告界面,此接口没有回调。
参数说明:
- context:android的上下文
- boardId:公告id,NAVER后台获取
调用示例:
U8Platform.getInstance().openNaverCommentBoard(activity,boardId);
2.20 切换账号接口(选接)
switchAccount(Activity context)
接口说明:
- 切换账号接口,打开SDK切换账号界面,切换成功或者失败,会触发上面初始化监听器中的onSwitchAccount回调函数
参数说明:
- context:android的上下文
调用示例:
U8Platform.getInstance().switchAccount(activity);
2.21 绑定账号接口(选接)
bindAccount(Activity context)
接口说明:
- 绑定账号接口,打开SDK绑定账号界面,绑定成功,会触发上面初始化监听器中的onBindAccountResult回调函数
参数说明:
- context:android的上下文
调用示例:
U8Platform.getInstance().bindAccount(activity);
2.22 获取国家等用户属性接口(选接)
getUserInfo(U8GetUserInfoListener u8GetUserInfoListener)
接口说明:
- 获取国家等用户属性接口,
参数说明:
- u8GetUserInfoListener:接口回调
调用示例:
U8Platform.getInstance().getUserInfo(new U8GetUserInfoListener() {
@Override
public void onGetUserInfoSuccess(String info) {
Log.d("U8SDK", "===onGetUserInfoSuccess"+info);
}
@Override
public void onGetUserInfoFail() {
Log.d("U8SDK", "===onGetUserInfoFail");
}
});
info信息是json字符串,示例:
{"country":"HK","totalCharge":0,"regTime":"2022-05-27 15:44:33","retainedDays":4,"totalChargeNum":0,"userID":2000000371,"sdkUserID":"57948a1c935ce412","currentCountry":"US"}
说明:
userID:用户唯一标识
sdkUserID:平台userid
country:首次注册时的国家
currentCountry:登录时的国家
firstChargeTime:首次付费时间
lastChargeTime:最近一次付费时间
regTime:注册时间
retainedDays:活跃天数
sdkUserID:平台userid
totalCharge:总充值金额
totalChargeNum:总充值次数
2.23 打开游戏社区接口(选接)
getComunityCenter(Activity activity, String comunityName)
接口说明:
- 游戏社区接口,调用接口,打开社区界面。
参数说明:
- comunityName:社区名称,Facebook,Instagram,Discord,Reddit,Twitter,Youtube,Line,Bahamut,Cafe,目前只有9个。cafe是sdk接口模式,只能拉起主页横幅界面,其余都是链接模式,拉起webview界面显示
调用示例:
U8Platform.getInstance().getComunityCenter(activity, comunityName);
2.24 打开请求通知权限接口(选接)
openNotifications()
接口说明:
- 请求通知权限接口,调用接口,打开请求通知说明。
- Android 13 引入了用于显示通知的新运行时权限。这会影响在 Android 13 或更高版本上运行的所有使用 FCM 通知的应用。用户授予此权限之前,您的应用将无法显示通知,因此需要调用此接口打开通知权限设置。相关链接:https://firebase.google.cn/docs/cloud-messaging/android/client
- 调用接口显示弹框界面的规则:
- 1.一天最多弹出一次(0-24点算一天)
- 2.每个设备7天内最多弹出2次;超过2次后,7天内内不再弹出
- 3.用户开启后,该用户不再弹出
- 4.app删除重装后,重新计算次数
- 5.仅针对Android 13 及以上的设备弹框
调用示例:
U8Platform.getInstance().openNotifications();
2.25 客服功能(选接)
2.25.1 是否开启FAQ功能
getShowFAQ()
接口说明:
- 判断游戏是否开启FAQ功能,请在Init通知成功后调用。若运营人员在发行后台开启FAQ模块开关,该方法将返回true,若运营人员未开启FAQ模块,该方法将返回false。
调用示例:
Boolean isOpenShowFAQ = U8SDK.getInstance().getShowFAQ();
2.25.2 是否开启客服系统功能
getShowConversation()
接口说明:
- 判断游戏是否开启客服系统功能,请在Init通知成功后调用。若运营人员在发行后台开启"客服系统"开关,该方法将返回true,若运营人员未开启"客服系统"模块,该方法将返回false。
调用示例:
Boolean isOpenConversation = U8SDK.getInstance().getShowConversation();
2.25.3 FAQ模块
showFAQ()
接口说明:
- 点击进入FAQ页面
调用示例:
U8Platform.getInstance().showFAQ();
2.25.4 客服系统模块
showConversation()
接口说明:
- 点击进入客服系统页面
调用示例:
U8Platform.getInstance().showConversation();
2.26 获取游戏虚拟币数据接口
getAccountVirtualCoinNum(OnU8AccountVirtualCoinNumListener onU8AccountVirtualCoinNumListener)
接口说明:
- 获取虚拟币相关的数据,虚拟币名称,虚拟币icon地址,虚拟币数量和虚拟币说明。
调用示例:
U8Platform.getInstance().getAccountVirtualCoinNum(new OnU8AccountVirtualCoinNumListener() {
@Override
public void getAccountVirtualCoinNumSuccess(String info) {
}
@Override
public void getAccountVirtualCoinNumFail() {
}
});
info信息是json字符串,示例:
{"virtual_coin_num":101,"virtual_coin_name":"test1-英","virtual_coin_icon":"https://pic.leduimg.com/pic-ledu-com/productEnvironment/1RCFRiJ_a5d831a71487fcb6eaaf75c0ee866d57.jpeg","virtual_coin_desc":"test1-desc-英"}
说明:
virtual_coin_num:虚拟币数量
virtual_coin_name:虚拟币名称
virtual_coin_icon:虚拟币icon地址
virtual_coin_desc:虚拟币说明
2.27 Facebook分享功能接口
share(ShareParams shareParams)
接口说明:
- Facebook分享接口,暂时只做了分享本地图片接口,并且一次只能分享一张图片。分享成功或者失败,会触发上面初始化监听器中的onShareResult回调函数
参数说明:
- shareParams:分享需要传递的参数
关于ShareParams对象:
参数名称 | 参数类型 | 参数说明 |
---|---|---|
url | String | 分享的图片的网络链接 |
特殊设置:
- 将 ContentProvider 添加至 AndroidManifest.xml 文件,并将 {APP_ID} 设置为您的应用编号
<provider
android:authorities="com.facebook.app.FacebookContentProvider{APP_ID}"
android:name="com.facebook.FacebookContentProvider"
android:exported="true"/>
调用示例:
ShareParams shareParams = new ShareParams();
shareParams.setUrl("https://nativesupport.dcloud.net.cn/test.jpg");
U8Platform.getInstance().share(shareParams);
2.28 菜单项目调用功能接口
openMeMenuItem(int itemTye)
接口说明:
- 菜单项目调用功能,调用之后打开相应的菜单项目
参数说明:
- itemTye:跳转目标菜单类别
关于itemTye:
public class MeMenuItem {
//跳转到DMM GAMES STORE应用
public static final int ITEM_DMM_GAMES_STORE = 1;
//跳转到DMM 积分充值界面
public static final int ITEM_DMM_POINT_CHARGE = 2;
//跳转到关于GAMES使用条款的页面。
public static final int ITEM_DMM_TERM = 3;
//跳转到游戏专用的咨询表单。
public static final int ITEM_DMM_INQUIRY = 4;
//跳转到DMM GAMES Platform的游戏专用社区页面。
public static final int ITEM_DMM_COMMUNITY = 5;
//跳转到DMM GAMES Platform上的游戏设置界面
public static final int ITEM_DMM_SETTINGS = 6;
//跳转到DMM GAMES STORE应用内的“我的游戏”
public static final int ITEM_DMM_MY_GAME = 7;
//跳转到DMM GAMES STORE应用内的运营方通知界面。
public static final int ITEM_DMM_ANNOUNCEMENT = 8;
//跳转到DMM的账号管理界面。
public static final int ITEM_DMM_ACCOUNT_PAGE = 9;
//跳转到DMM GAMES STORE的游戏详情界面
public static final int ITEM_DMM_APPLICATION_UPDATE =10;
}
调用示例:
U8Platform.getInstance().openMeMenuItem(MeMenuItem.ITEM_DMM_GAMES_STORE);
支付测试的其它操作
1.google需要添加测试账号(两处:公司主体主账号下要添加,项目下的测试人员也要添加),测试账号加入测试计划(添加测试人员下面有个链接,测试账号需要同意一下) 2.onestore的包上传的时候需要上传一下处理过的签名文件信息,处理步骤在onestore后台传包步骤里面有相关的代码,需要找运营提供;onestore包也需要添加测试账号。 3.xsolla支付区分沙箱环境和正式环境,相关的配置是assets/u8_developer_config.properties里面的XSOLLA_PAY_SETTINGS,true是沙箱环境,false是正式环境。 4.xsolla重定向处理,需要在AndroidManifest.xml里面添加相关配置,如果solla后台的重定向配置是:app://mujoy.sg,那就需要在AndroidManifest.xml的activity添加以下声明。data里面的配置和xsolla后台配置是需要对应。
<activity
android:name="com.xsolla.android.payments.ui.ActivityPaystationBrowserProxy"
android:exported="true"
android:configChanges="orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/xsolla_payments_Theme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="mujoy.sg"
android:scheme="app" />
</intent-filter>
</activity>
5.qoo支付区分沙箱环境和正式环境,相关配置是AndroidManifest.xml的两个meta-data参数,SAND开头的代表是沙箱环境参数,PROD开头的是正式环境参数
<meta-data
android:name="com.qooapp.APP_ID" android:value="SAND5476a6e0f94711ed931ae23bc1590402" />
<meta-data
android:name="com.qooapp.PUBLIC_KEY" android:value="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8A4C2iK3oibULQli+bKjkawDCMdxqBh2RlV1l/+AEkwNnbBPshsEEwVAzTzHYMFfiBU3D/o74HYXxkTYdnfMEl5y8lF+VWSW0RFRJBm21tYyxzVqHS661RDHUOPahHfMn8wZCfrZfKEV6+EPl05IDv934rKGtZU+s20/Kcffnmw3ZNZJJPMedtKKA+jYA+TdfpghbC8rzev/1BKwNiWaDyYHc738s3eGerJJx11E45HEgV7gn4hKS5TCvzQiMQN3gi7T4fTxAPFx57dGvR/SNcuLeThe4h+GwdzJsrZaByQyvZf2V6v+hQzdpQ4NrXV9jtvv5qRvKFLlKRFCch5kfwIDAQAB" />
6.qoo沙箱环境参数测试支付正常,切换正式参数之后支付拉起异常提示"Service not available-4",这个需要运营找qoo技术处理。 7.samsung支付测试环境设置
MKOverseasPay.getInstance().setPayOperationMode(true);
备注(特殊参数获取)
渠道号
U8SDK.getInstance().getCurrChannel();
访客id,游戏服务端上报数数数据用到,初始化成功之后获取
U8SDK.getInstance().getDistinctID();
是否是游客账号,登录成功之后获取
U8SDK.getInstance().getIsVisitor();
TA预置属性数据接口,游戏服务端用到,游戏解析获取需要用到的参数
String properties = U8SDK.getInstance().getPresetProperties();
字符串类型(json),示例:
{
"#carrier": "中国电信",
"#os": "Android",
"#device_id": "abb8e87bfb5ce66c",
"#screen_height": 2264,
"#bundle_id": "com.sw.thinkingdatademo",
"#manufacturer": "realme",
"#device_model": "RMX1991",
"#screen_width": 1080,
"#system_language": "zh",
"#os_version": "10",
"#network_type": "WIFI",
"#zone_offset": 8,
"#app_version":"1.0.0"
}
说明:
carrier://手机SIM卡运营商信息,双卡双待时,取主卡的运营商信息
os://os类型,如Android
device_id://设备唯一标识
screen_height://屏幕高度
bundle_id://包名
manufacturer://手机制造商 如HuaWei
device_model://设备型号
screen_width://屏幕宽度
system_language://手机系统语言类型
os_version://系统版本号
network_type://网络类型
zone_offset://时区偏移值
app_version://app版本号