From f60a1dd0c223d3a97c772a5fed9af40f0dc23378 Mon Sep 17 00:00:00 2001 From: "Liubing\\LB" Date: Sat, 9 May 2026 16:04:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Flexion=20=E5=85=88=E9=AA=8C=E7=AD=BE?= =?UTF-8?q?=E5=90=8E=E6=B6=88=E8=B4=B9=E6=94=AF=E4=BB=98=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=20+=20playerId=20=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现 Flexion 渠道支付验签重构:支付成功后不立即消费,将 purchaseJson/signature/purchaseToken 回调至 Unity,由服务端 SHA1withRSA 验签并校验 developerPayload.playerId 后再调用 consume。 同步更新 SDKManager 接口、UnityBridgeFunc 桥接、TYSdkModel 字段及 ExtraPluginCfgs。 Co-Authored-By: Claude Opus 4.7 --- .../Android/flexion/AndroidManifest.xml | 3 +- .../Android/flexion/ChannelHelpers.java | 5 +- .../Android/flexion/FlexionSDKHelper.java | 76 ++++++++++--- .../Plugins/Android/tuyoosdk_1.0.0.aar | Bin 5398548 -> 5398553 bytes .../Plugins/Android/AndroidManifest.xml | 100 +++++++++--------- .../Plugins/Android/mainTemplate.gradle | 4 +- .../Assets/Scenes/SampleScene.unity | 83 ++++++++++++++- sdk-intergration/Assets/Scripts/SDKTest.cs | 35 +++++- .../tysdk/Plugins/Android/ChannelHelpers.java | 5 +- .../Plugins/Android/FlexionSDKHelper.java | 76 ++++++++++--- .../tysdk/Plugins/Android/SDKManager.java | 30 ++++-- .../tysdk/Plugins/Android/tuyoosdk_1.0.0.aar | Bin 5398548 -> 5398553 bytes .../Packages/tysdk/Runtime/TYSdkFacade_Pay.cs | 10 +- .../Packages/tysdk/Runtime/TYSdkModel.cs | 2 + .../Packages/tysdk/Runtime/UnityBridgeFunc.cs | 8 ++ .../ProjectSettings/ProjectSettings.asset | 2 +- 16 files changed, 343 insertions(+), 96 deletions(-) diff --git a/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml b/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml index 567a8f2..16ca0ce 100644 --- a/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml +++ b/ExtraPluginCfgs/Android/flexion/AndroidManifest.xml @@ -54,12 +54,13 @@ 追加 ${applicationId}(Flexion 包名)作为后缀后,与 GP 版 authority 不同, 两个渠道包可同时安装在同一设备上,不会触发 INSTALL_FAILED_CONFLICTING_PROVIDER。 参考:Flexion 官方文档《Unique package name - follow-on requirements》 - --> + + --> diff --git a/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java b/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java index 000d512..0111209 100644 --- a/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java +++ b/ExtraPluginCfgs/Android/flexion/ChannelHelpers.java @@ -5,7 +5,7 @@ public class ChannelHelpers { public static final String CHANNEL = "Flexion"; static void register() { - SDKManager.registerHelper(CHANNEL, new FlexionSDKHelper()); + SDKManager.registerHelper(new FlexionSDKHelper()); } @@ -14,4 +14,7 @@ public class ChannelHelpers { public static String normalizeSkuList(String msg) { return msg; } + + + //public SDKExtBuilder; } diff --git a/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java b/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java index 1da70de..698df06 100644 --- a/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java +++ b/ExtraPluginCfgs/Android/flexion/FlexionSDKHelper.java @@ -25,6 +25,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.util.Base64; import java.util.List; public class FlexionSDKHelper implements SDKManager.ISDKHelper { @@ -33,12 +34,18 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { private static boolean billingConnected = false; private static final PurchasesUpdateListener purchasesListener = (billingResult, purchase) -> { + + + Log.i(TAG, "[PAY-FLOW] PurchasesUpdateListener: code=" + billingResult.getResponseCode() + + " hasPurchase=" + (purchase != null)); 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); + Log.i(TAG, "[PAY-FLOW] user cancelled"); + sendPayCallback(1, "user_cancelled", null, null, null); } else { - sendPayCallback(1, "purchase_failed_" + billingResult.getResponseCode(), null, null); + Log.e(TAG, "[PAY-FLOW] purchase failed: code=" + billingResult.getResponseCode()); + sendPayCallback(1, "purchase_failed_" + billingResult.getResponseCode(), null, null, null); } }; @@ -83,19 +90,36 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { @Override public void pay(Activity activity, String productId, String productName, String productCount, String prodorderId, String appInfo) { - Log.i(TAG, "pay: " + productId); + Log.i(TAG, "[PAY-FLOW] pay called: productId=" + productId + " billingReady=" + billingConnected); if (billingService == null || !billingConnected) { - sendPayCallback(1, "billing_not_ready", null, null); + Log.e(TAG, "[PAY-FLOW] billing not ready"); + sendPayCallback(1, "billing_not_ready", null, null, null); return; } - activity.runOnUiThread(() -> - billingService.launchBillingFlow(activity, - new BillingFlowParams(productId, "inapp", ""))); + String developerPayload = ""; + try { + byte[] decoded = Base64.getDecoder().decode(appInfo); + JSONObject json = new JSONObject(new String(decoded, "UTF-8")); + JSONObject payload = new JSONObject(); + payload.put("playerId", json.optString("playerId", "")); + payload.put("customData", json.optString("customData", "")); + developerPayload = payload.toString(); + } catch (Exception e) { + Log.w(TAG, "Failed to extract playerId/customData from appInfo: " + e.getMessage()); + } + String finalPayload = developerPayload; + activity.runOnUiThread(() -> { + Log.i(TAG, "[PAY-FLOW] launching billing flow for: " + productId + " payload=" + finalPayload); + billingService.launchBillingFlow(activity, + new BillingFlowParams(productId, "inapp", finalPayload)); + }); } @Override public void queryProducts() { + Log.i(TAG, "queryProducts called, billingConnected=" + billingConnected); if (billingService == null || !billingConnected) { + Log.w(TAG, "queryProducts: billing not ready"); sendExtensionError("billing_not_ready"); return; } @@ -108,6 +132,7 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { SDKAPI.getIns().thirdExtend(jsonObject.toString(), new SDKCallBack.Extend() { @Override public void callback(int code, String msg) { + Log.i(TAG, "TuYoo thirdExtend callback: code=" + code + " msg=" + msg); if (code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS && msg != null) { try { JSONArray products = new JSONArray(msg); @@ -117,6 +142,7 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { String pid = p.optString("productId", ""); if (!pid.isEmpty()) productIds.add(pid); } + Log.i(TAG, "queryProductDetails with " + productIds.size() + " items: " + productIds); queryProductDetails(productIds); } catch (JSONException e) { sendExtensionError("parse_error: " + e.getMessage()); @@ -131,10 +157,12 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { // ---- Billing Infrastructure ---- private static void initBillingService(Activity activity) { + Log.i(TAG, "[PAY-FLOW] initBillingService"); billingService = FLX.createBillingService(activity, purchasesListener); billingService.startConnection(activity, new ConnectionStateListener() { @Override public void onBillingSetupFinished(BillingResult result) { + Log.i(TAG, "[PAY-FLOW] onBillingSetupFinished: code=" + result.getResponseCode()); if (result.getResponseCode() == BillingResults.ResultCode.CONNECTION_SUCCESS_CODE) { billingConnected = true; queryPendingPurchases(); @@ -142,20 +170,22 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { } @Override public void onBillingServiceDisconnected() { + Log.w(TAG, "[PAY-FLOW] billing service disconnected"); billingConnected = false; } }); } private static void handlePurchase(Purchase purchase) { + Log.i(TAG, "[PAY-FLOW] handlePurchase: state=" + purchase.getPurchaseState() + + " token=" + purchase.getToken()); 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"))); + Log.i(TAG, "[PAY-FLOW] purchaseJson=" + purchase.getPurchaseJson()); + Log.i(TAG, "[PAY-FLOW] signature=" + purchase.getSignature()); + sendPayCallback(0, "success", purchase.getPurchaseJson(), purchase.getSignature(), purchase.getToken()); } else if (purchase.getPurchaseState() == 2) { - sendPayCallback(2, "pending", null, null); + Log.i(TAG, "[PAY-FLOW] purchase state=2 (pending)"); + sendPayCallback(2, "pending", null, null, null); } } @@ -207,13 +237,19 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { // ---- Callbacks to Unity ---- - private static void sendPayCallback(int code, String errStr, String purchaseJson, String signature) { + private static void sendPayCallback(int code, String errStr, + String purchaseJson, String signature, String purchaseToken) { + Log.i(TAG, "[PAY-FLOW] sendPayCallback: code=" + code + " errStr=" + errStr + + " hasPurchaseJson=" + (purchaseJson != null) + " hasSignature=" + (signature != null) + + " hasToken=" + (purchaseToken != null)); 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); + if (purchaseToken != null) result.put("purchaseToken", purchaseToken); + Log.i(TAG, "[PAY-FLOW] UnitySendMessage callback: " + result.toString()); UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_CALLBACK_FUNCTION_NAME, result.toString()); } catch (JSONException e) { @@ -222,6 +258,18 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { } } + public static void consumePurchase(String token) { + if (billingService == null || token == null || token.isEmpty()) { + Log.w(TAG, "[PAY-FLOW] consumePurchase: billingService or token is null"); + return; + } + Log.i(TAG, "[PAY-FLOW] consumePurchase: token=" + token); + billingService.consumeAsync( + new ConsumeParams(token), + r -> Log.i(TAG, "[PAY-FLOW] consume result: " + + (r.getResponseCode() == BillingResults.ResultCode.CONSUME_SUCCESS_CODE ? "ok" : "fail"))); + } + private static void sendExtensionError(String errStr) { try { JSONObject result = new JSONObject(); diff --git a/ExtraPluginCfgs/Android/flexion/Plugins/Android/tuyoosdk_1.0.0.aar b/ExtraPluginCfgs/Android/flexion/Plugins/Android/tuyoosdk_1.0.0.aar index b16d93c574510b35d10cd4e6969ed6c627b52b31..2fcfaf0f9d2c5f1eee9c5e3c29dad2003b5d0261 100644 GIT binary patch delta 6709 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 BTAKg> delta 6773 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle b/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle index 0505686..54696e0 100644 --- a/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle +++ b/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle @@ -82,9 +82,7 @@ dependencies { 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: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 diff --git a/sdk-intergration/Assets/Scenes/SampleScene.unity b/sdk-intergration/Assets/Scenes/SampleScene.unity index 50dc601..b521c8b 100644 --- a/sdk-intergration/Assets/Scenes/SampleScene.unity +++ b/sdk-intergration/Assets/Scenes/SampleScene.unity @@ -1964,6 +1964,85 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] +--- !u!1 &783615086 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 783615087} + - component: {fileID: 783615089} + - component: {fileID: 783615088} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &783615087 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783615086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1451597222} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -57} + m_SizeDelta: {x: 294.3188, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &783615088 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783615086} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8207547, g: 0.8207547, b: 0.8207547, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 27 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 61 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: GooglePlay +--- !u!222 &783615089 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 783615086} + m_CullTransparentMesh: 1 --- !u!1 &816060983 GameObject: m_ObjectHideFlags: 0 @@ -4263,6 +4342,7 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 783615087} - {fileID: 2070325009} - {fileID: 1044920373} m_Father: {fileID: 0} @@ -4968,6 +5048,7 @@ MonoBehaviour: _mfbShareLinkBtn: {fileID: 1240291501} _reviewBtn: {fileID: 678940591} _messageTxt: {fileID: 2070325010} + _titleText: {fileID: 783615088} --- !u!4 &1788702880 Transform: m_ObjectHideFlags: 0 @@ -5417,7 +5498,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -120} + m_AnchoredPosition: {x: 0, y: -152} m_SizeDelta: {x: 800, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2070325010 diff --git a/sdk-intergration/Assets/Scripts/SDKTest.cs b/sdk-intergration/Assets/Scripts/SDKTest.cs index 2eb32ce..acfbc82 100644 --- a/sdk-intergration/Assets/Scripts/SDKTest.cs +++ b/sdk-intergration/Assets/Scripts/SDKTest.cs @@ -62,6 +62,9 @@ public class SDKTest : MonoBehaviour [SerializeField] private Text _messageTxt; + + [SerializeField] + private Text _titleText; void Start() { @@ -71,6 +74,7 @@ public class SDKTest : MonoBehaviour GContext.container.RegisterInstance(config); Debug.Log("SDKTest Start"); + UpdateChannelTitle(); //=============================================================================== //====================== Test Server =========================== // UnityBridgeFunc.UnityResetServerUrl("https://128-hwsfsdk-sdk-test01.qijihdhk.com"); @@ -130,6 +134,18 @@ public class SDKTest : MonoBehaviour UnityBridgeFunc.UnityResetServerUrl("https://128-hwsfsdk-sdk-test01.qijihdhk.com"); } + private void UpdateChannelTitle() + { +#if UNITY_ANDROID + using (var cls = new AndroidJavaClass("com.unity3d.player.ChannelHelpers")) + { + string channel = cls.GetStatic("CHANNEL"); + Debug.Log($"[SDKTest] Channel from Java: {channel}"); + _titleText.text = $" {channel}"; + } +#endif + } + int retryAttempt; public void InitializeRewardedAds() @@ -161,6 +177,7 @@ public class SDKTest : MonoBehaviour _messageTxt.text = $"Login: {info.isSuccess}"; if (info.isSuccess) { + _messageTxt.text += $" UserId:{info.userId}"; _messageTxt.text += $"\n{info.msg}"; _messageTxt.text += $"\n{TYSdkFacade.TYAccountInfo.token}"; } @@ -187,10 +204,23 @@ public class SDKTest : MonoBehaviour public async void OnPayTestBtn() { _messageTxt.text = ""; + + if (ChannelConfig.Channel.Equals("Flexion")) + { + sku = new SKUDetail + { + productId = "com.arkgame.ft.pack0199", + ourProductId = "com.arkgame.ft.pack0199", + price = "1.99", + price_amount_micros = "1990000", + title = "Flexion Test Pack", + type = "inapp" + }; + } if (sku == null){ _messageTxt.text = "no product"; return; - } + } #if !UNITY_EDITOR && UNITY_IOS sku.productId = "comarkgameftpack0199"; @@ -201,7 +231,7 @@ public class SDKTest : MonoBehaviour var purchaseInfo = new JObject(); purchaseInfo["pfid"] = "TestPlayer"; purchaseInfo["customData"] = "{\"test\":\"test\"}"; - + purchaseInfo["playerId"] = TYSdkFacade.TYAccountInfo.strUserId; PaymentInfo payResult = await TYSdkFacade.Instance.Pay(sku, 1, sku.ProdPrice, purchaseInfo); _messageTxt.text = "\n" + $"Success : {payResult.isSuccess}"; @@ -220,6 +250,7 @@ public class SDKTest : MonoBehaviour _messageTxt.text = "products count:::" + result.products.Count; _messageTxt.text += "\n" + result.products[0].ToString(); sku = result.products[0]; + Debug.Log($"Sku -> {sku}"); } else { diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java index 000d512..0111209 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java @@ -5,7 +5,7 @@ public class ChannelHelpers { public static final String CHANNEL = "Flexion"; static void register() { - SDKManager.registerHelper(CHANNEL, new FlexionSDKHelper()); + SDKManager.registerHelper(new FlexionSDKHelper()); } @@ -14,4 +14,7 @@ public class ChannelHelpers { public static String normalizeSkuList(String msg) { return msg; } + + + //public SDKExtBuilder; } diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java b/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java index 1da70de..698df06 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java @@ -25,6 +25,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.util.Base64; import java.util.List; public class FlexionSDKHelper implements SDKManager.ISDKHelper { @@ -33,12 +34,18 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { private static boolean billingConnected = false; private static final PurchasesUpdateListener purchasesListener = (billingResult, purchase) -> { + + + Log.i(TAG, "[PAY-FLOW] PurchasesUpdateListener: code=" + billingResult.getResponseCode() + + " hasPurchase=" + (purchase != null)); 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); + Log.i(TAG, "[PAY-FLOW] user cancelled"); + sendPayCallback(1, "user_cancelled", null, null, null); } else { - sendPayCallback(1, "purchase_failed_" + billingResult.getResponseCode(), null, null); + Log.e(TAG, "[PAY-FLOW] purchase failed: code=" + billingResult.getResponseCode()); + sendPayCallback(1, "purchase_failed_" + billingResult.getResponseCode(), null, null, null); } }; @@ -83,19 +90,36 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { @Override public void pay(Activity activity, String productId, String productName, String productCount, String prodorderId, String appInfo) { - Log.i(TAG, "pay: " + productId); + Log.i(TAG, "[PAY-FLOW] pay called: productId=" + productId + " billingReady=" + billingConnected); if (billingService == null || !billingConnected) { - sendPayCallback(1, "billing_not_ready", null, null); + Log.e(TAG, "[PAY-FLOW] billing not ready"); + sendPayCallback(1, "billing_not_ready", null, null, null); return; } - activity.runOnUiThread(() -> - billingService.launchBillingFlow(activity, - new BillingFlowParams(productId, "inapp", ""))); + String developerPayload = ""; + try { + byte[] decoded = Base64.getDecoder().decode(appInfo); + JSONObject json = new JSONObject(new String(decoded, "UTF-8")); + JSONObject payload = new JSONObject(); + payload.put("playerId", json.optString("playerId", "")); + payload.put("customData", json.optString("customData", "")); + developerPayload = payload.toString(); + } catch (Exception e) { + Log.w(TAG, "Failed to extract playerId/customData from appInfo: " + e.getMessage()); + } + String finalPayload = developerPayload; + activity.runOnUiThread(() -> { + Log.i(TAG, "[PAY-FLOW] launching billing flow for: " + productId + " payload=" + finalPayload); + billingService.launchBillingFlow(activity, + new BillingFlowParams(productId, "inapp", finalPayload)); + }); } @Override public void queryProducts() { + Log.i(TAG, "queryProducts called, billingConnected=" + billingConnected); if (billingService == null || !billingConnected) { + Log.w(TAG, "queryProducts: billing not ready"); sendExtensionError("billing_not_ready"); return; } @@ -108,6 +132,7 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { SDKAPI.getIns().thirdExtend(jsonObject.toString(), new SDKCallBack.Extend() { @Override public void callback(int code, String msg) { + Log.i(TAG, "TuYoo thirdExtend callback: code=" + code + " msg=" + msg); if (code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS && msg != null) { try { JSONArray products = new JSONArray(msg); @@ -117,6 +142,7 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { String pid = p.optString("productId", ""); if (!pid.isEmpty()) productIds.add(pid); } + Log.i(TAG, "queryProductDetails with " + productIds.size() + " items: " + productIds); queryProductDetails(productIds); } catch (JSONException e) { sendExtensionError("parse_error: " + e.getMessage()); @@ -131,10 +157,12 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { // ---- Billing Infrastructure ---- private static void initBillingService(Activity activity) { + Log.i(TAG, "[PAY-FLOW] initBillingService"); billingService = FLX.createBillingService(activity, purchasesListener); billingService.startConnection(activity, new ConnectionStateListener() { @Override public void onBillingSetupFinished(BillingResult result) { + Log.i(TAG, "[PAY-FLOW] onBillingSetupFinished: code=" + result.getResponseCode()); if (result.getResponseCode() == BillingResults.ResultCode.CONNECTION_SUCCESS_CODE) { billingConnected = true; queryPendingPurchases(); @@ -142,20 +170,22 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { } @Override public void onBillingServiceDisconnected() { + Log.w(TAG, "[PAY-FLOW] billing service disconnected"); billingConnected = false; } }); } private static void handlePurchase(Purchase purchase) { + Log.i(TAG, "[PAY-FLOW] handlePurchase: state=" + purchase.getPurchaseState() + + " token=" + purchase.getToken()); 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"))); + Log.i(TAG, "[PAY-FLOW] purchaseJson=" + purchase.getPurchaseJson()); + Log.i(TAG, "[PAY-FLOW] signature=" + purchase.getSignature()); + sendPayCallback(0, "success", purchase.getPurchaseJson(), purchase.getSignature(), purchase.getToken()); } else if (purchase.getPurchaseState() == 2) { - sendPayCallback(2, "pending", null, null); + Log.i(TAG, "[PAY-FLOW] purchase state=2 (pending)"); + sendPayCallback(2, "pending", null, null, null); } } @@ -207,13 +237,19 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { // ---- Callbacks to Unity ---- - private static void sendPayCallback(int code, String errStr, String purchaseJson, String signature) { + private static void sendPayCallback(int code, String errStr, + String purchaseJson, String signature, String purchaseToken) { + Log.i(TAG, "[PAY-FLOW] sendPayCallback: code=" + code + " errStr=" + errStr + + " hasPurchaseJson=" + (purchaseJson != null) + " hasSignature=" + (signature != null) + + " hasToken=" + (purchaseToken != null)); 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); + if (purchaseToken != null) result.put("purchaseToken", purchaseToken); + Log.i(TAG, "[PAY-FLOW] UnitySendMessage callback: " + result.toString()); UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.PAY_CALLBACK_FUNCTION_NAME, result.toString()); } catch (JSONException e) { @@ -222,6 +258,18 @@ public class FlexionSDKHelper implements SDKManager.ISDKHelper { } } + public static void consumePurchase(String token) { + if (billingService == null || token == null || token.isEmpty()) { + Log.w(TAG, "[PAY-FLOW] consumePurchase: billingService or token is null"); + return; + } + Log.i(TAG, "[PAY-FLOW] consumePurchase: token=" + token); + billingService.consumeAsync( + new ConsumeParams(token), + r -> Log.i(TAG, "[PAY-FLOW] consume result: " + + (r.getResponseCode() == BillingResults.ResultCode.CONSUME_SUCCESS_CODE ? "ok" : "fail"))); + } + private static void sendExtensionError(String errStr) { try { JSONObject result = new JSONObject(); diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java b/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java index c6065f6..2cc9cba 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/SDKManager.java @@ -57,19 +57,26 @@ public class SDKManager { private static SnsInfo tmpSnsInfo; private static String channel = "GooglePlay"; - // Channel helper registry + // Channel helper public interface ISDKHelper { void init(Activity activity); void pay(Activity activity, String productId, String productName, String productCount, String prodorderId, String appInfo); void queryProducts(); + void consume(String token); } - 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); + public static void registerHelper(ISDKHelper helper) { + sdkHelper = helper; + } + + public static void ConsumeFlexionPurchase(String token) { + Log.i(TAG, "ConsumeFlexionPurchase: token=" + token); + if (sdkHelper != null) { + sdkHelper.consume(token); + } } // ------------------------------------------------------------------------- @@ -79,7 +86,16 @@ public class SDKManager { public static void InitSDK(Activity activity, String ch) { channel = ChannelHelpers.CHANNEL; ChannelHelpers.register(); - sdkHelper = helperMap.get(channel); + +// var builder = SDKManager.ExtendBuilder() +// .WithChannel(SDKManagerExt.CHANNEL) +// .WithInit(SDKManagerExt.GetInit()) +// .WithPay(SDKManagerExt.GetPay()) +// .WithQuery(SDKManagerExt.GetQuery()) +// .Builder() + + + Log.i(TAG, "[CHANNEL-VERIFY] Java InitSDK channel=" + channel + " fromCSharp=" + ch + " helper=" + (sdkHelper != null ? sdkHelper.getClass().getSimpleName() : "default")); @@ -87,7 +103,8 @@ public class SDKManager { // Sync channel to C# ChannelConfig UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, "SetChannelFromNative", channel); - + +// build.init(activity) if (sdkHelper != null) { sdkHelper.init(activity); } else { @@ -402,6 +419,7 @@ public class SDKManager { // ------------------------------------------------------------------------- public static void thirdExtend() { + Log.e(TAG, "thirdExtend called, sdkHelper=" + (sdkHelper != null ? sdkHelper.getClass().getSimpleName() : "null")); if (sdkHelper != null) { sdkHelper.queryProducts(); return; diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/tuyoosdk_1.0.0.aar b/sdk-intergration/Packages/tysdk/Plugins/Android/tuyoosdk_1.0.0.aar index b16d93c574510b35d10cd4e6969ed6c627b52b31..2fcfaf0f9d2c5f1eee9c5e3c29dad2003b5d0261 100644 GIT binary patch delta 6709 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 BTAKg> delta 6773 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.FromSeconds(30)); - + var task = TYSDKCallbackManager.Instance.RegisterCallback(TimeSpan.FromSeconds(90)); try { UnityBridgeFunc.UnityKnowNew(prodId, prodPrice, prodName, count.ToString(), orderId, extraInfo, pType); - var result = await task; result.count = count; result.orderId = orderId; result.productId = prodId; result.price = prodPrice; + result.Check(orderId, prodId); return result; } catch (Exception e) @@ -112,6 +111,9 @@ namespace tysdk var result = new PaymentInfo(); result.code = jresult["code"].ToString(); result.msg = jresult["errStr"].ToString(); + result.purchaseJson = jresult["purchaseJson"]?.ToString(); + result.signature = jresult["signature"]?.ToString(); + result.purchaseToken = jresult["purchaseToken"]?.ToString(); if (result.code == "-1") { if (!_payFirstNegativeHandled) diff --git a/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs b/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs index 1954082..375df67 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/TYSdkModel.cs @@ -21,6 +21,8 @@ namespace tysdk public string purchaseJson; // Flexion: purchase.getSignature(), used by server for RSA signature verification public string signature; + // Flexion: purchase token, used to consume after server verification + public string purchaseToken; public bool Check(string orderId, string productId) { diff --git a/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs b/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs index e665a43..681b7ea 100644 --- a/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs +++ b/sdk-intergration/Packages/tysdk/Runtime/UnityBridgeFunc.cs @@ -168,6 +168,14 @@ namespace tysdk } } + public static void ConsumeFlexionPurchase(string token) + { + using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) + { + sdkManager.CallStatic("ConsumeFlexionPurchase", token); + } + } + public static void UnityKnow(String productId, String productName, String productCount, String prodorderId, String appInfo) { using (var sdkManager = new AndroidJavaClass(SDK_CLASS)) diff --git a/sdk-intergration/ProjectSettings/ProjectSettings.asset b/sdk-intergration/ProjectSettings/ProjectSettings.asset index 6bde347..b4f01c9 100644 --- a/sdk-intergration/ProjectSettings/ProjectSettings.asset +++ b/sdk-intergration/ProjectSettings/ProjectSettings.asset @@ -163,7 +163,7 @@ PlayerSettings: androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 applicationIdentifier: - Android: com.arkgame.ft + Android: com.arkgame.ft.flexion Standalone: com.Unity-Technologies.com.unity.template.urp-blank iPhone: com.arkgame.ft buildNumber: