Browse Source

v1.0.0开发:修改README.md

#Suyghur 3 years ago
parent
commit
2756ccc446

+ 8 - 2
README.md

@@ -1,3 +1,9 @@
-# ColumbusSdkForAndroid
+# EYuanGameSdk
 
-Android海外发行SDK
+Android海外发行SDK
+
+- [服务端接口文档](https://www.showdoc.com.cn/EYuanGameAPI)
+
+- [客户端接入文档](./tutorial)
+
+- [服务端接入文档]()

+ 2 - 1
build.gradle

@@ -1,12 +1,13 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 buildscript {
 
+    ext.PUBLISH_ENABLE = false
     // 混淆开关
     ext.MINIFY_ENABLE = true
     // ndk版本
     ext.NDK_VERSION = '21.3.6528147'
     // kotlin版本
-    ext.KOTLIN_VERSION = '1.5.10'
+    ext.KOTLIN_VERSION = '1.4.20'
     // compileSdkVersion
     ext.COMPILE_SDK_VERSION = 30
     // buildToolsVersion

+ 30 - 0
demo/build.gradle

@@ -72,6 +72,36 @@ android {
 dependencies {
 
     api project(':library_core')
+//    implementation 'io.github.yyxxgame.sdk:eyuangame-sdk-ktx:0.0.1'
+
+//    //mmkv
+//    implementation 'com.tencent:mmkv-static:1.2.10'
+//
+//    //日志采集框架
+//    implementation 'io.github.suyghur.dolin:zap:1.0.0'
+//
+//    implementation 'androidx.core:core-ktx:1.6.0'
+//    implementation 'androidx.fragment:fragment-ktx:1.3.5'
+//    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+//    implementation 'com.google.android.material:material:1.4.0'
+//    implementation 'com.android.installreferrer:installreferrer:2.2'
+//
+//    //google
+//    implementation 'com.google.android.play:core:1.10.0'
+//    implementation 'com.google.android.gms:play-services-auth:19.0.0'
+//    //4.0.0的billing库消耗商品会回调两次,后续在排查,先用3.0.3
+//    implementation "com.android.billingclient:billing-ktx:3.0.3"
+//    implementation 'com.google.firebase:firebase-analytics-ktx:19.0.0'
+//    implementation 'com.google.firebase:firebase-crashlytics-ktx:18.1.0'
+//
+//    //facebook
+//    implementation 'com.facebook.android:facebook-login:9.0.0'
+//    implementation 'com.facebook.android:facebook-android-sdk:8.2.0'
+//
+//    //adjust
+//    implementation 'com.adjust.sdk:adjust-android:4.28.2'
+//
+//    api(name: 'library_core-release', ext: 'aar')
     debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
 
 }

BIN
demo/libs/library_core-release.aar


+ 6 - 4
library_base/build.gradle

@@ -44,9 +44,9 @@ android {
         preDexLibraries = false
     }
 
-//    compileOptions {
-//        kotlinOptions.freeCompilerArgs += ['-module-name', "cn.yyxx.columbus.base"]
-//    }
+    compileOptions {
+        kotlinOptions.freeCompilerArgs += ['-module-name', "cn.yyxx.eyaungame.base"]
+    }
 }
 
 dependencies {
@@ -54,4 +54,6 @@ dependencies {
     api files('../libs/yyxx_support_1.0.1.jar')
     implementation 'androidx.core:core-ktx:1.6.0'
     implementation 'io.github.suyghur.dolin:zap:1.0.0'
-}
+}
+
+apply from: 'buildJar.gradle'

+ 21 - 0
library_base/buildJar.gradle

@@ -0,0 +1,21 @@
+def SDK_BASENAME = "eyuangamesdk_base"
+def SDK_VERSION = "1.0.0"
+def SEPARATOR = "_"
+def sdkDestinationPath = "build/jar/"
+def zipFile = file('build/intermediates/aar_main_jar/release/classes.jar')
+
+static def buildTime() {
+    return new Date().format("yyyyMMddHHmm", TimeZone.getDefault())
+}
+
+task deleteBaseBuild(type: Delete) {
+    delete sdkDestinationPath
+}
+
+task makeJar(type: Jar) {
+    from zipTree(zipFile)
+    baseName = SDK_BASENAME + SEPARATOR + SDK_VERSION
+    destinationDir = file(sdkDestinationPath)
+}
+
+makeJar.dependsOn(deleteBaseBuild, build)

+ 4 - 2
library_base/proguard-rules.pro

@@ -129,14 +129,16 @@
 
 -keep class cn.yyxx.support.**{*;}
 -keep class com.dolin.zap.**{*;}
+-keep class cn.yyxx.eyuangame.base.entity.SdkEvent{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.base.entity.SdkChargeInfo{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.base.entity.SdkRoleInfo{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.base.internal.ICallback{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.base.internal.IInitialize{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.base.utils.Logger{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.base.utils.ParamsUtils{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.base.EYuanGame{public <fields>; public <methods>;}
--keep class cn.yyxx.columbus.base.ColumbusApplication{public <fields>; public <methods>;}
--keep class cn.yyxx.columbus.Version{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.base.EYuanGameApplication{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.Version{public <fields>; public <methods>;}
 
 
 

+ 1 - 0
library_base/src/main/java/cn/yyxx/eyuangame/base/EYuanGame.kt

@@ -193,6 +193,7 @@ class EYuanGame private constructor() {
      *
      * @param activity   Activity上下文
      * @param chargeInfo 支付信息实体对象
+     * @param isIab      是否内购
      * @param callback   支付回调对象
      */
     fun charge(activity: Activity, chargeInfo: SdkChargeInfo, isIab: Boolean, callback: ICallback) {

+ 8 - 5
library_core/build.gradle

@@ -52,7 +52,7 @@ android {
     }
 
     compileOptions {
-        kotlinOptions.freeCompilerArgs += ['-module-name', "cn.yyxx.columbus.core"]
+        kotlinOptions.freeCompilerArgs += ['-module-name', "cn.yyxx.eyuangame.core"]
     }
 
     externalNativeBuild {
@@ -67,7 +67,6 @@ android {
 dependencies {
 
     //mmkv
-//    api files('../libs/mmkv-static-1.2.8.jar')
     implementation 'com.tencent:mmkv-static:1.2.10'
 
     //日志采集框架
@@ -94,7 +93,11 @@ dependencies {
     //adjust
     implementation 'com.adjust.sdk:adjust-android:4.28.2'
 
-    api project(':library_base')
-//    api project(':library_comm')
+    if (PUBLISH_ENABLE) {
+        api files('../libs/eyuangamesdk_base_1.0.0.jar')
+    } else {
+        api project(':library_base')
+    }
+}
 
-}
+apply from: 'publish.gradle'

+ 4 - 2
library_core/proguard-rules.pro

@@ -130,8 +130,10 @@
 -keep class com.tencent.mmkv.**{*;}
 -keep class cn.yyxx.support.**{*;}
 -keep class com.dolin.zap.**{*;}
--keep class cn.yyxx.columbus.base.**{*;}
--keep class cn.yyxx.columbus.core.SdkBridge{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.base.**{*;}
+-keep class cn.yyxx.eyuangame.Version{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.core.internal.IJsCallback{public <fields>; public <methods>;}
+-keep class cn.yyxx.eyuangame.core.SdkBridge{public <fields>; public <methods>;}
 -keep class cn.yyxx.eyuangame.core.impl.SdkDrive{public <fields>; public <methods>;}
 
 

+ 82 - 0
library_core/publish.gradle

@@ -0,0 +1,82 @@
+apply plugin: 'maven'
+apply plugin: 'signing'
+
+def PUBLISH_GROUP_ID = "io.github.yyxxgame.sdk"
+def PUBLISH_ARTIFACT_ID = "eyuangame-sdk-ktx"
+def PUBLISH_VERSION = "0.0.1"
+
+Properties properties = new Properties()
+properties.load(project.rootProject.file('local.properties').newDataInputStream())
+
+def ossrhUsername = properties.getProperty("SonaType.user")
+def ossrhPassword = properties.getProperty("SonaType.pwd")
+
+task androidSourcesJar(type: Jar) {
+    archiveClassifier.set('source')
+    if (project.plugins.findPlugin('com.android.library')) {
+        from android.sourceSets.main.java.srcDirs
+    } else {
+        form sourceSets.main.java.srcDirs
+    }
+}
+
+artifacts {
+    archives androidSourcesJar
+}
+
+signing {
+    required {
+        gradle.taskGraph.hasTask("uploadArchives")
+    }
+    sign configurations.archives
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            beforeDeployment {
+                MavenDeployment deployment -> signing.signPom(deployment)
+            }
+
+            repository(url: "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") {
+                authentication(userName: ossrhUsername, password: ossrhPassword)
+            }
+
+            snapshotRepository(url: "https://s01.oss.sonatype.org/content/repositories/snapshots/") {
+                authentication(userName: ossrhUsername, password: ossrhPassword)
+            }
+
+            pom.groupId = PUBLISH_GROUP_ID
+            pom.artifactId = PUBLISH_ARTIFACT_ID
+            pom.version = PUBLISH_VERSION
+
+            pom.project {
+                name "${PUBLISH_GROUP_ID}:${PUBLISH_ARTIFACT_ID}"
+                packaging 'aar'
+                description 'game sdk of EYuan'
+                url 'https://github.com/yyxxgame'
+
+                scm {
+                    connection 'scm:git:ogs.yyxxgame.com:3000/Client/EYuanGameSdk-KTX.git'
+                    developerConnection 'scm:git:ssh://gogs.yyxxgame.com:3000/Client/EYuanGameSdk-KTX.git'
+                    url 'http://gogs.yyxxgame.com/Client/EYuanGameSdk-KTX'
+                }
+
+                licenses {
+                    license {
+                        name 'The Apache License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                    }
+                }
+
+                developers {
+                    developer {
+                        id 'yyxxgame'
+                        name 'yyxxgame'
+                        email 'developcentre@yyxxgame.com'
+                    }
+                }
+            }
+        }
+    }
+}

+ 8 - 0
library_core/src/main/java/cn/yyxx/eyuangame/core/internal/IJsCallback.kt

@@ -0,0 +1,8 @@
+package cn.yyxx.eyuangame.core.internal
+
+/**
+ * @author #Suyghur.
+ * Created on 2021/07/09
+ */
+interface IJsCallback {
+}

BIN
libs/eyuangamesdk_base_1.0.0.jar


+ 0 - 22
test.pem

@@ -1,22 +0,0 @@
------BEGIN PUBLIC KEY-----
-MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAVatPhPaZtxBkLBZDnOLf7no6
-VfnjBRMXhpOnWmkkDX4zurB/OKisYDFnR0UUVnKn717+absfLlDk9HZWBcTMznsU
-ju9fuXlu3Elr8HeI3en7E0KIQzxkY1GT1+qtZ+tCjWuyMmUw4vWpO8/MRU3f6nc4
-io3w+7N+dP24BIo0ZwIDAQAB
------END PUBLIC KEY-----
-
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQCAVatPhPaZtxBkLBZDnOLf7no6VfnjBRMXhpOnWmkkDX4zurB/
-OKisYDFnR0UUVnKn717+absfLlDk9HZWBcTMznsUju9fuXlu3Elr8HeI3en7E0KI
-QzxkY1GT1+qtZ+tCjWuyMmUw4vWpO8/MRU3f6nc4io3w+7N+dP24BIo0ZwIDAQAB
-AoGABDrHeXNJV8u0tjQGcAuyl56rpguMIzUD4ubiZM0ATDaAE1uZ2XFUqOzVkjf8
-DLELlR4cW28yiVMLvAnNANsgXzpJNc9F8mQJvjdz5P3v5td4EQHkYm2m0/HtdCVP
-vdfzofCrmNy9uCGWr8H+wSBuA6ifOr3ym4QVlAJLJfx0BOkCQQCRP+lKn4oD3HFC
-bQVJNQGQo/I3TE+EcSMQ6apAl9D16w4mfk4uaA24cKtgB1HKjlB4bcOnY593IMl0
-JIXvWTtpAkEA4jAF8ptfc/nXgzyKrXLinJhbcoRKgY3FQJE3EqHj2Ynu2L/rrsTL
-pcOW130SNGwEu5Rkpg8W0FSC/T9u9TkHTwJAX0WnlS3+TjgLBkISRImDJEeVOdZR
-FhNLp+1Moh+yjYuHdZJFX8Uass8cadmDObSNbeC5hBMhZvdXjFnkjDFgeQJASdqy
-ZngTH9RJaWGgSmhD1CvvWCIYDdtTt/RyjhPsSQC/y2hHNWautC58F1qQUiufE/yt
-LIeqxFWD+9r1iP6ZAwJBAIiKQMh+eDZeCHJsR5IlJ3O9Y8JsIt2/LfonmIUpGdmt
-DvJtVQw5J5XA3Tk1GLLn32XCHQCpvHQLHMyhHSPGeEs=
------END RSA PRIVATE KEY-----

+ 564 - 0
tutorial.md

@@ -0,0 +1,564 @@
+# 修订记录
+
+|	日期 	|	版本	|	说明	|	 作者	|
+| :--: | :--: | :-- | :--: |
+|	2021-07-09	|	1.0.0	|	文档建立	| 麦锦培 |
+
+
+# 1.接入前检查
+
+- 游戏资源文件名、布局名、布局id名等建议使用规范命名,避免和SDK资源冲突
+- Android Studio 3.0及以上,由于谷歌服务一系列SDK已不提供jar包形式,因此SDK不提供jar包形式以eclipse接入
+- Android Gradle Plugin Version : 4.1.3+
+- Gradle Version : 6.5+
+- Android Studio开启Android X支持,请在游戏项目根目录的**`gradle.properties`**中设置
+```properties
+android.useAndroidX=true
+android.enableJetifier=true
+```
+
+- 请务必使用我们提供的keystore签名文件进行签名,否则SDK功能会异常
+
+
+# 2.SDK资源接入说明
+
+- 1.接入中存在问题请参考SDK提供的Demo工程或联系技术解决
+- 2.拷贝SDK目录下**`assets/yyxx_game`**至项目中
+- 3.拷贝SDK目录下**`res/values/strings.xml`**中的内容至项目中相应的文档中,如果没有strings.xml则新建一份即可
+- 4.在应用**`build.gradle`**中**`dependencies`**节点下添加SDK依赖,目前只提供远程依赖,需要离线aar包请联系我方技术
+> 在项目级**`build.gradle`**文件下的**`allprojects`**节点下添加仓库的url
+```groovy
+	allprojects {
+		repositories {
+			...
+			mavenCentral()
+			...
+		}
+	}
+```
+
+> 在应用级**`build.gradle`**文件下的**`allprojects`**节点下添加仓库的url
+```groovy
+	implementation 'io.github.yyxxgame.sdk:eyuangame-sdk-ktx:1.0.0'
+```
+
+
+# 3.接口说明
+
+> <font color=red size=5>**SDK的所有接口如无特殊说明,默认均为必接且请务必在游戏主线程调用**</font>
+
+## 1)同步Application中的生命周期
+
+- 若游戏无自定义Application则直接在清单文件AndroidManifest.xml的**``application``**节点中设置name属性为SDK提供的Application**``cn.yyxx.eyuangame.base.EYuanGameApplication``**
+
+```xml
+  <application android:name="cn.yyxx.eyuangame.base.EYuanGameApplication">
+    ···
+  </application>
+```
+
+- 若游戏有自定义Application,则需要继承SDK提供的Application
+
+```java
+	public class DemoApplication extends EYuanGameApplication {
+		@Override
+		protected void attachBaseContext(Context base) {
+			super.attachBaseContext(base);
+		}
+
+		@Override
+		public void onCreate() {
+			super.onCreate();
+		}
+	}
+```
+
+## 2)同步游戏Activity中各个生命周期至SDK
+
+- 同步onStart
+
+```java
+	@Override
+	protected void onStart() {
+		super.onStart();
+		EYuanGame.getInstance().onStart(this);
+	}
+```
+
+- 同步onResume
+
+```java
+	@Override
+	protected void onResume() {
+		super.onResume();
+    EYuanGame.getInstance().onResume(this);
+	}
+```
+
+- 同步onRestart
+
+```java
+	@Override
+	protected void onRestart() {
+		super.onRestart();
+		EYuanGame.getInstance().onReStart(this);
+	}
+```
+
+- 同步onPause
+
+```java
+	@Override
+	protected void onPause() {
+		super.onPause();
+		EYuanGame.getInstance().onPause(this);
+	}
+```
+
+- 同步onStop
+
+```java
+	@Override
+	protected void onStop() {
+		super.onStop();
+		EYuanGame.getInstance().onStop(this);
+	}
+```
+
+- 同步onDestroy
+
+```java
+	@Override
+	protected void onDestroy() {
+		super.onDestroy();
+		EYuanGame.getInstance().onDestroy(this);
+	}
+```
+
+- 同步onActivityResult
+
+```java
+	@Override
+	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+		super.onActivityResult(requestCode, resultCode, data);
+		EYuanGame.getInstance().onActivityResult(this, requestCode, requestCode, data);
+	}
+```
+
+- 同步onNewIntent
+
+```java
+	@Override
+	protected void onNewIntent(Intent intent) {
+		super.onNewIntent(intent);
+		EYuanGame.getInstance().onNewIntent(this, intent);
+	}
+```
+
+## 3)SDK通用回调接口ICallback说明
+
+```java
+	public interface ICallback {
+		void onResult(int code, String result);
+	}
+```
+
+|	参数 	|	类型	|	说明	|
+| :--: | :--: | :--: |
+|	code	|	int	|	状态码(0成功,-1失败)	|
+|	result	|	string	|	返回信息	|
+
+## 4)SDK初始化
+
+- 在游戏的主Activity的onCreate中调用
+
+```java
+	/**
+	 * SDK初始化
+	 *
+	 * @param activity    Activity上下文
+	 * @param isLandscape 是否横屏
+	 * @param callback    SDK初始化回调
+	 */
+	public void initialize(final Activity activity, final Boolean isLandscape, ICallback callback)
+```
+
+- 示例
+
+```java
+	@Override
+	protected void onCreate(Bundle savedInstanceState){
+		EYuanGame.getInstance().initialize(this, false, new ICallback() {
+			@Override
+			public void onResult(int code, String result) {
+				if (code == 0) {
+					//TODO SDK初始化成功
+				} else {
+					//TODO SDK初始化失败,result是失败的debug信息
+        }
+			});
+	}
+```
+
+## 5)用户账号登录
+
+```java
+	/**
+	 * SDK用户登录
+	 *
+	 * @param activity Activity上下文
+	 * @param isAuto   是否自动登录
+	 * @param callback 登录回调对象
+	 */
+	public void login(Activity activity, Boolean isAuto, ICallback callback)
+```
+
+**登录回调返回的result信息**
+
+|	参数 	|	类型	|	说明	|
+| :--: | :--: | :--: |
+|	userId	|	string	|	SDK的用户ID	|
+|	token	|	string	|	签名token	|
+
+- 示例
+
+```java
+	EYuanGame.getInstance().login(DemoActivity.this, true, new ICallback(){
+		@Override
+		public void onResult(int code, String result) {
+			if (code == 0) {
+				//TODO 对SDK返回的用户信息进行验签
+				//result返回的是JSON字符串,可以得到uid和token等信息
+				//签名规则详见服务端接入文档
+			} else {
+				//TODO 登录失败,result是返回的debug信息
+			}
+		}
+	});
+```
+
+## 6)用户账号登出
+
+> 用户在游戏中触发登出,游戏回到选服界面重新拉起登录
+
+```java
+	/**
+	 * SDK用户登出账号
+	 *
+	 * @param activity Activity上下文
+	 * @param callback 登出回调对象
+	 */
+	public void logout(Activity activity, ICallback callback)
+```
+
+- 示例
+
+```java
+	EYuanGame.getInstance().logout(this, new ICallback() {
+		@Override
+		public void onResult(int code, String result) {
+			if (code == 0) {
+				//TODO 用户登出成功,登出成功后请返回游戏选服界面,然后拉起登录框,如果调用登录接口,请设置为非自动登录
+			} else {
+				//TODO 用户登出失败,result是返回的debug信息
+			}
+	}
+```
+
+## 7)角色信息上报
+
+> 请务必根据当前角色的触发的事件进行上报
+
+角色信息实体对象SdkRoleInfo,如无特别说明所有字段均不能为null或空串""
+
+|	参数 	|	类型	|	说明	|
+| :--: | :--: | :--: |
+|	userId	|	string	|	当前用户ID	|
+|	serverId	|	string	|	当前角色所在的服务器ID	|
+|	serverName	|	string	|	当前角色所在的服务器名	|
+|	roleId	|	string	|	当前角色ID	|
+|	roleName	|	string	|	当前角色名	|
+|	roleLevel	|	string	|	当前角色等级	|
+|	roleCTime	|	long	|	当前角色创建的时间戳(10位),角色一旦创建则是固定值	|
+|	vipLevel	|	string	|	当前Vip角色等级,若无传"none"	|
+|	balance	|	string	|	当前角色游戏币余额,若无传"none"	|
+|	totalPurchase	|	int	|	累计充值金额,若无传0)	|
+
+> 角色创建
+
+```java
+	/**
+	 * SDK角色创建信息上报
+	 *
+	 * @param activity Activity上下文
+	 * @param roleInfo 角色信息实体
+	 */
+	public void roleCreate(Activity activity, SdkRoleInfo roleInfo)
+```
+
+> 角色进入服务器(角色登录)
+
+```java
+	/**
+	 * SDK角色登录信息上报
+	 *
+	 * @param activity Activity上下文
+	 * @param roleInfo 角色信息实体
+	 */
+	public void roleLauncher(Activity activity, SdkRoleInfo roleInfo)
+```
+
+> 角色升级
+
+```java
+	/**
+	 * SDK角色升级信息上报
+	 *
+	 * @param activity Activity上下文
+	 * @param roleInfo 角色信息实体
+	 */
+	public void roleUpgrade(Activity activity, SdkRoleInfo roleInfo)
+```
+
+- 示例
+
+```java
+	SdkRoleInfo gameRoleInfo = new SdkRoleInfo();
+	//用户ID
+	gameRoleInfo.setUserId(EYuanGame.getInstance().getCurrentUserId());
+	//角色ID
+	gameRoleInfo.setRoleId(roleId);
+	//角色名称
+	gameRoleInfo.setRoleName(roleName);
+	//角色等级
+	gameRoleInfo.setRoleLevel(roleLevel);
+	//创角时间戳(角色一旦创角则是固定值)
+	gameRoleInfo.setRoleCTime(System.currentTimeMillis()/1000)
+	//服务器ID
+	gameRoleInfo.setServerId(serverId);
+	//服务器名
+	gameRoleInfo.setServerName(serverName);
+	//用户VIP等级,无该字段则传空串""
+	gameRoleInfo.setVipLevel("1");
+	//当前角色游戏币余额
+	gameRoleInfo.setBalance("600");
+	//累计充值金额,若无传0)
+	gameRoleInfo.setTotalPurchase(0)
+
+	//角色创建
+	EYuanGame.getInstance().roleCreate(this, gameRoleInfo);
+
+	//角色登录
+	EYuanGame.getInstance().roleLauncher(this, gameRoleInfo;
+
+	//角色升级
+	EYuanGame.getInstance().roleUpgrade(this, gameRoleInfo;
+```
+
+
+## 8)支付储值
+
+> 请务必保证调用角色信息上报中的角色登录上报后再调用
+> <font color=red size=5>**客户端SDK回调的只是支付流程的结果,实际支付结果将由服务端回调**</font>
+> 默认情况均为内购包即上架Google Play,具体情况请根据运营需求接入
+
+支付信息实体对象SdkChargeInfo,如无特别说明所有字段均不能为null或空串""
+
+|	参数 	|	类型	|	说明	|
+| :--: | :--: | :--: |
+|	userId	|	string	|	当前用户ID	|
+|	serverCode	|	string	|	当前角色所在的服务器ID	|
+|	serverName	|	string	|	当前角色所在的服务器名	|
+|	roleId	|	string	|	当前角色ID	|
+|	roleName	|	string	|	当前角色名	|
+|	roleLevel	|	string	|	当前角色等级	|
+|	amount	|	int	|	金额,单位分,币种固定为币种美金	|
+|	productId	|	string	|	商品ID	|
+|	productName	|	string	|	商品名称	|
+|	productDesc	|	string	|	商品描述	|
+|	cpOrderId	|	string	|	游戏订单号	|
+|	cpExt	|	string	|	游戏透传信息,最终会元游返回,可为空	|
+|	cpPayTime	|	long	|	下单时间,10位Unix时间戳	|
+|	cpPaySign	|	string	|	支付签名,具体签名规则详见服务端接口文档	|
+
+```java
+	/**
+	 * SDK用户支付
+	 *
+	 * @param activity   Activity上下文
+	 * @param chargeInfo 支付信息实体对象
+	 * @param isIab			 是否内购
+	 * @param callback   支付回调对象
+	 */
+	public void charge(Activity activity, SdkChargeInfo chargeInfo, boolean isIab , ICallback callback)
+```
+
+- 示例
+
+```java
+	long ts = System.currentTimeMillis();
+	SdkChargeInfo gameChargeInfo = new SdkChargeInfo();
+	//用户ID
+	gameChargeInfo.setUserId(EYuanGame.getInstance().getCurrentUserId());
+	//角色ID
+	gameChargeInfo.setRoleId(roleId);
+	//角色名称
+	gameChargeInfo.setRoleName(roleName);
+	//角色等级
+	gameChargeInfo.setRoleLevel(roleLevel);
+	//创角时间戳(角色一旦创建则是固定值)
+	gameChargeInfo.setRoleCTime(创角时间戳(角色一旦创建则是固定值));
+	//服务器ID
+	gameChargeInfo.setServerId(serverId);
+	//服务器名
+	gameChargeInfo.setServerName(serverName);
+	//游戏的订单号
+	gameChargeInfo.setCpOrderId(orderId);
+	//透传字段,会在服务端回调中原样返回
+	gameChargeInfo.setCpExt("cp_callback_info||" + orderId);
+	//金额,单位分,币种美金
+	gameChargeInfo.setAmount(99);
+	//商品ID,计费点
+	gameChargeInfo.setProductId("com.shzd.1usd");
+	//商品名称
+	gameChargeInfo.setProductName("60元宝");
+	//商品描述
+	gameChargeInfo.setProductDesc("60元宝");
+	//下单时间
+	gameChargeInfo.setCpPayTime(payTs)
+	//支付签名
+	gameChargeInfo.setCpPaySign("支付签名,具体签名规则详见服务端接口文档")
+
+	//客户端SDK回调的只是支付流程的结果,实际支付结果将由服务端回调
+	EYuanGame.getInstance().charge(this, gameChargeInfo, true , new ICallback() {
+		@Override
+			public void onResult(int code, String result) {
+				if (code == 0) {
+					//TODO 支付流程完成
+				} else {
+					//TODO 支付失败
+				}
+			}
+	});
+```
+
+
+## 9)SDK游戏打点上报(按需接入)
+
+SDK埋点事件信息实体对象SdkEvent
+
+|	参数 	|	类型	|	说明	|
+| :--: | :--: | :--: |
+|	eventName	|	string	|	事件名称	|
+|	standard	|	bool	|	是否fb标准事件	|
+|	fbAliasName	|	string	|	fb标准事件名称,非标准事件则为""	|
+
+```java
+	/**
+	 * 游戏内打点上报
+	 *
+	 * @param context Aontext上下文
+	 * @param sdkEvent SDK埋点事件信息实体对象
+	 */
+	public void linkingEvent(Context context, SdkEvent sdkEvent)
+```
+
+- 示例
+
+```java
+	//fb标准事件
+	SdkEvent sdkEvent = new SdkEvent();
+	sdkEvent.setEventName("tutorial");
+	sdkEvent.setStandard(true);
+	sdkEvent.setFbAliasName("fb_mobile_tutorial_completion");
+	EYuanGame.getInstance().linkingEvent(this, sdkEvent);
+
+	//fb非标准事件
+	SdkEvent sdkEvent = new SdkEvent();
+	sdkEvent.setEventName("finish_marry");
+	sdkEvent.setStandard(false);
+	sdkEvent.setFbAliasName("");
+	EYuanGame.getInstance().linkingEvent(this, sdkEvent);
+```
+
+
+## 10)显示SDK退出框(选接)
+
+> 用户(玩家)按下返回键时调用,接入方需要实现Activity的onKeyDown,并判断keyCode为KeyEvent.KEYCODE_BACK时调用该接口
+
+```java
+	/**
+	 * 显示退出框
+	 *
+	 * @param activity Activity上下文
+	 * @param callback 退出回调对象
+	 */
+	public void openExitView(Activity activity, ICallback callback)
+```
+
+- 示例
+
+```java
+	//重写Activity的onKeyDown并判断KeyDown事件
+	@Override
+	public boolean onKeyDown(int keyCode, KeyEvent event) {
+		if (keyCode == KeyEvent.KEYCODE_BACK) {
+			EYuanGame.getInstance().openExitView(this, new ICallback() {
+				@Override
+				public void onResult(int code, String result) {
+					if (code == 0) {
+						//结束当前Activity
+						//如果要杀进程需要在onDestroy中处理,不然会不执行SDK的onDestroy方法
+						finish();
+					}
+				}
+			});
+			return true;
+		}
+		return super.onKeyDown(keyCode, event);
+	}
+
+	@Override
+	protected void onDestroy() {
+		super.onDestroy();
+		EYuanGame.getInstance().onDestroy(this);
+		//结束当前应用进程
+		System.exit(0);
+	}
+```
+
+
+## 11)获取SDK当前用户ID(选接)
+
+```java
+	/**
+	 * 获取当前SDK版本
+	 *
+	 * @return
+	 */
+	public String getCurrentUserId()
+```
+
+- 示例
+
+```java
+	EYuanGame.getInstance().getCurrentUserId();
+```
+
+
+## 12)获取SDK当前版本(选接)
+
+```java
+	/**
+	 * 获取当前SDK版本
+	 *
+	 * @return
+	 */
+	public String getCurrentSdkVersion()
+```
+
+- 示例
+
+```java
+	FlyFunGame.getInstance().getCurrentSdkVersion();
+```