package com.unity3d.player; import android.app.Activity; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import com.barton.log.GASDKFactory; import com.barton.log.builder.GAConfiguration; import com.barton.log.builder.ParamsBuilder; import com.barton.log.ebarton.BaseUrl; import com.barton.log.ebarton.EventType; import com.barton.log.logapi.IGASDK; import com.facebook.share.model.ShareLinkContent; import com.facebook.share.widget.MessageDialog; import com.facebook.share.widget.ShareDialog; import com.google.android.gms.tasks.Task; import com.google.android.play.core.review.ReviewException; import com.google.android.play.core.review.ReviewInfo; import com.google.android.play.core.review.ReviewManager; import com.google.android.play.core.review.ReviewManagerFactory; import com.google.android.play.core.review.model.ReviewErrorCode; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; 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.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; import kotlinx.serialization.json.Json; public class SDKManager { private final static Handler handler = new Handler(Looper.getMainLooper()); private static IGASDK gasdk; private static final String TAG = com.unity3d.player.SDKManager.class.getSimpleName(); private static String curType = TuYooClientID.tyGuest; public static void InitSDK(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()); TYUnityActivity.setSdkInited(); SDKAPI.getIns().onActivityStart(activity); SDKAPI.getIns().onActivityResume(activity); } catch (Exception e) { System.out.println("initSDK Exception " + e); } }); } public static void parseLoginInfo(int i, String s) { try { JSONObject result = new JSONObject(); result.put("code", i); if (i == 0) { JSONObject serverResponse = new JSONObject(s); JSONObject userInfo = serverResponse.getJSONObject("result"); result.put("loginData", userInfo ); } else { result.put("errStr", s); } UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LOGIN_CALLBACK_FUNCTION_NAME, result.toString()); } catch (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}"); } } //登录回调-统一的回调方法(保持回调仅有一个,否则可能会出现多次回调的情况) static SDKCallBack.Login mLogin = new SDKCallBack.Login() { @Override public void callback(int i, String s) { SDKLog.i("SDKCallBack.Login callback: " + i + " \n" + s); parseLoginInfo(i, s); tmpSnsInfo = null; } }; 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()); } catch (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}"); } } }; public static void UnityResetServerUrl(String url) { SDKLog.i("UnityResetServerUrl : " + url); SetDNSIPsEnable(false); SDKAPI.getIns().updateServer(url); } public static void UnityLoginByTokenFun(String token) { SDKLog.i("UnityLoginByTokenFun : " + token); 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}")); return ""; } SDKLog.i("UnityLoginBySns : " + tmpSnsInfo); handler.post(() -> SDKAPI.getIns().loginBySnsInfo(tmpSnsInfo, mLogin)); return tmpSnsInfo.type; } public static void UnityGetIdentityFun(String type) { SDKLog.i("UnityGetIdentityFun : " + type); handler.post(() -> SDKAPI.getIns().loginByType(type, mLogin)); } public static void UnityLogin(String type) { SDKLog.i("UnityLogin : " + type); handler.post(() -> SDKAPI.getIns().loginByType(type, mLogin)); } public static void UnityLogOutByChannel(String type) { SDKLog.i("UnityLoginOut : "); 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) { try { JSONObject result = new JSONObject(); result.put("code", bindcode); result.put("userId", userId); 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()); } catch (JSONException e) { String msg = "{\"code\":1, \"userId\": 0}"; UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } } 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) { Log.w(TAG, checkMsg); String msg = "{\"code\":1, \"userId\": 0}"; 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"); String bindInfo = checkResult.getString("bindInfo"); int bindUserId = checkResult.getInt("userId"); JSONObject callbackMsg = new JSONObject(); 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()); } 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); } }); } else { Log.w(TAG, bindmsg); String msg = "{\"code\":1, \"userId\": 0}"; UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } } 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); } } else { Log.w(TAG, bindmsg); String msg = "{\"code\":1, \"userId\": 0}"; UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.LINKACCOUT_CALLBACK_FUNCTION_NAME, msg); } }); } else { Log.w(TAG, snsmsg); String msg = "{\"code\":1, \"userId\": 0}"; 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) { String msg = "{\"code\":1, \"userId\": 0, \"msg\": \"tmpSnsInfo is null\"}"; 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) { SDKAPI.getIns().bindBySnsId(tmpSnsInfo, String.valueOf(newUserId), (bindCode, bindMsg) -> { Log.i(TAG, "bindBySnsId code: " + bindCode + " msg: " + bindMsg); 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 { String msg = String.format("{\"code\":-1, \"userId\": 0, \"msg\": \"%s\"}", bindMsg); UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, ConfigManager.CHANGELINK_CALLBACK_FUNCTION_NAME, msg); } }); } 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"); } }); } public static void UnityKnow(String productId, String productName, String productCount, String prodorderId, String appInfo) { 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); } 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) { 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; PayType payType = new PayType(); payType.paytype = ptype; SDKAPI.getIns().payNew(payData, payType, mPay); } public static void thirdExtend() { Log.e(TAG,"====>java thirdExtend"); 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) { 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){ result.put("respObj", msg); }else { Log.e(TAG,"获取商品列表失败啦:" + msg); result.put("thirdExtend_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}"); } } }); } private static IGASDK GetGameGa(){ if(gasdk == null){ GAConfiguration.Builder builder = new GAConfiguration.Builder() .withBaseUrl(BaseUrl.INTERNATIONAL) .withContext(SDKWrapper.getInstance().getContext()) .withClientId(ConfigManager.SDK_CLIENTID) .withGameId(ConfigManager.SDK_GAMEID) .withProjectId(ConfigManager.SDK_PROJECTID); gasdk = GASDKFactory.createGASDK(builder.build()); } return gasdk; } 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); SDKLog.i("SetGaCommonInfo : " + SetGaCommonInfo); Gson gson = new Gson(); 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){ GetGameGa().addCommonParameter(key, map.get(key).toString()); } } } 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()); for (String key : map.keySet()) { 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; } } public static void Review() { ReviewManager manager = ReviewManagerFactory.create(SDKWrapper.getInstance().getContext()); Task request = manager.requestReviewFlow(); request.addOnCompleteListener(reqTask -> { if (reqTask.isSuccessful()) { ReviewInfo reviewInfo = reqTask.getResult(); Activity activity = UnityPlayer.currentActivity; manager.launchReviewFlow(activity, reviewInfo); } else { @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); if (ShareDialog.canShow(ShareLinkContent.class)) { Activity activity = UnityPlayer.currentActivity; ShareDialog dialog = new ShareDialog(activity); ShareLinkContent linkContent = new ShareLinkContent.Builder() .setQuote(content) .setContentUrl(Uri.parse(url)) .build(); dialog.show(linkContent); } 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); 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 { Log.e(TAG, "Messenger ShareDialog can not show"); } } public static void SetDNSIPsEnable(bool enable) { SDKAPI.enableDoh(enable); if(enable) { SDKAPI.setHttpDnsIps(new String[]{ "34.111.1.231", "2600:1901:0:c31b::" }); } else{ SDKAPI.setHttpDnsIps(new string[0]); } } }