diff --git a/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml b/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml new file mode 100644 index 0000000..7b1ce8c --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java b/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java new file mode 100644 index 0000000..ca159cc --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java @@ -0,0 +1,9 @@ +package com.unity3d.player; + +public class ChannelHelpers { + public static final String CHANNEL = "Flexion"; + + static void register() { + SDKManager.registerHelper(CHANNEL, new FlexionSDKHelper()); + } +} diff --git a/ExtraPluginCfgs/Android/flexion/ConfigManager.java b/ExtraPluginCfgs/Android/flexion/ConfigManager.java new file mode 100644 index 0000000..4d30160 --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/ConfigManager.java @@ -0,0 +1,28 @@ +package com.unity3d.player; + +public class ConfigManager { + // Common SDK parameters + public static int SDK_APPID = 20587; + public static String SDK_GAMEID = "20587"; + public static String SDK_PROJECTID = "20587"; + public static String SDK_CLOUDID = "128"; + public static String SDK_CLIENTID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20587.googleplay.FishingMaster"; + + public static String SDK_LOGIN_SERVER_URL = "https://128-hwsfsdk-sdk-online01.qijihdhk.com"; + + // FCM (anti-addiction system) + public static String FCM_NAMESPACE = "128"; + public static String FCM_IAM_HOST = "tcp://fcmtcp.tuyoo.com:3563"; + public static String FCM_ANTISERVERURL = "https://fcmapi.tuyoo.com"; + + // Unity Facade callback names + public static final String UNITY_FACADE_NAME = "TYSdkFacade"; + public static final String LOGIN_CALLBACK_FUNCTION_NAME = "LoginResult"; + public static final String LINKACCOUT_CALLBACK_FUNCTION_NAME = "LinkAccoutResult"; + public static final String CHANGELINK_CALLBACK_FUNCTION_NAME = "ChangeLinkAccountResult"; + public static final String CHECKLINK_CALLBACK_FUNCTION_NAME = "CheckLinkResult"; + public static final String PAY_CALLBACK_FUNCTION_NAME = "PayResult"; + public static final String PAY_TYPE_CALLBACK_FUNCTION_NAME = "SKUListResult"; + public static final String FCM_NOTICE_FUNCTION_NAME = "FCMCallback"; + public static final String FCM_REALNAME_CALLBACK_FUNCTION_NAME = "RealNameCallback"; +} diff --git a/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java b/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java new file mode 100644 index 0000000..bbe44ef --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java @@ -0,0 +1,231 @@ +package com.unity3d.player; + +import android.app.Activity; +import android.util.Log; + +import com.flexionmobile.ddpx.listener.ConnectionStateListener; +import com.flexionmobile.ddpx.listener.PurchasesUpdateListener; +import com.flexionmobile.ddpx.model.BillingResult; +import com.flexionmobile.ddpx.model.BillingResults; +import com.flexionmobile.ddpx.model.Purchase; +import com.flexionmobile.ddpx.model.ProductDetails; +import com.flexionmobile.ddpx.model.params.BillingFlowParams; +import com.flexionmobile.ddpx.model.params.ConsumeParams; +import com.flexionmobile.ddpx.model.params.QueryPurchasesParams; +import com.flexionmobile.ddpx.model.params.ProductDetailsParams; +import com.flexionmobile.fdk.FLX; + +import com.tuyoo.gamesdk.api.SDKAPI; +import com.tuyoo.gamesdk.api.SDKCallBack; +import com.tuyoo.gamesdk.model.InitParam; +import com.tuyoo.gamesdk.util.SDKLog; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.List; + +public class FlexionSDKHelper implements SDKManager.ISDKHelper { + private static final String TAG = "FlexionSDKHelper"; + private static BillingService billingService; + private static boolean billingConnected = false; + + private static final PurchasesUpdateListener purchasesListener = (billingResult, purchase) -> { + if (billingResult.getResponseCode() == BillingResults.ResultCode.PURCHASE_SUCCESS_CODE) { + if (purchase != null) handlePurchase(purchase); + } else if (billingResult.getResponseCode() == BillingResults.ResultCode.PURCHASE_USER_CANCELLED_CODE) { + sendPayCallback(1, "user_cancelled", null, null); + } else { + sendPayCallback(1, "purchase_failed_" + billingResult.getResponseCode(), null, null); + } + }; + + @Override + public void init(Activity activity) { + activity.runOnUiThread(() -> { + SDKAPI.getIns().lightModeEnable(); + try { + SDKAPI.getIns().init(new InitParam.Builder() + .withActivity(activity) + .withAppId(ConfigManager.SDK_APPID) + .withClientId(ConfigManager.SDK_CLIENTID) + .withServerUrl(ConfigManager.SDK_LOGIN_SERVER_URL) + .build()); + SDKAPI.getIns().onActivityStart(activity); + SDKAPI.getIns().onActivityResume(activity); + } catch (Exception e) { + Log.e(TAG, "TuYoo SDK init Exception: " + e); + } + + FLX.init(activity, (initCode, initMsg) -> { + Log.i(TAG, "FLX.init result=" + initCode); + if (initCode == 0) { + FLX.showFlexionScreens(activity, (screenCode, screenMsg) -> { + Log.i(TAG, "FLX.showFlexionScreens result=" + screenCode); + initBillingService(activity); + TYUnityActivity.setSdkInited(); + }); + } else { + Log.e(TAG, "FLX.init failed: " + initCode); + TYUnityActivity.setSdkInited(); + } + }); + }); + } + + @Override + public void pay(Activity activity, String productId, String productName, + String productCount, String prodorderId, String appInfo) { + Log.i(TAG, "pay: " + productId); + if (billingService == null || !billingConnected) { + sendPayCallback(1, "billing_not_ready", null, null); + return; + } + activity.runOnUiThread(() -> + billingService.launchBillingFlow(activity, + new BillingFlowParams(productId, "inapp", ""))); + } + + @Override + public void queryProducts() { + if (billingService == null || !billingConnected) { + sendExtensionError("billing_not_ready"); + return; + } + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("action", "ACTION_GET_SKU_DETAILS_LIST"); + } catch (JSONException e) { + throw new RuntimeException(e); + } + SDKAPI.getIns().thirdExtend(jsonObject.toString(), new SDKCallBack.Extend() { + @Override + public void callback(int code, String msg) { + if (code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS && msg != null) { + try { + JSONArray products = new JSONArray(msg); + List productIds = new java.util.ArrayList<>(); + for (int i = 0; i < products.length(); i++) { + JSONObject p = products.getJSONObject(i); + String pid = p.optString("productId", ""); + if (!pid.isEmpty()) productIds.add(pid); + } + queryProductDetails(productIds); + } catch (JSONException e) { + sendExtensionError("parse_error: " + e.getMessage()); + } + } else { + sendExtensionError("tuyoo_query_failed: " + msg); + } + } + }); + } + + // ---- Billing Infrastructure ---- + + private static void initBillingService(Activity activity) { + billingService = FLX.createBillingService(activity, purchasesListener); + billingService.startConnection(activity, new ConnectionStateListener() { + @Override + public void onBillingSetupFinished(BillingResult result) { + if (result.getResponseCode() == BillingResults.ResultCode.CONNECTION_SUCCESS_CODE) { + billingConnected = true; + queryPendingPurchases(); + } + } + @Override + public void onBillingServiceDisconnected() { + billingConnected = false; + } + }); + } + + private static void handlePurchase(Purchase purchase) { + if (purchase.getPurchaseState() == 0) { + sendPayCallback(0, "success", purchase.getPurchaseJson(), purchase.getSignature()); + billingService.consumeAsync( + new ConsumeParams(purchase.getToken()), + r -> Log.i(TAG, "Consume " + + (r.getResponseCode() == BillingResults.ResultCode.CONSUME_SUCCESS_CODE ? "ok" : "fail"))); + } else if (purchase.getPurchaseState() == 2) { + sendPayCallback(2, "pending", null, null); + } + } + + private static void queryPendingPurchases() { + if (billingService == null || !billingConnected) return; + billingService.queryPurchasesAsync( + new QueryPurchasesParams("inapp"), + (result, purchases) -> { + if (purchases != null) for (Purchase p : purchases) handlePurchase(p); + }); + } + + private static void queryProductDetails(List productIds) { + billingService.queryProductDetailsAsync( + new ProductDetailsParams("inapp", productIds), + (billingResult, productDetails) -> { + try { + JSONObject result = new JSONObject(); + if (billingResult.getResponseCode() == BillingResults.ResultCode.QUERY_PRODUCT_DETAILS_SUCCESS_CODE + && productDetails != null) { + JSONArray arr = new JSONArray(); + for (ProductDetails detail : productDetails) { + JSONObject item = new JSONObject(); + item.put("productId", detail.getId()); + item.put("ourProductId", detail.getId()); + item.put("title", detail.getTitle()); + item.put("description", detail.getDescription()); + item.put("price", detail.getPrice()); + item.put("price_amount_micros", detail.getPriceAmountMicros()); + item.put("price_currency_code", detail.getPriceCurrencyCode()); + item.put("type", detail.getType()); + arr.put(item); + } + result.put("code", 0); + result.put("respObj", arr.toString()); + } else { + result.put("code", 1); + result.put("thirdExtend_errStr", + "flexion_query_failed: " + billingResult.getDebugMessage()); + } + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); + } catch (JSONException e) { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); + } + }); + } + + // ---- Callbacks to Unity ---- + + private static void sendPayCallback(int code, String errStr, String purchaseJson, String signature) { + try { + JSONObject result = new JSONObject(); + result.put("code", code); + result.put("errStr", errStr != null ? errStr : ""); + if (purchaseJson != null) result.put("purchaseJson", purchaseJson); + if (signature != null) result.put("signature", signature); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_CALLBACK_FUNCTION_NAME, result.toString()); + } catch (JSONException e) { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_CALLBACK_FUNCTION_NAME, "{\"code\":1,\"errStr\":\"json_error\"}"); + } + } + + private static void sendExtensionError(String errStr) { + try { + JSONObject result = new JSONObject(); + result.put("code", 1); + result.put("thirdExtend_errStr", errStr); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); + } catch (JSONException e) { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); + } + } +} diff --git a/ExtraPluginCfgs/Android/flexion/Plugins/Android/tuyoosdk_1.0.0.aar b/ExtraPluginCfgs/Android/flexion/Plugins/Android/tuyoosdk_1.0.0.aar new file mode 100644 index 0000000..2fcfaf0 Binary files /dev/null and b/ExtraPluginCfgs/Android/flexion/Plugins/Android/tuyoosdk_1.0.0.aar differ diff --git a/ExtraPluginCfgs/Android/flexion/gradleTemplate.properties b/ExtraPluginCfgs/Android/flexion/gradleTemplate.properties new file mode 100644 index 0000000..cc49b2a --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/gradleTemplate.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M +org.gradle.parallel=true +unityStreamingAssets=**STREAMING_ASSETS** +# Android Resolver Properties Start +android.useAndroidX=true +android.enableJetifier=true +# Android Resolver Properties End + +android.suppressUnsupportedCompileSdk=35 + +**ADDITIONAL_PROPERTIES** diff --git a/ExtraPluginCfgs/Android/flexion/launcherTemplate.gradle b/ExtraPluginCfgs/Android/flexion/launcherTemplate.gradle new file mode 100644 index 0000000..2b518da --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/launcherTemplate.gradle @@ -0,0 +1,67 @@ +apply plugin: 'com.android.application' +// 临时注销掉,打完包之后就打开 +// apply plugin: 'com.google.gms.google-services' + +dependencies { + implementation project(':unityLibrary') + implementation(platform("com.google.firebase:firebase-bom:33.6.0")) + implementation("com.google.firebase:firebase-analytics") + } + +android { + namespace "**NAMESPACE**" + ndkPath "**NDKPATH**" + + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**SIGN** + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + } + }**PACKAGING_OPTIONS****PLAY_ASSET_PACKS****SPLITS** +**BUILT_APK_LOCATION** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP** diff --git a/ExtraPluginCfgs/Android/flexion/mainTemplate.gradle b/ExtraPluginCfgs/Android/flexion/mainTemplate.gradle new file mode 100644 index 0000000..b2dfd0a --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/mainTemplate.gradle @@ -0,0 +1,139 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +// Android Resolver Exclusions Start +android { + packagingOptions { + exclude ('/lib/armeabi/*' + '*') + exclude ('/lib/mips/*' + '*') + exclude ('/lib/mips64/*' + '*') + exclude ('/lib/x86/*' + '*') + exclude ('/lib/x86_64/*' + '*') + } +} +// Android Resolver Exclusions End +android { + namespace "com.unity3d.player" +} + +// Flexion 渠道专用:排除不需要的 AppsFlyer 模块 +// - purchase-connector: 基于 Google Play Billing,Flexion 不走 GP 计费,没用还增大包 +// 即使 Unity Android Resolver 下次又把 implementation 行写回来,这里的 exclude 也兜底排除 +configurations.all { + exclude group: 'com.appsflyer', module: 'purchase-connector' +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + api "com.android.support:support-v4:28.0.0" + api "com.android.support:appcompat-v7:28.0.0" + + api "com.google.code.gson:gson:2.8.6" + api "com.squareup.okio:okio:1.15.0" + api "com.squareup.okhttp3:okhttp:3.12.13" + api "com.squareup.retrofit2:retrofit:2.3.0" + api "com.squareup.retrofit2:converter-gson:2.2.0" + api "com.squareup.retrofit2:adapter-rxjava:2.1.0" + api "io.reactivex:rxandroid:1.2.1" + api "io.reactivex:rxjava:1.1.9" + + // Google Play In-App Review + implementation 'com.google.android.play:review:2.0.1' + implementation 'net.aihelp:android-aihelp-aar:5.3.+' + + implementation 'com.google.android.gms:play-services-auth:20.2.0' + // NOTE: Google Play BillingClient NOT included — Flexion SDK provides its own billing wrapper + // implementation('com.android.billingclient:billing:6.0.1') + + // Flexion SDK (includes wrapped billing) + implementation("com.flexionmobile:sdk:4.0.1") + + implementation 'com.google.android.gms:play-services-basement:18.2.0' + implementation 'androidx.fragment:fragment:1.3.6' + implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.41" + implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.41' + implementation 'androidx.core:core:1.8.0' + + implementation 'com.miui.referrer:homereferrer:1.0.0.6' + + implementation platform('com.google.firebase:firebase-bom:32.7.4') + implementation 'com.google.firebase:firebase-analytics' + + implementation('com.facebook.android:facebook-android-sdk:16.2.0') + + implementation 'com.google.android.play:asset-delivery:2.2.2' + + implementation "androidx.credentials:credentials:1.3.0" + implementation "androidx.credentials:credentials-play-services-auth:1.3.0" + implementation "com.google.android.libraries.identity.googleid:googleid:1.1.1" + + coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.2" + +// Android Resolver Dependencies Start + implementation 'com.android.installreferrer:installreferrer:2.1' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:7 + implementation 'com.applovin.mediation:facebook-adapter:[6.18.0.1]' // Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml:8 + implementation 'com.applovin.mediation:fyber-adapter:8.4.2.0' // Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml:4 + implementation 'com.applovin.mediation:google-adapter:[23.6.0.1]' // Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml:5 + implementation 'com.applovin.mediation:ironsource-adapter:8.6.1.0.0' // Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml:8 + implementation 'com.applovin.mediation:unityads-adapter:4.12.3.0' // Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml:4 + implementation 'com.applovin.mediation:vungle-adapter:7.4.2.2' // Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml:4 + implementation 'com.applovin:applovin-sdk:13.5.1' // Assets/MaxSdk/AppLovin/Editor/Dependencies.xml:4 + implementation 'com.appsflyer:af-android-sdk:6.17.3' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:5 + // Flexion: purchase-connector removed — Flexion does not use Google Play Billing. + // Also covered by top-level `configurations.all { exclude ... }` as a safety net. + // implementation 'com.appsflyer:purchase-connector:2.2.0' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:8 + implementation 'com.appsflyer:unity-wrapper:6.17.7' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:6 + implementation 'com.google.android.ump:user-messaging-platform:2.1.0' // Assets/MaxSdk/AppLovin/Editor/Dependencies.xml:5 +// Android Resolver Dependencies End +**DEPS**} + +// Android Resolver Exclusions Start +android { + packagingOptions { + exclude ('/lib/armeabi/*' + '*') + exclude ('/lib/mips/*' + '*') + exclude ('/lib/mips64/*' + '*') + exclude ('/lib/x86/*' + '*') + exclude ('/lib/x86_64/*' + '*') + } +} +// Android Resolver Exclusions End +android { + ndkPath "**NDKPATH**" + + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + coreLibraryDesugaringEnabled true + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/ExtraPluginCfgs/Android/flexion/settingsTemplate.gradle b/ExtraPluginCfgs/Android/flexion/settingsTemplate.gradle new file mode 100644 index 0000000..169416f --- /dev/null +++ b/ExtraPluginCfgs/Android/flexion/settingsTemplate.gradle @@ -0,0 +1,46 @@ +pluginManagement { + repositories { + **ARTIFACTORYREPOSITORY** + gradlePluginPortal() + google() + mavenCentral() + } +} + +include ':launcher', ':unityLibrary' +**INCLUDES** + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + **ARTIFACTORYREPOSITORY** + google() + mavenCentral() + + // Flexion SDK Maven Repository + maven { + url = uri("https://maven.pkg.github.com/FlexionSDK/JavaSDK") + credentials { + username = "FlexionSDK" + // Replace with your actual Flexion PAT from DropPoint + password = "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" + } + } + +// Android Resolver Repos Start + def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/") + maven { + url "https://android-sdk.is.com/" // Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml:8 + } + mavenLocal() +// Android Resolver Repos End + flatDir { + dirs "${project(':unityLibrary').projectDir}/libs" + } + + maven { + url "http://sdkck.tuyoo.com/artifactory/tuyoo-component/" + allowInsecureProtocol = true + } + } +} diff --git a/ExtraPluginCfgs/Android/googleplay/AndroidManifest.xml b/ExtraPluginCfgs/Android/googleplay/AndroidManifest.xml new file mode 100644 index 0000000..ebd9b2e --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtraPluginCfgs/Android/googleplay/ChannelHelpers.java b/ExtraPluginCfgs/Android/googleplay/ChannelHelpers.java new file mode 100644 index 0000000..c9cac26 --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/ChannelHelpers.java @@ -0,0 +1,9 @@ +package com.unity3d.player; + +public class ChannelHelpers { + public static final String CHANNEL = "GooglePlay"; + + static void register() { + // GooglePlay uses default behavior, no additional SDKHelper + } +} diff --git a/ExtraPluginCfgs/Android/googleplay/ConfigManager.java b/ExtraPluginCfgs/Android/googleplay/ConfigManager.java new file mode 100644 index 0000000..4d30160 --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/ConfigManager.java @@ -0,0 +1,28 @@ +package com.unity3d.player; + +public class ConfigManager { + // Common SDK parameters + public static int SDK_APPID = 20587; + public static String SDK_GAMEID = "20587"; + public static String SDK_PROJECTID = "20587"; + public static String SDK_CLOUDID = "128"; + public static String SDK_CLIENTID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20587.googleplay.FishingMaster"; + + public static String SDK_LOGIN_SERVER_URL = "https://128-hwsfsdk-sdk-online01.qijihdhk.com"; + + // FCM (anti-addiction system) + public static String FCM_NAMESPACE = "128"; + public static String FCM_IAM_HOST = "tcp://fcmtcp.tuyoo.com:3563"; + public static String FCM_ANTISERVERURL = "https://fcmapi.tuyoo.com"; + + // Unity Facade callback names + public static final String UNITY_FACADE_NAME = "TYSdkFacade"; + public static final String LOGIN_CALLBACK_FUNCTION_NAME = "LoginResult"; + public static final String LINKACCOUT_CALLBACK_FUNCTION_NAME = "LinkAccoutResult"; + public static final String CHANGELINK_CALLBACK_FUNCTION_NAME = "ChangeLinkAccountResult"; + public static final String CHECKLINK_CALLBACK_FUNCTION_NAME = "CheckLinkResult"; + public static final String PAY_CALLBACK_FUNCTION_NAME = "PayResult"; + public static final String PAY_TYPE_CALLBACK_FUNCTION_NAME = "SKUListResult"; + public static final String FCM_NOTICE_FUNCTION_NAME = "FCMCallback"; + public static final String FCM_REALNAME_CALLBACK_FUNCTION_NAME = "RealNameCallback"; +} diff --git a/ExtraPluginCfgs/Android/googleplay/Plugins/Android/tuyoosdk_1.0.0.aar b/ExtraPluginCfgs/Android/googleplay/Plugins/Android/tuyoosdk_1.0.0.aar new file mode 100644 index 0000000..6576bb4 Binary files /dev/null and b/ExtraPluginCfgs/Android/googleplay/Plugins/Android/tuyoosdk_1.0.0.aar differ diff --git a/ExtraPluginCfgs/Android/googleplay/gradleTemplate.properties b/ExtraPluginCfgs/Android/googleplay/gradleTemplate.properties new file mode 100644 index 0000000..cc49b2a --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/gradleTemplate.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M +org.gradle.parallel=true +unityStreamingAssets=**STREAMING_ASSETS** +# Android Resolver Properties Start +android.useAndroidX=true +android.enableJetifier=true +# Android Resolver Properties End + +android.suppressUnsupportedCompileSdk=35 + +**ADDITIONAL_PROPERTIES** diff --git a/ExtraPluginCfgs/Android/googleplay/launcherTemplate.gradle b/ExtraPluginCfgs/Android/googleplay/launcherTemplate.gradle new file mode 100644 index 0000000..31efa26 --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/launcherTemplate.gradle @@ -0,0 +1,66 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' + +dependencies { + implementation project(':unityLibrary') + implementation(platform("com.google.firebase:firebase-bom:33.6.0")) + implementation("com.google.firebase:firebase-analytics") + } + +android { + namespace "**NAMESPACE**" + ndkPath "**NDKPATH**" + + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**SIGN** + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + } + }**PACKAGING_OPTIONS****PLAY_ASSET_PACKS****SPLITS** +**BUILT_APK_LOCATION** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP** diff --git a/ExtraPluginCfgs/Android/googleplay/mainTemplate.gradle b/ExtraPluginCfgs/Android/googleplay/mainTemplate.gradle new file mode 100644 index 0000000..fa895c0 --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/mainTemplate.gradle @@ -0,0 +1,111 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +// Android Resolver Exclusions Start +android { + packagingOptions { + exclude ('/lib/armeabi/*' + '*') + exclude ('/lib/mips/*' + '*') + exclude ('/lib/mips64/*' + '*') + exclude ('/lib/x86/*' + '*') + exclude ('/lib/x86_64/*' + '*') + } +} +// Android Resolver Exclusions End +android { + namespace "com.unity3d.player" +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + api "com.android.support:support-v4:28.0.0" + api "com.android.support:appcompat-v7:28.0.0" + + api "com.google.code.gson:gson:2.8.6" + api "com.squareup.okio:okio:1.15.0" + api "com.squareup.okhttp3:okhttp:3.12.13" + api "com.squareup.retrofit2:retrofit:2.3.0" + api "com.squareup.retrofit2:converter-gson:2.2.0" + api "com.squareup.retrofit2:adapter-rxjava:2.1.0" + api "io.reactivex:rxandroid:1.2.1" + api "io.reactivex:rxjava:1.1.9" + + // Google Play In-App Review + implementation 'com.google.android.play:review:2.0.1' + implementation 'net.aihelp:android-aihelp-aar:5.3.+' + + implementation 'com.google.android.gms:play-services-auth:20.2.0' + implementation('com.android.billingclient:billing:7.0.0') + + implementation 'com.google.android.gms:play-services-basement:18.2.0' + implementation 'androidx.fragment:fragment:1.3.6' + implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.41" + implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.41' + implementation 'androidx.core:core:1.8.0' + + implementation 'com.miui.referrer:homereferrer:1.0.0.6' + + implementation platform('com.google.firebase:firebase-bom:34.6.0') + implementation 'com.google.firebase:firebase-analytics' + + implementation('com.facebook.android:facebook-android-sdk:16.2.0') + + implementation 'com.google.android.play:asset-delivery:2.2.2' + + implementation "androidx.credentials:credentials:1.3.0" + implementation "androidx.credentials:credentials-play-services-auth:1.3.0" + implementation "com.google.android.libraries.identity.googleid:googleid:1.1.1" + +// Android Resolver Dependencies Start + implementation 'com.android.installreferrer:installreferrer:2.1' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:7 + implementation 'com.applovin.mediation:facebook-adapter:[6.18.0.1]' // Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml:8 + implementation 'com.applovin.mediation:fyber-adapter:8.4.2.0' // Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml:4 + implementation 'com.applovin.mediation:google-adapter:[23.6.0.1]' // Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml:5 + implementation 'com.applovin.mediation:ironsource-adapter:8.6.1.0.0' // Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml:8 + implementation 'com.applovin.mediation:unityads-adapter:4.12.3.0' // Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml:4 + implementation 'com.applovin.mediation:vungle-adapter:7.4.2.2' // Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml:4 + implementation 'com.applovin:applovin-sdk:13.5.1' // Assets/MaxSdk/AppLovin/Editor/Dependencies.xml:4 + implementation 'com.appsflyer:af-android-sdk:6.17.3' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:5 + implementation 'com.appsflyer:purchase-connector:2.2.0' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:8 + implementation 'com.appsflyer:unity-wrapper:6.17.7' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:6 + implementation 'com.google.android.ump:user-messaging-platform:2.1.0' // Assets/MaxSdk/AppLovin/Editor/Dependencies.xml:5 + implementation 'com.tapjoy:tapjoy-android-unitybridge:14.5.0' // Packages/com.unity.package-offerwall/Editor/TJPluginDependencies.xml:10 +// Android Resolver Dependencies End +**DEPS**} + +android { + ndkPath "**NDKPATH**" + + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/ExtraPluginCfgs/Android/googleplay/settingsTemplate.gradle b/ExtraPluginCfgs/Android/googleplay/settingsTemplate.gradle new file mode 100644 index 0000000..d25174e --- /dev/null +++ b/ExtraPluginCfgs/Android/googleplay/settingsTemplate.gradle @@ -0,0 +1,38 @@ +pluginManagement { + repositories { + **ARTIFACTORYREPOSITORY** + gradlePluginPortal() + google() + mavenCentral() + } +} + +include ':launcher', ':unityLibrary' +**INCLUDES** + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + **ARTIFACTORYREPOSITORY** + google() + mavenCentral() +// Android Resolver Repos Start + def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/") + maven { + url "https://sdk.tapjoy.com/" // Packages/com.unity.package-offerwall/Editor/TJPluginDependencies.xml:9 + } + maven { + url "https://android-sdk.is.com/" // Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml:8 + } + mavenLocal() +// Android Resolver Repos End + flatDir { + dirs "${project(':unityLibrary').projectDir}/libs" + } + + maven { + url "http://sdkck.tuyoo.com/artifactory/tuyoo-component/" + allowInsecureProtocol = true + } + } +} diff --git a/ExtraPluginCfgs/Android/rustore/AndroidManifest.xml b/ExtraPluginCfgs/Android/rustore/AndroidManifest.xml new file mode 100644 index 0000000..2fcbc26 --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ExtraPluginCfgs/Android/rustore/ChannelHelpers.java b/ExtraPluginCfgs/Android/rustore/ChannelHelpers.java new file mode 100644 index 0000000..68706a9 --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/ChannelHelpers.java @@ -0,0 +1,9 @@ +package com.unity3d.player; + +public class ChannelHelpers { + public static final String CHANNEL = "Rustore"; + + static void register() { + // Rustore uses default behavior, no additional SDKHelper yet + } +} diff --git a/ExtraPluginCfgs/Android/rustore/ConfigManager.java b/ExtraPluginCfgs/Android/rustore/ConfigManager.java new file mode 100644 index 0000000..d5eb8a9 --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/ConfigManager.java @@ -0,0 +1,28 @@ +package com.unity3d.player; + +public class ConfigManager { + // Common SDK parameters + public static int SDK_APPID = 20587; + public static String SDK_GAMEID = "20587"; + public static String SDK_PROJECTID = "20587"; + public static String SDK_CLOUDID = "128"; + public static String SDK_CLIENTID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20587.rustore.FishingTravel"; + + public static String SDK_LOGIN_SERVER_URL = "https://128-hwsfsdk-sdk-online01.qijihdhk.com"; + + // FCM (anti-addiction system) + public static String FCM_NAMESPACE = "128"; + public static String FCM_IAM_HOST = "tcp://fcmtcp.tuyoo.com:3563"; + public static String FCM_ANTISERVERURL = "https://fcmapi.tuyoo.com"; + + // Unity Facade callback names + public static final String UNITY_FACADE_NAME = "TYSdkFacade"; + public static final String LOGIN_CALLBACK_FUNCTION_NAME = "LoginResult"; + public static final String LINKACCOUT_CALLBACK_FUNCTION_NAME = "LinkAccoutResult"; + public static final String CHANGELINK_CALLBACK_FUNCTION_NAME = "ChangeLinkAccountResult"; + public static final String CHECKLINK_CALLBACK_FUNCTION_NAME = "CheckLinkResult"; + public static final String PAY_CALLBACK_FUNCTION_NAME = "PayResult"; + public static final String PAY_TYPE_CALLBACK_FUNCTION_NAME = "SKUListResult"; + public static final String FCM_NOTICE_FUNCTION_NAME = "FCMCallback"; + public static final String FCM_REALNAME_CALLBACK_FUNCTION_NAME = "RealNameCallback"; +} diff --git a/ExtraPluginCfgs/Android/rustore/Plugins/Android/tuyoosdk_1.0.0.aar b/ExtraPluginCfgs/Android/rustore/Plugins/Android/tuyoosdk_1.0.0.aar new file mode 100644 index 0000000..6e24f7d Binary files /dev/null and b/ExtraPluginCfgs/Android/rustore/Plugins/Android/tuyoosdk_1.0.0.aar differ diff --git a/ExtraPluginCfgs/Android/rustore/gradleTemplate.properties b/ExtraPluginCfgs/Android/rustore/gradleTemplate.properties new file mode 100644 index 0000000..cc49b2a --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/gradleTemplate.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M +org.gradle.parallel=true +unityStreamingAssets=**STREAMING_ASSETS** +# Android Resolver Properties Start +android.useAndroidX=true +android.enableJetifier=true +# Android Resolver Properties End + +android.suppressUnsupportedCompileSdk=35 + +**ADDITIONAL_PROPERTIES** diff --git a/ExtraPluginCfgs/Android/rustore/launcherTemplate.gradle b/ExtraPluginCfgs/Android/rustore/launcherTemplate.gradle new file mode 100644 index 0000000..af21b33 --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/launcherTemplate.gradle @@ -0,0 +1,74 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' + +dependencies { + implementation project(':unityLibrary') + implementation(platform("com.google.firebase:firebase-bom:33.6.0")) + implementation("com.google.firebase:firebase-analytics") + } + +android { + namespace "**NAMESPACE**" + ndkPath "**NDKPATH**" + + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + applicationId '**APPLICATIONID**' + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + + // ↓↓↓ 这里放你的 VK ID 占位符 ↓↓↓ + manifestPlaceholders = [ + VKIDRedirectHost : "vk.ru", + VKIDRedirectScheme: "vk54432404", + VKIDClientID : "54432404", + VKIDClientSecret : "WD6BO0CwPXsKMaaFX8Qq" + ] + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**SIGN** + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + minifyEnabled **MINIFY_DEBUG** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + jniDebuggable true + } + release { + minifyEnabled **MINIFY_RELEASE** + proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG** + } + }**PACKAGING_OPTIONS****PLAY_ASSET_PACKS****SPLITS** +**BUILT_APK_LOCATION** + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } +}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP** diff --git a/ExtraPluginCfgs/Android/rustore/mainTemplate.gradle b/ExtraPluginCfgs/Android/rustore/mainTemplate.gradle new file mode 100644 index 0000000..3310dbe --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/mainTemplate.gradle @@ -0,0 +1,131 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +// Android Resolver Exclusions Start +android { + packagingOptions { + exclude ('/lib/armeabi/*' + '*') + exclude ('/lib/mips/*' + '*') + exclude ('/lib/mips64/*' + '*') + exclude ('/lib/x86/*' + '*') + exclude ('/lib/x86_64/*' + '*') + } +} +// Android Resolver Exclusions End +android { + namespace "com.unity3d.player" +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + api "com.android.support:support-v4:28.0.0" + api "com.android.support:appcompat-v7:28.0.0" + + api "com.google.code.gson:gson:2.8.6" + api "com.squareup.okio:okio:1.15.0" + api "com.squareup.okhttp3:okhttp:3.12.13" + api "com.squareup.retrofit2:retrofit:2.3.0" + api "com.squareup.retrofit2:converter-gson:2.2.0" + api "com.squareup.retrofit2:adapter-rxjava:2.1.0" + api "io.reactivex:rxandroid:1.2.1" + api "io.reactivex:rxjava:1.1.9" + + // Google Play In-App Review + implementation 'com.google.android.play:review:2.0.1' + implementation 'net.aihelp:android-aihelp-aar:5.3.+' + + implementation 'com.google.android.gms:play-services-auth:20.2.0' + implementation('com.android.billingclient:billing:6.0.1') + + implementation 'com.google.android.gms:play-services-basement:18.2.0' + implementation 'androidx.fragment:fragment:1.3.6' + implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.41" + implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.41' + implementation 'androidx.core:core:1.8.0' + + implementation 'com.miui.referrer:homereferrer:1.0.0.6' + + implementation platform('com.google.firebase:firebase-bom:32.7.4') + implementation 'com.google.firebase:firebase-analytics' + + implementation('com.facebook.android:facebook-android-sdk:16.2.0') + + implementation 'com.google.android.play:asset-delivery:2.2.2' + + implementation "androidx.credentials:credentials:1.3.0" + implementation "androidx.credentials:credentials-play-services-auth:1.3.0" + implementation "com.google.android.libraries.identity.googleid:googleid:1.1.1" + + + implementation(platform("ru.rustore.sdk:bom:2025.11.01")) + implementation("ru.rustore.sdk:pay") + implementation "ru.rustore.sdk:review:10.0.0" + implementation "com.vk.id:vkid:2.5.1" + coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.2" + +// Android Resolver Dependencies Start + implementation 'com.android.installreferrer:installreferrer:2.1' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:7 + implementation 'com.applovin.mediation:facebook-adapter:[6.18.0.1]' // Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml:8 + implementation 'com.applovin.mediation:fyber-adapter:8.4.2.0' // Assets/MaxSdk/Mediation/Fyber/Editor/Dependencies.xml:4 + implementation 'com.applovin.mediation:google-adapter:[23.6.0.1]' // Assets/MaxSdk/Mediation/Google/Editor/Dependencies.xml:5 + implementation 'com.applovin.mediation:ironsource-adapter:8.6.1.0.0' // Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml:8 + implementation 'com.applovin.mediation:unityads-adapter:4.12.3.0' // Assets/MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml:4 + implementation 'com.applovin.mediation:vungle-adapter:7.4.2.2' // Assets/MaxSdk/Mediation/Vungle/Editor/Dependencies.xml:4 + implementation 'com.applovin:applovin-sdk:13.5.1' // Assets/MaxSdk/AppLovin/Editor/Dependencies.xml:4 + implementation 'com.appsflyer:af-android-sdk:6.17.3' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:5 + implementation 'com.appsflyer:purchase-connector:2.2.0' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:8 + implementation 'com.appsflyer:unity-wrapper:6.17.7' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:6 + implementation 'com.google.android.ump:user-messaging-platform:2.1.0' // Assets/MaxSdk/AppLovin/Editor/Dependencies.xml:5 +// Android Resolver Dependencies End +**DEPS**} + +// Android Resolver Exclusions Start +android { + packagingOptions { + exclude ('/lib/armeabi/*' + '*') + exclude ('/lib/mips/*' + '*') + exclude ('/lib/mips64/*' + '*') + exclude ('/lib/x86/*' + '*') + exclude ('/lib/x86_64/*' + '*') + } +} +// Android Resolver Exclusions End +android { + ndkPath "**NDKPATH**" + + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + coreLibraryDesugaringEnabled true + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/ExtraPluginCfgs/Android/rustore/settingsTemplate.gradle b/ExtraPluginCfgs/Android/rustore/settingsTemplate.gradle new file mode 100644 index 0000000..10e312c --- /dev/null +++ b/ExtraPluginCfgs/Android/rustore/settingsTemplate.gradle @@ -0,0 +1,46 @@ +pluginManagement { + repositories { + **ARTIFACTORYREPOSITORY** + gradlePluginPortal() + google() + mavenCentral() + } +} + +include ':launcher', ':unityLibrary' +**INCLUDES** + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + **ARTIFACTORYREPOSITORY** + google() + mavenCentral() + + maven{ + url "https://artifactory-external.vkpartner.ru/artifactory/vkid-sdk-android/" + } + maven{ + url "https://artifactory-external.vkpartner.ru/artifactory/maven/" + } + maven{ + url "https://artifactory-external.vkpartner.ru/artifactory/vk-id-captcha/android/" + } + +// Android Resolver Repos Start + def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/") + maven { + url "https://android-sdk.is.com/" // Assets/MaxSdk/Mediation/IronSource/Editor/Dependencies.xml:8 + } + mavenLocal() +// Android Resolver Repos End + flatDir { + dirs "${project(':unityLibrary').projectDir}/libs" + } + + maven { + url "http://sdkck.tuyoo.com/artifactory/tuyoo-component/" + allowInsecureProtocol = true + } + } +} diff --git a/ExtraPluginCfgs/Android/switch-channel.sh b/ExtraPluginCfgs/Android/switch-channel.sh new file mode 100644 index 0000000..65f6116 --- /dev/null +++ b/ExtraPluginCfgs/Android/switch-channel.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# Usage: ./switch-channel.sh +# channel: googleplay | flexion | rustore +# +# 切换渠道后重新用 Unity 打 Android 包即可打出对应渠道的 APK。 +# 脚本会同步:AAR、Gradle 配置、AndroidManifest、Java 文件(ConfigManager、ChannelHelpers 等) + +CHANNEL=${1:-googleplay} +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +CHANNEL_DIR="$SCRIPT_DIR/$CHANNEL" +PROJ_DIR="$SCRIPT_DIR/../../sdk-intergration" + +TYSDK_PLUGINS="$PROJ_DIR/Packages/tysdk/Plugins/Android" +ASSETS_PLUGINS="$PROJ_DIR/Assets/Plugins/Android" + +# 校验渠道目录 +if [ ! -d "$CHANNEL_DIR" ]; then + echo "ERROR: Unknown channel '$CHANNEL'. Available: googleplay, flexion, rustore" + exit 1 +fi + +echo "=== Switching to channel: $CHANNEL ===" + +# 1. Sync channel AAR to tysdk package (only tuyoosdk, gasdk stays permanently) +echo "[AAR] Syncing tuyoosdk to $TYSDK_PLUGINS" +find "$TYSDK_PLUGINS" -maxdepth 1 -name "tuyoosdk_*.aar" -delete +cp "$CHANNEL_DIR/Plugins/Android/"*.aar "$TYSDK_PLUGINS/" 2>/dev/null + +# 2. Sync Gradle + Manifest to Assets/Plugins/Android +echo "[Config] Syncing gradle/manifest to $ASSETS_PLUGINS" +for f in "$CHANNEL_DIR"/*.gradle "$CHANNEL_DIR"/*.properties "$CHANNEL_DIR"/AndroidManifest.xml; do + [ -f "$f" ] && cp "$f" "$ASSETS_PLUGINS/" +done + +# 3. Sync Java files to tysdk package +echo "[Java] Syncing ConfigManager + ChannelHelpers to $TYSDK_PLUGINS" +for f in "$CHANNEL_DIR"/*.java; do + [ -f "$f" ] && cp "$f" "$TYSDK_PLUGINS/" +done + +echo "=== Done. Channel: $CHANNEL ===" +echo "" +echo "Next: Open Unity and build Android APK." diff --git a/sdk-intergration/Assets/Editor/ChannelBuildTool.cs b/sdk-intergration/Assets/Editor/ChannelBuildTool.cs new file mode 100644 index 0000000..02b8d86 --- /dev/null +++ b/sdk-intergration/Assets/Editor/ChannelBuildTool.cs @@ -0,0 +1,151 @@ +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +public class ChannelBuildTool +{ + public static readonly string[] SupportedChannels = { "GooglePlay", "Rustore", "Flexion" }; + + private const string ExtraCfgRoot = "../ExtraPluginCfgs/Android"; + private const string TysdkPlugins = "Packages/tysdk/Plugins/Android"; + private const string AssetsPlugins = "Assets/Plugins/Android"; + + private static readonly string[] GradleFiles = + { + "mainTemplate.gradle", + "launcherTemplate.gradle", + "settingsTemplate.gradle", + "gradleTemplate.properties", + "AndroidManifest.xml" + }; + + // ==================== Channel Switching ==================== + + private static void SwitchChannel(string channel) + { + var channelDir = channel.ToLower(); + var cfgDir = Path.Combine(ExtraCfgRoot, channelDir); + if (!Directory.Exists(cfgDir)) + { + Debug.LogError($"[ChannelSwitch] Channel config not found: {cfgDir}"); + return; + } + + Debug.Log($"[ChannelSwitch] Switching to {channel}..."); + + // 1. Sync AAR + var srcAarDir = Path.Combine(cfgDir, "Plugins/Android"); + if (Directory.Exists(srcAarDir)) + { + foreach (var oldAar in Directory.GetFiles(TysdkPlugins, "tuyoosdk_*.aar")) + File.Delete(oldAar); + foreach (var aar in Directory.GetFiles(srcAarDir, "*.aar")) + { + var dest = Path.Combine(TysdkPlugins, Path.GetFileName(aar)); + File.Copy(aar, dest, true); + Debug.Log($"[ChannelSwitch] AAR: {aar} → {dest}"); + } + } + + // 2. Clean up previous channel Java files + foreach (var oldJava in Directory.GetFiles(TysdkPlugins, "ChannelHelpers.java")) + File.Delete(oldJava); + foreach (var oldJava in Directory.GetFiles(TysdkPlugins, "*SDKHelper.java")) + File.Delete(oldJava); + var oldConfig = Path.Combine(TysdkPlugins, "ConfigManager.java"); + if (File.Exists(oldConfig)) File.Delete(oldConfig); + + // 3. Sync Gradle + Manifest + foreach (var fileName in GradleFiles) + { + var src = Path.Combine(cfgDir, fileName); + if (File.Exists(src)) + { + var dest = Path.Combine(AssetsPlugins, fileName); + File.Copy(src, dest, true); + Debug.Log($"[ChannelSwitch] Config: {src} → {dest}"); + } + } + + // 4. Sync channel Java files to tysdk package + foreach (var javaFile in Directory.GetFiles(cfgDir, "*.java")) + { + var fileName = Path.GetFileName(javaFile); + var dest = Path.Combine(TysdkPlugins, fileName); + File.Copy(javaFile, dest, true); + Debug.Log($"[ChannelSwitch] Java: {javaFile} → {dest}"); + } + + // 5. Set runtime channel + tysdk.ChannelConfig.SetChannel(channel); + + AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); + Debug.Log($"[ChannelSwitch] Done. Channel: {channel}"); + } + + // ==================== Build ==================== + + private static void BuildAndroidForChannel(string channel, bool debug) + { + SwitchChannel(channel); + + string fileName = debug ? $"tysdkTest_{channel}_debug.apk" : $"tysdkTest_{channel}.apk"; + string outPath = $"../Bin/{fileName}"; + var buildOptions = debug + ? BuildOptions.Development | BuildOptions.AllowDebugging | BuildOptions.WaitForPlayerConnection + : BuildOptions.None; + + var buildPlayerOptions = new BuildPlayerOptions + { + scenes = EditorBuildSettings.scenes.Select(x => x.path).ToArray(), + locationPathName = outPath, + target = BuildTarget.Android, + options = buildOptions, + }; + + Debug.Log($"[ChannelBuild] Building {channel} → {outPath}"); + var buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions); + + if (buildReport?.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded) + { + Debug.Log($"[ChannelBuild] Success: {Path.GetFullPath(outPath)}"); + AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); + } + else + { + Debug.LogError($"[ChannelBuild] Failed: {buildReport?.summary}"); + } + } + + // ==================== Menu: Switch Channel ==================== + + [MenuItem("Tools/Switch Channel/GooglePlay")] + public static void Switch_GooglePlay() => SwitchChannel("GooglePlay"); + + [MenuItem("Tools/Switch Channel/Rustore")] + public static void Switch_Rustore() => SwitchChannel("Rustore"); + + [MenuItem("Tools/Switch Channel/Flexion")] + public static void Switch_Flexion() => SwitchChannel("Flexion"); + + // ==================== Menu: Build ==================== + + [MenuItem("Tools/Build Android (Channel)/GooglePlay")] + public static void Build_GooglePlay() => BuildAndroidForChannel("GooglePlay", false); + + [MenuItem("Tools/Build Android (Channel)/GooglePlay Debug")] + public static void Build_GooglePlay_Debug() => BuildAndroidForChannel("GooglePlay", true); + + [MenuItem("Tools/Build Android (Channel)/Rustore")] + public static void Build_Rustore() => BuildAndroidForChannel("Rustore", false); + + [MenuItem("Tools/Build Android (Channel)/Rustore Debug")] + public static void Build_Rustore_Debug() => BuildAndroidForChannel("Rustore", true); + + [MenuItem("Tools/Build Android (Channel)/Flexion")] + public static void Build_Flexion() => BuildAndroidForChannel("Flexion", false); + + [MenuItem("Tools/Build Android (Channel)/Flexion Debug")] + public static void Build_Flexion_Debug() => BuildAndroidForChannel("Flexion", true); +} diff --git a/sdk-intergration/Assets/Editor/ChannelBuildTool.cs.meta b/sdk-intergration/Assets/Editor/ChannelBuildTool.cs.meta new file mode 100644 index 0000000..b39534e --- /dev/null +++ b/sdk-intergration/Assets/Editor/ChannelBuildTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7bad621141fb304caceb22ea91d7db3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java new file mode 100644 index 0000000..c9cac26 --- /dev/null +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java @@ -0,0 +1,9 @@ +package com.unity3d.player; + +public class ChannelHelpers { + public static final String CHANNEL = "GooglePlay"; + + static void register() { + // GooglePlay uses default behavior, no additional SDKHelper + } +} diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java.meta b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java.meta new file mode 100644 index 0000000..11a6de8 --- /dev/null +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 576805d2d0194634b8d235fd6837195e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java b/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java index a66a81f..4d30160 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java @@ -1,8 +1,7 @@ - package com.unity3d.player; public class ConfigManager { - //通用参数 + // Common SDK parameters public static int SDK_APPID = 20587; public static String SDK_GAMEID = "20587"; public static String SDK_PROJECTID = "20587"; @@ -11,14 +10,12 @@ public class ConfigManager { public static String SDK_LOGIN_SERVER_URL = "https://128-hwsfsdk-sdk-online01.qijihdhk.com"; - // 防沉迷 - nameSpace + // FCM (anti-addiction system) public static String FCM_NAMESPACE = "128"; - // 防沉迷 - 长连接服务地址+端口 public static String FCM_IAM_HOST = "tcp://fcmtcp.tuyoo.com:3563"; - // 防沉迷 - 防沉迷服务地址 public static String FCM_ANTISERVERURL = "https://fcmapi.tuyoo.com"; - + // Unity Facade callback names public static final String UNITY_FACADE_NAME = "TYSdkFacade"; public static final String LOGIN_CALLBACK_FUNCTION_NAME = "LoginResult"; public static final String LINKACCOUT_CALLBACK_FUNCTION_NAME = "LinkAccoutResult"; diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java.meta b/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java.meta index 2235402..c32496c 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java.meta +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java.meta @@ -7,7 +7,7 @@ PluginImporter: executionOrder: {} defineConstraints: [] isPreloaded: 0 - isOverridable: 0 + isOverridable: 1 isExplicitlyReferenced: 0 validateReferences: 1 platformData: diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java b/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java index e788c34..35adbd7 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java @@ -1,4 +1,3 @@ - package com.unity3d.player; import android.app.Activity; @@ -29,31 +28,71 @@ import com.tuyoo.gamesdk.api.SDKAPI; import com.tuyoo.gamesdk.api.SDKCallBack; import com.tuyoo.gamesdk.api.SDKWrapper; import com.tuyoo.gamesdk.api.TuYooClientID; -import com.tuyoo.gamesdk.event.EventBus; -import com.tuyoo.gamesdk.event.EventConsts; import com.tuyoo.gamesdk.event.data.PayEventData; -import com.tuyoo.gamesdk.event.data.WeixinShareData; import com.tuyoo.gamesdk.login.model.SnsInfo; import com.tuyoo.gamesdk.model.InitParam; import com.tuyoo.gamesdk.pay.model.PayType; import com.tuyoo.gamesdk.util.SDKLog; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; +import java.util.List; import java.util.Map; -import kotlinx.serialization.json.Json; - +/** + * Unified SDKManager for all channels (GooglePlay / Flexion / RuStore). + * C# passes the channel string via InitSDK(activity, channel); Java dispatches + * internally via switch. All login/link/GA/share logic is shared. + * Channel-specific behaviour is limited to: Init, Pay, thirdExtend, Review. + */ public class SDKManager { - private final static Handler handler = new Handler(Looper.getMainLooper()); + private static final Handler handler = new Handler(Looper.getMainLooper()); private static IGASDK gasdk; - private static final String TAG = com.unity3d.player.SDKManager.class.getSimpleName(); + private static final String TAG = SDKManager.class.getSimpleName(); private static String curType = TuYooClientID.tyGuest; - public static void InitSDK(Activity activity) - { + private static SnsInfo tmpSnsInfo; + private static String channel = "GooglePlay"; + + // Channel helper registry + public interface ISDKHelper { + void init(Activity activity); + void pay(Activity activity, String productId, String productName, + String productCount, String prodorderId, String appInfo); + void queryProducts(); + } + + private static final java.util.Map helperMap = new java.util.HashMap<>(); + private static ISDKHelper sdkHelper; + + public static void registerHelper(String ch, ISDKHelper helper) { + helperMap.put(ch, helper); + } + + // ------------------------------------------------------------------------- + // Init — with channel helper support + // ------------------------------------------------------------------------- + + public static void InitSDK(Activity activity, String ch) { + channel = ch != null ? ch : "GooglePlay"; + ChannelHelpers.register(); + if (!channel.equals(ChannelHelpers.CHANNEL)) { + Log.e(TAG, "Channel mismatch! Helpers=" + ChannelHelpers.CHANNEL + " expected=" + channel); + } + sdkHelper = helperMap.get(channel); + Log.i(TAG, "InitSDK channel=" + channel + " helper=" + (sdkHelper != null ? sdkHelper.getClass().getSimpleName() : "none")); + + if (sdkHelper != null) { + sdkHelper.init(activity); + } else { + initDefault(activity); + } + } + + private static void initDefault(Activity activity) { activity.runOnUiThread(() -> { SDKAPI.getIns().lightModeEnable(); try { @@ -67,11 +106,14 @@ public class SDKManager { SDKAPI.getIns().onActivityStart(activity); SDKAPI.getIns().onActivityResume(activity); } catch (Exception e) { - System.out.println("initSDK Exception " + e); + System.out.println("initSDK Exception " + e); } }); } + // ------------------------------------------------------------------------- + // Login / Callbacks (shared) + // ------------------------------------------------------------------------- public static void parseLoginInfo(int i, String s) { try { @@ -80,21 +122,21 @@ public class SDKManager { if (i == 0) { JSONObject serverResponse = new JSONObject(s); JSONObject userInfo = serverResponse.getJSONObject("result"); - result.put("loginData", userInfo ); + result.put("loginData", userInfo); } else { result.put("errStr", s); } - - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, result.toString()); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, result.toString()); } catch (Exception e) { - Log.e(TAG,"SDKManager-parseLoginInfo-Exception" + e); + Log.e(TAG, "SDKManager-parseLoginInfo-Exception" + e); SDKLog.e("SDKManager-parseLoginInfo-Exception" + e); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); } } - //登录回调-统一的回调方法(保持回调仅有一个,否则可能会出现多次回调的情况) - static SDKCallBack.Login mLogin = new SDKCallBack.Login() { + protected static SDKCallBack.Login mLogin = new SDKCallBack.Login() { @Override public void callback(int i, String s) { SDKLog.i("SDKCallBack.Login callback: " + i + " \n" + s); @@ -103,21 +145,22 @@ public class SDKManager { } }; - static SDKCallBack.Pay mPay = new SDKCallBack.Pay() { + protected static SDKCallBack.Pay mPay = new SDKCallBack.Pay() { @Override public void callback(int i, String s) { - SDKLog.i("SDKCallBack.Pay callback: " + i + " \n" + s); try { JSONObject result = new JSONObject(); result.put("code", i); result.put("respObj", s); result.put("errStr", s); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_CALLBACK_FUNCTION_NAME, result.toString()); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_CALLBACK_FUNCTION_NAME, result.toString()); } catch (Exception e) { - Log.e(TAG,"SDKManager-SDKCallBack.Pay-Exception" + e); + Log.e(TAG, "SDKManager-SDKCallBack.Pay-Exception" + e); SDKLog.e("SDKManager-SDKCallBack.Pay-Exception" + e); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); } } }; @@ -132,18 +175,15 @@ public class SDKManager { handler.post(() -> SDKAPI.getIns().loginByToken(token, mLogin)); } - public static String UnityLoginBySnsInfo() - { - if(tmpSnsInfo == null) - { - handler.post(() -> UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, "{\"code\":1}")); + public static String UnityLoginBySnsInfo() { + if (tmpSnsInfo == null) { + handler.post(() -> UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, "{\"code\":1}")); return ""; } - SDKLog.i("UnityLoginBySns : " + tmpSnsInfo); handler.post(() -> SDKAPI.getIns().loginBySnsInfo(tmpSnsInfo, mLogin)); return tmpSnsInfo.type; - } public static void UnityGetIdentityFun(String type) { @@ -161,15 +201,15 @@ public class SDKManager { handler.post(() -> SDKAPI.getIns().logout(type)); } - private static SnsInfo tmpSnsInfo; - public static void LinkAccount(String type, String userId) - { - SDKAPI.getIns().getSnsInfo(type, (snscode, snsInfo, snsmsg) ->{ - if(snscode == SDKCallBack.CODE_SUCCESS && snsInfo !=null) - { - SDKAPI.getIns().bindBySnsId(snsInfo, userId, (bindcode, bindmsg)->{ - if(bindcode == SDKCallBack.CODE_SUCCESS) - { + // ------------------------------------------------------------------------- + // Account linking (shared) + // ------------------------------------------------------------------------- + + public static void LinkAccount(String type, String userId) { + SDKAPI.getIns().getSnsInfo(type, (snscode, snsInfo, snsmsg) -> { + if (snscode == SDKCallBack.CODE_SUCCESS && snsInfo != null) { + SDKAPI.getIns().bindBySnsId(snsInfo, userId, (bindcode, bindmsg) -> { + if (bindcode == SDKCallBack.CODE_SUCCESS) { try { JSONObject result = new JSONObject(); result.put("code", bindcode); @@ -178,41 +218,28 @@ public class SDKManager { JSONObject serverResponse = new JSONObject(bindmsg); JSONObject userInfo = serverResponse.getJSONObject("result"); result.put("loginData", userInfo); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, result.toString()); - + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, result.toString()); } catch (JSONException e) { String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } - } - else if(bindcode == SDKCallBack.CODE_FAILED) - { - try - { + } else if (bindcode == SDKCallBack.CODE_FAILED) { + try { JSONObject bindMsgObj = new JSONObject(bindmsg); JSONObject bindMsgResult = bindMsgObj.getJSONObject("result"); int bindMsgResultCode = bindMsgResult.getInt("code"); - if(bindMsgResultCode == 4) - { - SDKAPI.getIns().checkSnsInfo(snsInfo, (checkcode, checkMsg ) -> { - if(checkcode != SDKCallBack.CODE_SUCCESS) - { + if (bindMsgResultCode == 4) { + SDKAPI.getIns().checkSnsInfo(snsInfo, (checkcode, checkMsg) -> { + if (checkcode != SDKCallBack.CODE_SUCCESS) { Log.w(TAG, checkMsg); String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); return; } try { - //{ - // "track":"128:10:28654792:1766569516", - // "result":{ - // "bindInfo":"{ // \"guest\": \"guest:devidmap3:bf12a8a28b663548e368ebe8742368b7\", // \"google\": \"google:118182347502471840780\" // }", - // "code":0, - // "info":"user exist", - // "exist":1, - // "userId":10030 - // } - // } tmpSnsInfo = snsInfo; JSONObject checkMsgObj = new JSONObject(checkMsg); JSONObject checkResult = checkMsgObj.getJSONObject("result"); @@ -222,165 +249,143 @@ public class SDKManager { callbackMsg.put("code", -1); callbackMsg.put("userId", bindUserId); callbackMsg.put("bindInfo", bindInfo); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, callbackMsg.toString()); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, + callbackMsg.toString()); } catch (JSONException e) { Log.i(TAG, e.toString()); String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } }); - } - else - { + } else { Log.w(TAG, bindmsg); String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } - } - catch (JSONException e) - { + } catch (JSONException e) { Log.i(TAG, e.toString()); String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } - } - else - { + } else { Log.w(TAG, bindmsg); String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } }); - } - else - { + } else { Log.w(TAG, snsmsg); String msg = "{\"code\":1, \"userId\": 0}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } }); } - - public static void CleanLinkTmpSnsInfo() - { - tmpSnsInfo = null; - } - public static void ChangeLinkAccount(String type, int oldUserId, int newUserId) - { - if(tmpSnsInfo == null) - { + public static void CleanLinkTmpSnsInfo() { + tmpSnsInfo = null; + } + + public static void ChangeLinkAccount(String type, int oldUserId, int newUserId) { + if (tmpSnsInfo == null) { String msg = "{\"code\":1, \"userId\": 0, \"msg\": \"tmpSnsInfo is null\"}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); return; } SDKAPI.getIns().unbindBySnsId(tmpSnsInfo, String.valueOf(oldUserId), (unbindCode, unbindMsg) -> { Log.i(TAG, "unbindBySnsId code: " + unbindCode + " msg: " + unbindMsg); - if(unbindCode == SDKCallBack.CODE_SUCCESS) - { + if (unbindCode == SDKCallBack.CODE_SUCCESS) { SDKAPI.getIns().bindBySnsId(tmpSnsInfo, String.valueOf(newUserId), (bindCode, bindMsg) -> { Log.i(TAG, "bindBySnsId code: " + bindCode + " msg: " + bindMsg); - if(bindCode == SDKCallBack.CODE_SUCCESS) - { + if (bindCode == SDKCallBack.CODE_SUCCESS) { String msg = "{\"code\":0, \"userId\": " + newUserId + ", \"msg\": \"success\"}"; - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); - } - else - { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); + } else { String msg = String.format("{\"code\":-1, \"userId\": 0, \"msg\": \"%s\"}", bindMsg); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); } }); - } - else - { + } else { String msg = String.format("{\"code\":1, \"userId\": 0, \"msg\": \"%s\"}", unbindMsg); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); - } - }); - } - - public static void LinkCheck(String type) - { - SDKAPI.getIns().getSnsInfo(type, (code, snsInfo, msg) -> { - if(code == SDKCallBack.CODE_SUCCESS && snsInfo != null){ - SDKAPI.getIns().checkSnsInfo(snsInfo, (code1, msg1) -> { - if(code1 == SDKCallBack.CODE_SUCCESS && !TextUtils.isEmpty(msg1)){ - try { - JSONObject jsonObject = new JSONObject(msg1).optJSONObject("result"); - //返回信息中code为0时表示服务端查询成功,exit为1表示此渠道用户信息已产生过途游账号,可直接进行登录,exit为0表示此渠道用户信息未产生过途游账号,可以进行绑定 - if(jsonObject.optString("code").equals("0") - && jsonObject.optString("exist").equals("0")){ - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "0"); - } - else - { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "1"); - } - } catch (JSONException e) { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "-1"); - e.printStackTrace(); - } - } - else - { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "-1"); - } - }); - } - else - { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "-1"); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); } }); } - public static void UnityKnow(String productId, String productName, String productCount, String prodorderId, String appInfo) { + public static void LinkCheck(String type) { + SDKAPI.getIns().getSnsInfo(type, (code, snsInfo, msg) -> { + if (code == SDKCallBack.CODE_SUCCESS && snsInfo != null) { + SDKAPI.getIns().checkSnsInfo(snsInfo, (code1, msg1) -> { + if (code1 == SDKCallBack.CODE_SUCCESS && !TextUtils.isEmpty(msg1)) { + try { + JSONObject jsonObject = new JSONObject(msg1).optJSONObject("result"); + if (jsonObject.optString("code").equals("0") + && jsonObject.optString("exist").equals("0")) { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "0"); + } else { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "1"); + } + } catch (JSONException e) { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "-1"); + e.printStackTrace(); + } + } else { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "-1"); + } + }); + } else { + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.CHECKLINK_CALLBACK_FUNCTION_NAME, "-1"); + } + }); + } + + // ------------------------------------------------------------------------- + // Payment — channel dispatch + // ------------------------------------------------------------------------- + + public static void UnityKnow(String productId, String productName, String productCount, + String prodorderId, String appInfo) { + if (sdkHelper != null) { + sdkHelper.pay(UnityPlayer.currentActivity, productId, productName, productCount, prodorderId, appInfo); + return; + } SDKLog.i("UnityKnow : " + productId); HashMap extraInfo = new HashMap(); extraInfo.put("appInfo", appInfo); - SDKAPI.getIns().pay(productId, productName, productCount, Integer.parseInt(ConfigManager.SDK_GAMEID), mPay, prodorderId, extraInfo); + SDKAPI.getIns().pay(productId, productName, productCount, + Integer.parseInt(ConfigManager.SDK_GAMEID), mPay, prodorderId, extraInfo); } - public static void UnityGetKnowTypeList(String productId) - { - Log.e(TAG,"UnityGetKnowTypeList:" + productId ); - final PayEventData.PayReq mPayReq = new PayEventData.PayReq(); - mPayReq.prodId = productId; - SDKAPI.getIns().charge(mPayReq , new SDKCallBack.Base1() { - @Override - public void callback(int code, String msg) { - SDKLog.e("====> code= " + code + " msg= " + msg); - try { - JSONObject result = new JSONObject(); - result.put("code", code); - if(code == 0){ - result.put("respObj", msg); - }else { - result.put("errStr", msg); - } - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); - } catch (Exception e) { - SDKLog.e("SDKManager-UnityGetKnowTypeList-Exception" + e); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); - } - } - }); - } - - public static void UnityKnowNew(String productId, String productPrice, String productName, String productCount, String prodorderId, String appInfo, String ptype) - { + public static void UnityKnowNew(String productId, String productPrice, String productName, + String productCount, String prodorderId, String appInfo, + String ptype) { + if (sdkHelper != null) { + sdkHelper.pay(UnityPlayer.currentActivity, productId, productName, productCount, prodorderId, appInfo); + return; + } PayEventData.PayData payData = new PayEventData.PayData(); final PayEventData.PayReq mPayReq = new PayEventData.PayReq(); mPayReq.prodId = productId; mPayReq.prodPrice = productPrice; mPayReq.prodName = productName; mPayReq.prodCount = productCount; - // 此字段与服务端回调接口内的appInfo不对应,与orderId相对应 mPayReq.appInfo = prodorderId; HashMap map = new HashMap(); - // 此字段(appInfo)可用于传递透传信息(此信息与服务端回调接口内的appInfo相对应) map.put("appInfo", appInfo); mPayReq.extra = map; payData.payReq = mPayReq; @@ -389,41 +394,56 @@ public class SDKManager { SDKAPI.getIns().payNew(payData, payType, mPay); } + // ------------------------------------------------------------------------- + // thirdExtend — with channel helper support + // ------------------------------------------------------------------------- - public static void thirdExtend() - { - Log.e(TAG,"====>java thirdExtend"); + public static void thirdExtend() { + if (sdkHelper != null) { + sdkHelper.queryProducts(); + return; + } + defaultThirdExtend(); + } + + private static void defaultThirdExtend() { + Log.e(TAG, "====>java thirdExtend"); JSONObject jsonObject = new JSONObject(); try { - jsonObject.put("action","ACTION_GET_SKU_DETAILS_LIST"); + jsonObject.put("action", "ACTION_GET_SKU_DETAILS_LIST"); } catch (JSONException e) { throw new RuntimeException(e); } SDKAPI.getIns().thirdExtend(jsonObject.toString(), new SDKCallBack.Extend() { - @Override public void callback(int code, String msg) { - - Log.e(TAG,"====>thirdExtend code= " + code + " msg= " + msg ); + @Override + public void callback(int code, String msg) { + Log.e(TAG, "====>thirdExtend code= " + code + " msg= " + msg); try { - //获取成功,msg即为对应的json字符串 JSONObject result = new JSONObject(); result.put("code", code); - if(code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS){ + if (code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS) { result.put("respObj", msg); - }else { - Log.e(TAG,"获取商品列表失败啦:" + msg); + } else { + Log.e(TAG, "thirdExtend failed: " + msg); result.put("thirdExtend_errStr", msg); } - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); } catch (Exception e) { - SDKLog.e("SDKManager-UnityGetKnowTypeList-Exception" + e); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); + SDKLog.e("SDKManager-thirdExtend-Exception" + e); + UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, + ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); } } }); } - private static IGASDK GetGameGa(){ - if(gasdk == null){ + // ------------------------------------------------------------------------- + // GA (shared) + // ------------------------------------------------------------------------- + + protected static IGASDK GetGameGa() { + if (gasdk == null) { GAConfiguration.Builder builder = new GAConfiguration.Builder() .withBaseUrl(BaseUrl.INTERNATIONAL) .withContext(SDKWrapper.getInstance().getContext()) @@ -435,82 +455,61 @@ public class SDKManager { return gasdk; } - public static void SetGaUserInfo(String userId) - { - Log.e(TAG,"SetGaUserInfo : " + userId); + public static void SetGaUserInfo(String userId) { + Log.e(TAG, "SetGaUserInfo : " + userId); SDKLog.i("SetGaUserInfo : " + userId); GetGameGa().setUserId(userId); } - public static void SetGaCommonInfo(String SetGaCommonInfo) - { - Log.e(TAG,"SetGaCommonInfo : " + SetGaCommonInfo); + public static void SetGaCommonInfo(String SetGaCommonInfo) { + Log.e(TAG, "SetGaCommonInfo : " + SetGaCommonInfo); SDKLog.i("SetGaCommonInfo : " + SetGaCommonInfo); Gson gson = new Gson(); - Map map = gson.fromJson(SetGaCommonInfo, new TypeToken>(){}.getType()); + Map map = gson.fromJson(SetGaCommonInfo, + new TypeToken>() {}.getType()); for (String key : map.keySet()) { - System.out.println("Key = " + key + ", Value = " + map.get(key)); - if(!TextUtils.isEmpty(key) && map.get(key) != null){ + if (!TextUtils.isEmpty(key) && map.get(key) != null) { GetGameGa().addCommonParameter(key, map.get(key).toString()); } } } - public static void GAReportParams(int type, String eventstr, String paramstr) - { + public static void GAReportParams(int type, String eventstr, String paramstr) { ParamsBuilder paramsBuilder = ParamsBuilder.newInstance(); Gson gson = new Gson(); - Map map = gson.fromJson(paramstr, new TypeToken>(){}.getType()); + Map map = gson.fromJson(paramstr, + new TypeToken>() {}.getType()); for (String key : map.keySet()) { - if(!TextUtils.isEmpty(key) && map.get(key) != null){ + if (!TextUtils.isEmpty(key) && map.get(key) != null) { paramsBuilder.append(key, map.get(key).toString()); } } -// GA_TRACK = 1, //默认类型 -// GA_CION = 2, //金流相关事件 -// GA_PAY = 3, //支付相关事件 -// GA_GAME = 4, //游戏行为 -// GA_LOGIN = 5, //登录注册相关事件 -// GA_PUSH = 6, //推送相关事件 -// GA_ADBOX = 7, //adbox相关事件 -// GA_PREFORMANCE = 8, //性能上报相关事件 -// GA_SDK = 9, //SDK相关事件 -// GA_ABTest = 10, //abtest相关事件 - - switch (type) - { - case 2: - GetGameGa().track(EventType.COIN , eventstr, paramsBuilder); - break; - case 3: - GetGameGa().track(EventType.PAY , eventstr, paramsBuilder); - break; - case 4: - GetGameGa().track(EventType.GAME , eventstr, paramsBuilder); - break; - case 5: - GetGameGa().track(EventType.LOGIN , eventstr, paramsBuilder); - break; - case 6: - GetGameGa().track(EventType.PUSH , eventstr, paramsBuilder); - break; - case 7: - GetGameGa().track(EventType.ADBOX , eventstr, paramsBuilder); - break; - case 8: - GetGameGa().track(EventType.PREFORMANCE , eventstr, paramsBuilder); - break; - case 9: - GetGameGa().track(EventType.SDK , eventstr, paramsBuilder); - break; - default: - GetGameGa().track(EventType.TRACK , eventstr, paramsBuilder); - break; + switch (type) { + case 2: GetGameGa().track(EventType.COIN, eventstr, paramsBuilder); break; + case 3: GetGameGa().track(EventType.PAY, eventstr, paramsBuilder); break; + case 4: GetGameGa().track(EventType.GAME, eventstr, paramsBuilder); break; + case 5: GetGameGa().track(EventType.PAY, eventstr, paramsBuilder); break; + case 6: GetGameGa().track(EventType.PUSH, eventstr, paramsBuilder); break; + case 7: GetGameGa().track(EventType.ADBOX, eventstr, paramsBuilder); break; + case 8: GetGameGa().track(EventType.PREFORMANCE, eventstr, paramsBuilder); break; + case 9: GetGameGa().track(EventType.SDK, eventstr, paramsBuilder); break; + default: GetGameGa().track(EventType.TRACK, eventstr, paramsBuilder); break; } } - public static void Review() - { + // ------------------------------------------------------------------------- + // Review — channel dispatch + // ------------------------------------------------------------------------- + + public static void Review() { + if ("Rustore".equals(channel)) { + RuStoreReview(); + } else { + GooglePlayReview(); + } + } + + private static void GooglePlayReview() { ReviewManager manager = ReviewManagerFactory.create(SDKWrapper.getInstance().getContext()); Task request = manager.requestReviewFlow(); request.addOnCompleteListener(reqTask -> { @@ -519,16 +518,59 @@ public class SDKManager { Activity activity = UnityPlayer.currentActivity; manager.launchReviewFlow(activity, reviewInfo); } else { - @ReviewErrorCode int reviewErrorCode = ((ReviewException) request.getException()).getErrorCode(); - Log.e(TAG,"Review Error code: " + reviewErrorCode); + @ReviewErrorCode int reviewErrorCode = + ((ReviewException) request.getException()).getErrorCode(); + Log.e(TAG, "Review Error code: " + reviewErrorCode); } }); } - public static void FBShareLink(String title, String content, String url) - { - Log.e(TAG,"FBShareLink : " + title + " " + content + " " + url); + // RuStore two-step review + public interface ReviewResultCallback { + void onReviewSuccess(JSONObject result); + void onReviewError(int code, String msg); + } + public static void RequestRustoreReView(ReviewResultCallback callback) { + JSONObject json = new JSONObject(); + try { json.put("action", "ACTION_REQUEST_REVIEW"); } catch (JSONException e) { throw new RuntimeException(e); } + SDKAPI.getIns().thirdExtend(json.toString(), (code, msg) -> { + Log.e(TAG, "RequestRustoreReView code=" + code + " msg=" + msg); + try { + JSONObject result = new JSONObject(); + result.put("code", code); + if (code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS) { + if (callback != null) callback.onReviewSuccess(result); + } else { + result.put("thirdExtend_errStr", msg); + if (callback != null) callback.onReviewError(code, msg); + } + } catch (Exception e) { + SDKLog.e("RequestRustoreReView Exception: " + e); + } + }); + } + + public static void LaunchRustoreView() { + JSONObject json = new JSONObject(); + try { json.put("action", "ACTION_LAUNCH_REVIEW"); } catch (JSONException e) { throw new RuntimeException(e); } + SDKAPI.getIns().thirdExtend(json.toString(), (code, msg) -> + Log.e(TAG, "LaunchRustoreView code=" + code + " msg=" + msg)); + } + + public static void RuStoreReview() { + RequestRustoreReView(new ReviewResultCallback() { + @Override public void onReviewSuccess(JSONObject result) { LaunchRustoreView(); } + @Override public void onReviewError(int code, String msg) { } + }); + } + + // ------------------------------------------------------------------------- + // Facebook / Messenger share (shared) + // ------------------------------------------------------------------------- + + public static void FBShareLink(String title, String content, String url) { + Log.e(TAG, "FBShareLink : " + title + " " + content + " " + url); if (ShareDialog.canShow(ShareLinkContent.class)) { Activity activity = UnityPlayer.currentActivity; ShareDialog dialog = new ShareDialog(activity); @@ -537,30 +579,22 @@ public class SDKManager { .setContentUrl(Uri.parse(url)) .build(); dialog.show(linkContent); - } - else - { + } else { Log.e(TAG, "FBShareDialog can not show"); } } - public static void MessengerShareLink(String title, String content, String url) - { - Log.e(TAG,"MessengerShareLink : " + title + " " + content + " " + url); + public static void MessengerShareLink(String title, String content, String url) { + Log.e(TAG, "MessengerShareLink : " + title + " " + content + " " + url); if (MessageDialog.canShow(ShareLinkContent.class)) { Activity activity = UnityPlayer.currentActivity; ShareLinkContent linkContent = new ShareLinkContent.Builder() .setQuote(content) .setContentUrl(Uri.parse(url)) .build(); - MessageDialog.show(activity,linkContent); - } - else - { + MessageDialog.show(activity, linkContent); + } else { Log.e(TAG, "Messenger ShareDialog can not show"); } } - } - - diff --git a/sdk-intergration/Packages/tysdk/Runtime/AppRequestReview.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/AppRequestReview.cs.meta index ee2bc2e..0db9bb1 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/AppRequestReview.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/AppRequestReview.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b4630fc5c78457748a2f763ac5168df6 +guid: 1f7e4cbb67a383441bd126c06021a072 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/sdk-intergration/Packages/tysdk/Runtime/ChannelConfig.cs b/sdk-intergration/Packages/tysdk/Runtime/ChannelConfig.cs new file mode 100644 index 0000000..66a873b --- /dev/null +++ b/sdk-intergration/Packages/tysdk/Runtime/ChannelConfig.cs @@ -0,0 +1,18 @@ +namespace tysdk +{ + public static class ChannelConfig + { + public static string Channel { get; private set; } = "GooglePlay"; + + public static string PayType => Channel switch + { + "Rustore" => "rustore.global.app", + "Flexion" => "flexion.global.app", + _ => "googleiab.global.app" + }; + + public static int LoginTimeoutSeconds => Channel == "Rustore" ? 120 : 30; + + public static void SetChannel(string channel) { Channel = channel; } + } +} diff --git a/sdk-intergration/Packages/tysdk/Runtime/ChannelConfig.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/ChannelConfig.cs.meta new file mode 100644 index 0000000..9aa37f7 --- /dev/null +++ b/sdk-intergration/Packages/tysdk/Runtime/ChannelConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6dcc4e666f5907a47b1843de49da6f67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSDKCallbackManager.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSDKCallbackManager.cs.meta index 2b55df6..610c444 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSDKCallbackManager.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSDKCallbackManager.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 292a655e788d84d34aac4f83c57706ff +guid: cca93fc1d8dde744a86aff3c3a1b73ed MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkCoreModel.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkCoreModel.cs new file mode 100644 index 0000000..449977f --- /dev/null +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkCoreModel.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; + +namespace tysdk +{ + // TYSdkFacade 的登录/链接/ATT 等方法要依赖这些 POCO。 + + public enum EAccoutType + { + hwGoogle, + hwFacebook, + hwGuest, + hwVkid, + Apple, + none + } + + public class LoginInfo + { + public bool isSuccess; + public int userId; + public string StrUserId => userId.ToString(); + public string msg; + public int code; + } + + public class LinkResult + { + // 0: success, 1: fail, -1 exists + public int code; + // when success and fail userId is current user + // when exists userId is 0 + public int userId; + // not none when exists + public Dictionary bindInfo; + } + + public class ChangeLinkResult + { + public int code; + public int userId; + public string msg; + } + + public class LinkCheckInfo + { + public int code; + } + + public class ATTInfo + { + public bool isAccepted; + } +} diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkCoreModel.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSdkCoreModel.cs.meta new file mode 100644 index 0000000..d907638 --- /dev/null +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkCoreModel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2d36f2094aa5783423ab1ef40a88ccbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs index 33a8f38..4915b97 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs @@ -34,14 +34,20 @@ namespace tysdk } } - private static Dictionary accoutTypeMap = new Dictionary(){ + private static Dictionary accoutTypeMap = new Dictionary() + { {"google", EAccoutType.hwGoogle}, {"fb", EAccoutType.hwFacebook}, {"tyGuest", EAccoutType.hwGuest}, {"ios13", EAccoutType.Apple}, - {AccountString.hwVkid, EAccoutType.hwVkid} + {"vk.global.app", EAccoutType.hwVkid}, }; + public static void AddAccoutType(string key, EAccoutType value) + { + accoutTypeMap[key] = value; + } + private static EAccoutType ConvertAccoutType(string accountType) { if (accoutTypeMap.ContainsKey(accountType)) @@ -102,10 +108,11 @@ namespace tysdk } } - private static AccountInfo _accountInfo; - public static AccountInfo TYAccountInfo => _accountInfo; - + // ================== Singleton ================== private static TYSdkFacade _instance; + public static AccountInfo TYAccountInfo => _accountInfo; + protected static AccountInfo _accountInfo; + public static TYSdkFacade Instance { get @@ -118,26 +125,27 @@ namespace tysdk return _instance; } } + + public static string Channel => ChannelConfig.Channel; + + private int LoginTimeoutSeconds => ChannelConfig.LoginTimeoutSeconds; + + // ================== Init ================== public void Init() { #if UNITY_ANDROID UnityBridgeFunc.InitSDK(); #endif - } - /*================================================ - _ _ / \ ___ ___ ___ _ _ _ __ | |_ / _ \ / __/ __/ _ \| | | | '_ \| __| / ___ \ (_| (_| (_) | |_| | | | | |_ /_/ \_\___\___\___/ \__,_|_| |_|\__| - =================================================*/ - public static bool IsLoggedIn => _accountInfo != null; public void Logout() @@ -154,7 +162,7 @@ namespace tysdk public async Task Login(EAccoutType accoutType) { -#if UNITY_EDITOR +#if UNITY_EDITOR await Task.Yield(); var deviceId = UnityEngine.Device.SystemInfo.deviceUniqueIdentifier.Split('-')[0].Substring(0, 8); @@ -172,25 +180,25 @@ namespace tysdk }; #elif UNITY_ANDROID || UNITY_IOS - var task = TYSDKCallbackManager.Instance.RegisterCallback(TimeSpan.FromSeconds(30)); + var task = TYSDKCallbackManager.Instance.RegisterCallback(TimeSpan.FromSeconds(LoginTimeoutSeconds)); UnityBridgeFunc.UnityLogin(accoutType); try { - var loginInfo = await task; - if(loginInfo.isSuccess) - { - _accountInfo.channel = accoutType; - _accountInfo.AddLinkedAccount(accoutType); - _accountInfo.Save(); - } - return loginInfo; + var loginInfo = await task; + if (loginInfo.isSuccess) + { + _accountInfo.channel = accoutType; + _accountInfo.AddLinkedAccount(accoutType); + _accountInfo.Save(); + } + return loginInfo; } - catch(Exception e) + catch (Exception e) { - Debug.LogWarning($"[TYSdkFacade] Login failed: {e}"); - return new LoginInfo(){isSuccess = false}; + Debug.LogWarning($"[TYSdkFacade] Login failed: {e}"); + return new LoginInfo() { isSuccess = false }; } #endif } @@ -219,7 +227,7 @@ namespace tysdk return new LoginInfo() { isSuccess = false }; } } - + public async Task LoginBySns() { Debug.Log("[TYSdkFacade] LoginBySns"); @@ -304,18 +312,17 @@ namespace tysdk UnityBridgeFunc.SetGaUserInfo(strUserId); } - #if UNITY_EDITOR public async Task LinkAccount(EAccoutType accoutType) { await Task.Delay(300); - return new LinkResult(){code = 1}; + return new LinkResult() { code = 1 }; } #elif UNITY_IOS || UNITY_ANDROID - public async Task LinkAccount(EAccoutType accoutType) + public async Task LinkAccount(EAccoutType accoutType) { - if (_accountInfo == null) return new LinkResult(){ code = 1}; - if (_accountInfo.linkedAccout.Contains(accoutType)) return new LinkResult(){ code = 0}; + if (_accountInfo == null) return new LinkResult() { code = 1 }; + if (_accountInfo.linkedAccout.Contains(accoutType)) return new LinkResult() { code = 0 }; var task = TYSDKCallbackManager.Instance.RegisterCallback(TimeSpan.FromMinutes(1)); UnityBridgeFunc.LinkAccount(accoutType); @@ -337,6 +344,7 @@ namespace tysdk return new LinkResult() { code = 1 }; } } +#endif public void LinkAccoutResult(string message) { @@ -359,7 +367,7 @@ namespace tysdk } TYSDKCallbackManager.Instance.TryTriggerCallback(result); } -#endif + public void CleanLinkTempSnSInfo() { UnityBridgeFunc.CleanLinkTmpSnsInfo(); @@ -367,6 +375,10 @@ namespace tysdk public async Task ChangeLinkAccount(EAccoutType accoutType, int oldUserId, int newUserId) { +#if UNITY_EDITOR + await Task.Delay(300); + return new ChangeLinkResult() { code = 1 }; +#else var task = TYSDKCallbackManager.Instance.RegisterCallback(TimeSpan.FromSeconds(30)); UnityBridgeFunc.ChangeLinkAccount(accoutType, oldUserId, newUserId); try @@ -388,6 +400,7 @@ namespace tysdk { CleanLinkTempSnSInfo(); } +#endif } public void ChangeLinkAccountResult(string message) @@ -402,14 +415,6 @@ namespace tysdk TYSDKCallbackManager.Instance.TryTriggerCallback(result); } - /// - /// 检查是否已经绑定 - /// - /// 1 已经绑定 - /// 0 未绑定 - /// -1 失败 - /// - /// public async Task LinkCheck(EAccoutType accoutType) { if (_accountInfo == null) return false; @@ -435,7 +440,7 @@ namespace tysdk return result.code == 1; } - catch(Exception e) + catch (Exception e) { Debug.LogWarning($"[TYSdkFacade] CheckLinkResult error: {e}"); return false; @@ -457,7 +462,6 @@ namespace tysdk IConfig config = GContext.container.Resolve(); var tyurl = config.Get("AGG_SERVER", defaultTyurl); - string tycs = tyurl == defaultTyurl ? "https://hwcsh.tygameworld.com/template/appCancel/note.html" : @@ -479,23 +483,12 @@ namespace tysdk string uid = $"uid={_accountInfo.userId}"; list.Add(uid); - string roleid = "roleid=0"; - list.Add(roleid); - - string gameid = "gameid=20587"; - list.Add(gameid); - - string cloudid = "cloudid=128"; - list.Add(cloudid); - - string gamename = "gamename=FishingTravel"; - list.Add(gamename); - - string certification = "certification=0"; - list.Add(certification); - - string ischannel = "ischannel=1"; - list.Add(ischannel); + list.Add("roleid=0"); + list.Add("gameid=20587"); + list.Add("cloudid=128"); + list.Add("gamename=FishingTravel"); + list.Add("certification=0"); + list.Add("ischannel=1"); string tysdktoken = $"tysdktoken={_accountInfo.token}"; list.Add(tysdktoken); @@ -505,7 +498,6 @@ namespace tysdk string listStr = string.Join("&", list.ToArray()); string sign = listStr + "csh-api-6dfa879490a249be9fbc92e97e4d898d-api-csh"; - //对sign进行MD5加密 string signMd5 = CalculateMD5Hash(sign); string url = $"{tycs}?{listStr}&sign={signMd5}&isAbroad=1&lan=en"; Debug.Log($"[TYSdkFacade:Signout] url \n{url}"); @@ -514,25 +506,16 @@ namespace tysdk private string CalculateMD5Hash(string input) { - // Create a new instance of the MD5CryptoServiceProvider object. MD5 md5Hasher = MD5.Create(); - - // Convert the input string to a byte array and compute the hash. byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); - // Create a new Stringbuilder to collect the bytes - // and create a string. StringBuilder sBuilder = new StringBuilder(); - - // Loop through each byte of the hashed data - // and format each one as a hexadecimal string. for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } - - // Return the hexadecimal string. return sBuilder.ToString(); } } -} \ No newline at end of file + +} diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs.meta index 815482f..6241818 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: db12db58fbcc54046aa4dac203cd4971 +guid: f2fa4b960a2b4594d80ea8b8caa2912d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs index ab20568..5d4c0c6 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs @@ -4,17 +4,17 @@ using UnityEngine; namespace tysdk { - public partial class TYSdkFacade : MonoBehaviour + public partial class TYSdkFacade { /*================================================ - _ _____ _____ + _ _____ _____ / \|_ _|_ _| - / _ \ | | | | - / ___ \| | | | - /_/ \_\_| |_| - - =================================================*/ + / _ \ | | | | + / ___ \| | | | + /_/ \_\_| |_| + + =================================================*/ public bool IsAttAccepted() { @@ -25,25 +25,25 @@ namespace tysdk { #if UNITY_EDITOR || UNITY_ANDROID await Task.Yield(); - - return new ATTInfo(){isAccepted = true}; + return new ATTInfo() { isAccepted = true }; #elif UNITY_IOS - var task = tysdk.TYSDKCallbackManager.Instance.RegisterCallback(); + var task = TYSDKCallbackManager.Instance.RegisterCallback(); UnityBridgeFunc.RequestATT(); - try{ - return await task; - } - catch(Exception e) + try { - Debug.LogWarning(e.Message); - return new ATTInfo(){isAccepted = false}; + return await task; + } + catch (Exception e) + { + Debug.LogWarning(e.Message); + return new ATTInfo() { isAccepted = false }; } #endif } public void RequestATTResult(string r) { - TYSDKCallbackManager.Instance.TryTriggerCallback(new ATTInfo(){isAccepted = r == "1"}); + TYSDKCallbackManager.Instance.TryTriggerCallback(new ATTInfo() { isAccepted = r == "1" }); } } } diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs.meta index b5393ce..8701df9 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_ATT.cs.meta @@ -1,3 +1,11 @@ -fileFormatVersion: 2 -guid: 8f92075f5f98490ca94ae4984ac0aa21 -timeCreated: 1722855901 \ No newline at end of file +fileFormatVersion: 2 +guid: 280d33ff6fcb3a342ab9683a01841b78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs index dfc9de6..74d4128 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs @@ -2,14 +2,14 @@ using UnityEngine; namespace tysdk { - public partial class TYSdkFacade : MonoBehaviour + public partial class TYSdkFacade { /*================================================ - _____ _ _____ _ + _____ _ _____ _ | ____|_ _____ _ __ | |_ |_ _| __ __ _ ___| | __ | _| \ \ / / _ \ '_ \| __| | || '__/ _` |/ __| |/ / - | |___ \ V / __/ | | | |_ | || | | (_| | (__| < + | |___ \ V / __/ | | | |_ | || | | (_| | (__| < |_____| \_/ \___|_| |_|\__| |_||_| \__,_|\___|_|\_\ =================================================*/ @@ -21,18 +21,18 @@ namespace tysdk #endif } } - + public enum GATrackType { - GA_TRACK = 1, //默认类型 - GA_CION = 2, //金流相关事件 - GA_PAY = 3, //支付相关事件 - GA_GAME = 4, //游戏行为 - GA_LOGIN = 5, //登录注册相关事件 - GA_PUSH = 6, //推送相关事件 - GA_ADBOX = 7, //adbox相关事件 - GA_PREFORMANCE = 8, //性能上报相关事件 - GA_SDK = 9, //SDK相关事件 - GA_ABTest = 10, //abtest相关事件 + GA_TRACK = 1, + GA_CION = 2, + GA_PAY = 3, + GA_GAME = 4, + GA_LOGIN = 5, + GA_PUSH = 6, + GA_ADBOX = 7, + GA_PREFORMANCE = 8, + GA_SDK = 9, + GA_ABTest = 10, } } diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs.meta index 8c496d6..5ca4433 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_GA.cs.meta @@ -1,3 +1,11 @@ -fileFormatVersion: 2 -guid: 18459dcf8d5a40dc80ffae5333a6b0c9 -timeCreated: 1722855439 \ No newline at end of file +fileFormatVersion: 2 +guid: aa58ede4826973c4bbe3a5ebfdcd4b43 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs index 3e14a70..a877cbe 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs @@ -8,32 +8,30 @@ using System.Text; namespace tysdk { - public partial class TYSdkFacade : MonoBehaviour + public partial class TYSdkFacade { /*================================================ - ____ _ - | _ \ __ _ _ _ _ __ ___ ___ _ __ | |_ + ____ _ + | _ \ __ _ _ _ _ __ ___ ___ _ __ | |_ | |_) / _` | | | | '_ ` _ \ / _ \ '_ \| __| - | __/ (_| | |_| | | | | | | __/ | | | |_ + | __/ (_| | |_| | | | | | | __/ | | | |_ |_| \__,_|\__, |_| |_| |_|\___|_| |_|\__| - |___/ + |___/ =================================================*/ private bool _payFirstNegativeHandled; - //public async Task Pay(string prodId, string prodPrice, string prodName, int count, string pType, string price_amount_micros =null) public async Task Pay(SKUDetail prod, int count, float usdprice, JObject purchaseInfo) { if (!IsLoggedIn) return new PaymentInfo() { code = "-1", msg = "未登录" }; var orderId = System.Guid.NewGuid().ToString(); - if(purchaseInfo == null) + if (purchaseInfo == null) purchaseInfo = new JObject(); string extraInfo = purchaseInfo.ToString(Newtonsoft.Json.Formatting.None); - //to base64 extraInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes(extraInfo)); Debug.Log("[TYSdk] extraInfo: " + extraInfo); var prodId = prod.ProdID; @@ -57,14 +55,13 @@ namespace tysdk return result; #elif UNITY_ANDROID - var pType = "googleiab.global.app"; + var pType = ChannelConfig.PayType; var task = TYSDKCallbackManager.Instance.RegisterCallback(TimeSpan.FromSeconds(30)); try { - //UnityBridgeFunc.UnityKnow(prodId, prodName, count.ToString(), orderId, extraInfo); - UnityBridgeFunc.UnityKnowNew(prodId, prodPrice, prodName, count.ToString(), orderId, extraInfo,pType); + UnityBridgeFunc.UnityKnowNew(prodId, prodPrice, prodName, count.ToString(), orderId, extraInfo, pType); var result = await task; result.count = count; @@ -108,7 +105,6 @@ namespace tysdk #endif } - //支付的回调 public void PayResult(string json) { Debug.Log("[TYSdkFacade] pay callback:" + json); @@ -116,7 +112,7 @@ namespace tysdk var result = new PaymentInfo(); result.code = jresult["code"].ToString(); result.msg = jresult["errStr"].ToString(); - if(result.code == "-1") + if (result.code == "-1") { if (!_payFirstNegativeHandled) { @@ -133,12 +129,11 @@ namespace tysdk TYSDKCallbackManager.Instance.TryTriggerCallback(result); } - // Get Pay list public async Task GetSKUList() { if (!IsLoggedIn) return new ProductListInfo() { code = -1, msg = "未登录" }; -#if UNITY_EDITOR +#if UNITY_EDITOR await Task.Yield(); var result = new ProductListInfo(); @@ -151,7 +146,6 @@ namespace tysdk #endif } - //商品列表的回调 public void SKUListResult(string json) { Debug.Log("[TYSdkFacade] GetSKUList callback"); @@ -174,7 +168,3 @@ namespace tysdk } } } - - - - diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs.meta index 2909847..c79618b 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkFacade_Pay.cs.meta @@ -1,3 +1,11 @@ -fileFormatVersion: 2 -guid: 41b6dc16dbab43388317bf9ff032cdca -timeCreated: 1722855703 \ No newline at end of file +fileFormatVersion: 2 +guid: e05900a4aa124d746bfe9c15328fd0e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs index 1494627..9022bec 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs @@ -1,62 +1,14 @@ - using System.Collections.Generic; using System.Linq; +using Newtonsoft.Json; namespace tysdk { - public enum EAccoutType - { - hwGoogle, - hwFacebook, - hwGuest, - hwVkid, - Apple, - none - } - - public static class AccountString - { - public const string hwVkid = "vk.global.app"; - } - - - public class LoginInfo - { - public bool isSuccess; - public int userId; - public string StrUserId => userId.ToString(); - public string msg; - public int code; - } - - public class LinkResult - { - // 0: success, 1: fail, -1 exists - public int code; - // when success and fail userId is current user - // when exists userId is 0 - public int userId; - // not none when exists - public Dictionary bindInfo; - } - - public class ChangeLinkResult - { - public int code; - public int userId; - public string msg; - } - - public class LinkCheckInfo - { - public int code; - } - public class PaymentInfo { public bool isSuccessFromSdk => code == "0"; public bool isSuccess => isSuccessFromSdk && confirmed; - private bool confirmed {get; set;} = false; + private bool confirmed { get; set; } = false; public int count; public string orderId; public string productId; @@ -65,21 +17,26 @@ namespace tysdk public string code; public string msg; + // Flexion: purchase.getOriginalJson(), used by server for RSA signature verification + public string purchaseJson; + // Flexion: purchase.getSignature(), used by server for RSA signature verification + public string signature; + public bool Check(string orderId, string productId) { confirmed = orderId == this.orderId && productId == this.productId; - if(!confirmed) + if (!confirmed) UnityEngine.Debug.LogWarning("[TYSdk Pay] order not confirmed"); return confirmed; } public override string ToString() { - return Newtonsoft.Json.JsonConvert.SerializeObject(this); + return JsonConvert.SerializeObject(this); } } - + public class ProductListInfo { public int code = 1; @@ -103,7 +60,6 @@ namespace tysdk products = prodList; } #endif - } #if UNITY_IOS @@ -124,7 +80,7 @@ namespace tysdk public override string ToString() { - return Newtonsoft.Json.JsonConvert.SerializeObject(this); + return JsonConvert.SerializeObject(this); } } #else @@ -132,28 +88,30 @@ namespace tysdk { public string description; public string ourProductId; + public string productId; public string price; public string price_amount_micros; public string price_currency_code; - public string productId; public string title; public string type; - public override string ToString() - { - return Newtonsoft.Json.JsonConvert.SerializeObject(this); - } + // RuStore specific + public string currency; + public string price_amount; - public string ProdPriceStr => price; - public float ProdPrice => float.Parse(price_amount_micros) / 1000000; + public string ProdPriceStr => ChannelConfig.Channel == "Rustore" + ? $"₽{ProdPrice}" + : price; + public float ProdPrice => ChannelConfig.Channel == "Rustore" + ? float.Parse(price) / 100 + : float.Parse(price_amount_micros) / 1000000; public string ProdID => ourProductId; public string ProdKey => productId; + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } #endif - - - public class ATTInfo - { - public bool isAccepted; - } } diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs.meta index 0de9afb..9bcb0e7 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b94c8e87cc23b4053a4cbf592ff14db3 +guid: ebabed604bd06e44099073951d667658 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs b/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs index f21ef15..864bd67 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs @@ -4,64 +4,46 @@ using UnityEngine; namespace tysdk { - public static class UnityBridgeFunc { -#if UNITY_EDITOR || UNITY_ANDROID - private static string EAccountTypeToStr(EAccoutType accountType) - { - return accountType == EAccoutType.hwVkid ? AccountString.hwVkid : accountType.ToString(); - } +#if UNITY_EDITOR + public static void InitSDK() { } -#endif -#if UNITY_EDITOR - //初始化sdk - public static void InitSDK(){} - - //更新登录支付域名 - public static void UnityResetServerUrl(string url){} + public static void UnityResetServerUrl(string url) { } - //登录 - public static void UnityLoginByTokenFun(string token){} + public static void UnityLoginByTokenFun(string token) { } public static string UnityLoginBySnsInfoFun() => null; - public static void UnityLogin(EAccoutType accoutType){} + public static void UnityLogin(EAccoutType accoutType) { } public static void CleanLinkTmpSnsInfo() { } - - public static void LinkAccount(EAccoutType accoutType){} - public static void ChangeLinkAccount(EAccoutType accoutType, int oldUserId, int newUserId){} - public static void LinkCheck(EAccoutType accoutType){} + public static void LinkAccount(EAccoutType accoutType) { } + public static void ChangeLinkAccount(EAccoutType accoutType, int oldUserId, int newUserId) { } + public static void LinkCheck(EAccoutType accoutType) { } - public static void UnityGetIdentityFun(string type){} + public static void UnityGetIdentityFun(string type) { } + + public static void UnityLogOutByChannel(EAccoutType accoutType) { } - public static void UnityLogOutByChannel(EAccoutType accoutType){} - //支付new public static void UnityKnowNew(string productId, string productPrice, string productName, string productCount, string prodorderId, string appInfo, string pType) { } - //支付 - public static void UnityKnow(String productId, String productName, String productCount, - String prodorderId, String appInfo) {} - - //获取商品列表 + String prodorderId, String appInfo) { } + public static void GetSKUList() { } - //打点 - public static void SetGaUserInfo(string userId){} - + public static void SetGaUserInfo(string userId) { } - public static void SetGaCommonInfo(string SetGaCommonInfo){} + public static void SetGaCommonInfo(string SetGaCommonInfo) { } - public static void GAReportParams(int type, string eventstr, string paramstr){} + public static void GAReportParams(int type, string eventstr, string paramstr) { } - //ATT - public static void RequestATT(){} + public static void RequestATT() { } - public static int GetATT() {return 1;} + public static int GetATT() { return 1; } public static void Review() { } @@ -72,30 +54,34 @@ namespace tysdk private static string SDK_CLASS = "com.unity3d.player.SDKManager"; - //初始化sdk - public static void InitSDK(){ - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + private static string EAccountTypeToStr(EAccoutType accoutType) + { + return accoutType == EAccoutType.hwVkid ? "vk.global.app" : accoutType.ToString(); + } + + public static void InitSDK() + { + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { - using(var activityCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + using (var activityCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { var activity = activityCls.GetStatic("currentActivity"); - sdkManager.CallStatic("InitSDK", activity); + sdkManager.CallStatic("InitSDK", activity, ChannelConfig.Channel); } } } - //更新登录支付域名 + public static void UnityResetServerUrl(string url) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("UnityResetServerUrl", url); } } - //登录 public static void UnityLoginByTokenFun(string token) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("UnityLoginByTokenFun", token); } @@ -103,7 +89,7 @@ namespace tysdk public static String UnityLoginBySnsInfoFun() { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { return sdkManager.CallStatic("UnityLoginBySnsInfo"); } @@ -112,16 +98,15 @@ namespace tysdk public static void UnityLogin(EAccoutType accoutType) { var accountInfo = EAccountTypeToStr(accoutType); - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { - sdkManager.CallStatic("UnityLogin",accountInfo); + sdkManager.CallStatic("UnityLogin", accountInfo); } - } public static void UnityGetIdentityFun(string type) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("UnityGetIdentityFun", type); } @@ -129,9 +114,8 @@ namespace tysdk public static void UnityLogOutByChannel(EAccoutType accoutType) { - var accountInfo = EAccountTypeToStr(accoutType); - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("UnityLogOutByChannel", accountInfo); } @@ -140,20 +124,18 @@ namespace tysdk public static void LinkAccount(EAccoutType accoutType) { string userId = TYSdkFacade.TYAccountInfo.strUserId; + var accountInfo = EAccountTypeToStr(accoutType); using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { - var accountInfo = EAccountTypeToStr(accoutType); - sdkManager.CallStatic("LinkAccount",accountInfo,userId); + sdkManager.CallStatic("LinkAccount", accountInfo, userId); } } - public static void CleanLinkTmpSnsInfo(){ - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + public static void CleanLinkTmpSnsInfo() + { + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { - using(var activityCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) - { - sdkManager.CallStatic("CleanLinkTmpSnsInfo"); - } + sdkManager.CallStatic("CleanLinkTmpSnsInfo"); } } @@ -169,47 +151,42 @@ namespace tysdk public static void LinkCheck(EAccoutType accoutType) { var accountInfo = EAccountTypeToStr(accoutType); - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { - sdkManager.CallStatic("LinkCheck",accountInfo); + sdkManager.CallStatic("LinkCheck", accountInfo); } } - //支付new public static void UnityKnowNew(string productId, string productPrice, string productName, - string productCount, string prodorderId, string appInfo,string pType) + string productCount, string prodorderId, string appInfo, string pType) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("UnityKnowNew", productId, productPrice, productName, - productCount, prodorderId, appInfo,pType); + productCount, prodorderId, appInfo, pType); } } - //支付 - - public static void UnityKnow(String productId, String productName, String productCount, String prodorderId, String appInfo) + public static void UnityKnow(String productId, String productName, String productCount, String prodorderId, String appInfo) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { - sdkManager.CallStatic("UnityKnow", productId, productName, productCount, prodorderId, appInfo); + sdkManager.CallStatic("UnityKnow", productId, productName, productCount, prodorderId, appInfo); } } - //获取商品列表 public static void GetSKUList() { UnityEngine.Debug.Log("UnityBridgeFunc.GetSKUList()"); - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("thirdExtend"); } } - //打点 public static void SetGaUserInfo(string userId) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("SetGaUserInfo", userId); } @@ -217,7 +194,7 @@ namespace tysdk public static void SetGaCommonInfo(string SetGaCommonInfo) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("SetGaCommonInfo", SetGaCommonInfo); } @@ -225,38 +202,35 @@ namespace tysdk public static void GAReportParams(int type, string eventstr, string paramstr) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("GAReportParams", type, eventstr, paramstr); } } + public static void RequestATT() { } - //ATT - public static void RequestATT(){} - - public static int GetATT() {return 1;} + public static int GetATT() { return 1; } public static void Review() { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("Review"); - // sdkManager.CallStataic("RuStoreReview"); } } - public static void FBShareLink(string title, string content, string url) + public static void FBShareLink(string title, string content, string url) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("FBShareLink", title, content, url); } } - public static void MessengerShareLink(string title, string content, string url) + public static void MessengerShareLink(string title, string content, string url) { - using(var sdkManager = new AndroidJavaClass(SDK_CLASS)) + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) { sdkManager.CallStatic("MessengerShareLink", title, content, url); } @@ -264,11 +238,9 @@ namespace tysdk #elif UNITY_IOS - //更新登录支付域名 [DllImport("__Internal")] public static extern void UnityResetServerUrl(string url); - //登录 [DllImport("__Internal")] public static extern void UnityLoginByTokenFun(string token); @@ -284,7 +256,6 @@ namespace tysdk return string.Empty; } - // Convert C string to C# string string result = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr); return result ?? string.Empty; } @@ -375,7 +346,6 @@ namespace tysdk } } - [DllImport("__Internal")] private static extern void LinkGoogle(int userId); [DllImport("__Internal")] private static extern void LinkFacebook(int userId); [DllImport("__Internal")] private static extern void LinkApple(int userId); @@ -393,31 +363,25 @@ namespace tysdk case EAccoutType.hwFacebook: IsLinkedFacebook(); break; - case EAccoutType.Apple: IsLinkedApple(); break; } } - [DllImport("__Internal")] public static extern void CleanLinkTmpSnsInfo(); [DllImport("__Internal")] private static extern void IsLinkedGoogle(); [DllImport("__Internal")] private static extern void IsLinkedFacebook(); [DllImport("__Internal")] private static extern void IsLinkedApple(); - - //支付 [DllImport("__Internal")] public static extern void UnityKnow(string userId, string productId, string productPrice, string productName, string productCount, string prodorderId, string appInfo); - //获取商品列表 [DllImport("__Internal")] public static extern void GetSKUList(); - //打点 [DllImport("__Internal")] public static extern void SetGaUserInfo(string userId); @@ -427,7 +391,6 @@ namespace tysdk [DllImport("__Internal")] public static extern void GAReportParams(int type, string eventstr, string paramstr); - //ATT [DllImport("__Internal")] public static extern void RequestATT(); diff --git a/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs.meta b/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs.meta index bc5c42d..6928691 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs.meta +++ b/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 16335dd05906d48bf81e297920aecf31 +guid: e24b3b915d94468419519a81bb69e269 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/sdk-intergration/Packages/tysdk/Runtime/tysdk.asmdef b/sdk-intergration/Packages/tysdk/Runtime/tysdk.asmdef index 96408a6..ca03381 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/tysdk.asmdef +++ b/sdk-intergration/Packages/tysdk/Runtime/tysdk.asmdef @@ -14,4 +14,4 @@ "defineConstraints": [], "versionDefines": [], "noEngineReferences": false -} \ No newline at end of file +}