diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f7b373 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d33b7a --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# UnionSDK for Android接入文档 + + +V6.0.4 +2020年03月27日 + + +## 版本概述 + +此版本为使用AndroidStudio开发的版本,使用aar的方式提供sdk接入包,并使用gradle在线依赖方式,aar内别并不包含依赖包,请按此文档描述接入. + +此SDK适用android api>=16 的系统,编译器jdk8+. + + +## 1.依赖导入 +配置gradle,以下为必须项 + + repositories{ + maven{ + url "http://117.50.8.198:8081/nexus/content/repositories/sdk" + } + } + + dependencies { + implementation 'com.gt.union.sdk:GameSDK:6.0.4' + + } + + +## 2.向Gump平台索要游戏ID(AppID),完成代码接入 + +* ActionCallback为通用的异步回调接口,所有的异步方法都是用此接口做回调. +此接口只有一个回调方法`onCallback(String event, Object... payload)` +其中参数event为当前回调的事件类型,用于区别不同的方法回调;payload为不同的回调负载,包含回调时需要传输的数据 + + + +#### 1.获取SDKAgent对象,并执行初始化配置。 + + + SDKAgent.object(Activity,appId).channel(channelId); + + +#### 2.调用SDKAgent的登录方法,将执行登录流程,需要一个Activity实例作参数和一个ActionCallback对象做登录结果接收 + + sdkAgent.login(Activity,ActionCallback); + + +payload[0]为Boolean类型表示登录结果,成功登录后收到payload[1]为SessionKey对象,可以获取以下信息 + + sessionKey.getUid();//获取用户的userid,此Id标识唯一用户! + sessionKey.getToken();//当前session的token + sessionKey.getExpires();//sessionKey的过期时间,类型Date + +#### 3.支付功能 + +支付分为google play 官方Iab支付和三方支付,情况有两种:1)根据云端配置调用不同的支付方法 2)自行构建逻辑调用不同的支付方法 + +* 获取云端配置 + +`sdkAgent.judgePayment(Activity, serverId, roleId, ActionCallback);` + +payload[0]为boolean类型,true时应使用三方支付,false应使用iab支付 + +* 调用Google Play Iab支付 + +``` + OrderForm order = new OrderForm() + .setServerId(serverId)//游戏服id + .setRoleId(roleId)//角色id + .setExtraInfo("orderId")//订单号 + .setAmount(0.99f)//金额 + .setCurrency("USD")//货币 + .setProduct("gro.udc.mig.99");//商品id + + sdk.launchIap(MainActivity.this, order,ActionCallback); +``` + +payload[0]为boolean类型,标明支付是否完成;payload[1]为错误描述 + + +* 三方支付 + +``` + OrderForm order = new OrderForm() + .setServerId(serverId)//游戏服id + .setRoleId(roleId)//角色id + .setExtraInfo("orderId")//订单号 + .setAmount(0.99f)//金额 + .setCurrency("USD")//货币 + .setProduct("gro.udc.mig.99");//商品id + + sdkAgent.goRecharge(MainActivity.this, order, ActionCallback); +``` +payload[0]为boolean类型,true支付完成,false支付异常 + +#### 4.注销登录 + + sdkAgent.logout(ActionCallback); +当此方法调用后,用户退出登录,为了便于用户切换登录账户,请在游戏内提供用户注销的触发按钮 + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..d721b6e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,50 @@ +apply plugin: 'com.android.application' + + +repositories { + maven { + url "http://117.50.8.198:8081/nexus/content/repositories/sdk" + } + jcenter() + google() +} + +android { + compileSdkVersion 28 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "gro.udc.mig" + minSdkVersion 16 + targetSdkVersion 28 + versionCode 37 + versionName "1.1" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + +// implementation project(':sdk') + implementation 'com.gt.union.sdk:GameSDK:6.0.4' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/gt/union/sdk/demo/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/gt/union/sdk/demo/ExampleInstrumentedTest.java new file mode 100644 index 0000000..48114c0 --- /dev/null +++ b/app/src/androidTest/java/com/gt/union/sdk/demo/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.gt.union.sdk.demo; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.gt.union.sdk.demo", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..eecca64 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/gt/union/sdk/demo/MainActivity.java b/app/src/main/java/com/gt/union/sdk/demo/MainActivity.java new file mode 100644 index 0000000..9065c1e --- /dev/null +++ b/app/src/main/java/com/gt/union/sdk/demo/MainActivity.java @@ -0,0 +1,155 @@ +package com.gt.union.sdk.demo; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.gt.union.sdk.SDKAgent; +import com.gt.union.sdk.callback.ActionCallback; +import com.gt.union.sdk.login.SessionKey; +import com.gt.union.sdk.recharge.OrderForm; + +public class MainActivity extends AppCompatActivity { + + private String appId = "10105"; + private String channelId = "1067"; + private String serverId = "222"; + private String roleId = "222006003"; + + private SDKAgent sdkAgent; + + private TextView tvInfo; + private LinearLayout sessionLayout; + + private Button btnLogin; + + private Button btnLogout; + private Button btnPay; + private Button btnIab; + private Button btnAutoJudge; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + tvInfo = findViewById(R.id.info); + sessionLayout = findViewById(R.id.sessionLayout); + + btnLogin = findViewById(R.id.login); + btnLogout = findViewById(R.id.logout); + btnPay = findViewById(R.id.pay); + btnIab = findViewById(R.id.iab); + btnAutoJudge = findViewById(R.id.auto_judge_pay); + + btnLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sdkAgent.login(MainActivity.this, new ActionCallback() { + @Override + public void onCallback(String event, Object... payload) { + if(event.equals(ActionCallback.ACTION_LOGIN)) { + boolean result = (boolean) payload[0]; + if(result) { + SessionKey sessionKey = (SessionKey) payload[1]; + tvInfo.setText(sessionKey.getUid()); + sessionLayout.setVisibility(View.VISIBLE); + btnLogin.setVisibility(View.GONE); + }else{ + Toast.makeText(MainActivity.this,"登录取消",Toast.LENGTH_SHORT).show(); + } + } + } + }); + } + }); + btnLogout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sdkAgent.logout(new ActionCallback() { + @Override + public void onCallback(String event, Object... payload) { + if(event.equals(ActionCallback.ACTION_LOGOUT)) { + sessionLayout.setVisibility(View.GONE); + btnLogin.setVisibility(View.VISIBLE); + } + } + }); + } + }); + + btnPay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + OrderForm order = new OrderForm(); + order.setServerId(serverId).setRoleId(roleId).setExtraInfo("orderId").setAmount(0.99f).setCurrency("USD").setProduct("gro.udc.mig.99"); + + sdkAgent.goRecharge(MainActivity.this, order, new ActionCallback() { + @Override + public void onCallback(String event, Object... payload) { + if(event.equals(ActionCallback.ACTION_PAY)) { + boolean result = (boolean) payload[0]; + String res = result ? "支付成功" : "支付失败"; + Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show(); + } + } + }); + } + }); + + btnIab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + OrderForm order = new OrderForm(); + order.setServerId(serverId).setRoleId(roleId).setExtraInfo("orderId").setAmount(0.99f).setCurrency("USD").setProduct("gro.udc.mig.99"); + sdkAgent.launchIap(MainActivity.this, order, new ActionCallback() { + @Override + public void onCallback(String event, Object... payload) { + if(event.equals(ActionCallback.ACTION_PAY)) { + boolean result = (boolean) payload[0]; + String des = (String) payload[1]; + String res = result ? "Iab支付完成" : "Iab支付失败:"+des; + Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show(); + } + } + }); + } + }); + + btnAutoJudge.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sdkAgent.judgePayment(MainActivity.this, serverId, roleId, new ActionCallback() { + @Override + public void onCallback(String event, Object... payload) { + if(event.equals(ActionCallback.ACTION_JUDGE)) { + boolean result = (boolean) payload[0]; + if (result) + btnPay.performClick(); + else + btnIab.performClick(); + } + } + }); + } + }); + + + sdkAgent = SDKAgent.object(this, appId).channel(channelId); + + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + if (!sdkAgent.onActivityResult(requestCode, resultCode, data)) + super.onActivityResult(requestCode, resultCode, data); + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..301f241 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,48 @@ + + + + + +