untiy游戏接入之uc_sdk(九游)

概述

接入心德

游戏接入是比较费时间的,也行少些一个字母或多了一个字母,有时候都有可能需要重做,所以一定不要怕麻烦,多余渠道方的技术交流。

本文描述

本文是按照uc6.1.0sdk的文档进行接入的,具体的细节,和步骤,还要根据自己公司的接入框架进行接入,本文只是按照我自己公司的接入框架和个人习惯方式来接入的,仅提供参考作用。

UC 6.1.0-sdk目录

这里写图片描述

uc的接入方式分为两种:

  • android原生代码接入
  • 通过u3d引擎接入
    这里写图片描述

本文讲述的是android原生接入的

注意:我用的是eclipse接入的,因为给的android studio demo导入as中有问题,应该是渠道方配置了什么东西, 所以把类全部拷贝到ec中,看着布局,根据点击事件把方法抽出来了。

u3d准备工作

这里只说了游戏工程都有对应的渠道文件,主要是用与我们抽取的接口进行交互的

这里写图片描述

注:其实这部份是不归我们写的,这些工作是属于前端的。前端忙所以自己比着葫芦画瓢写了

打包方式

这次的打包方式跟以往不同,以往都是通过untiy里的脚本进行一键打包,这次是吧游戏项目以andorid的形式导出来,进行接入的。倒出来以后就跟正常开发app一样了
与play800(爱玩堂)的打包方式一样的:http://blog.csdn.net/qq_34501274/article/details/53404307

sdk初始化

android:

//广播   对登录  支付  退出  登出   角色提交  函数的事件的回调处理等等
SDKEventReceiver receiver = new SDKEventReceiver() {
        @Subscribe(event = SDKEventKey.ON_INIT_SUCC)
        private void onInitSucc() {
            // 初始化成功
        }
        @Subscribe(event = SDKEventKey.ON_INIT_FAILED)
        private void onInitFailed(String data) {
            // 初始化失败
            Log.e("init失败", "111111111111111111111");       
        }

        @Subscribe(event = SDKEventKey.ON_LOGIN_SUCC)
        private void onLoginSucc(String sid) {
            Log.e("登录成功", "111111111111111111111");         
            /**
             * 当登录成功时SDKEventKey.ON_LOGIN_SUCC事件被触发,
             * 同时通过带回登录sid给游戏,sid为用户的登录会话标识, 用于给游戏服务器校验用户登录状态使用。
             * */

              //这里向u3d发送数据
            UnityPlayer.UnitySendMessage("Main Camera", "LoginResult", sid);
        }

        @Subscribe(event = SDKEventKey.ON_LOGIN_FAILED)
        private void onLoginFailed(String desc) {
            Log.e("登录失败", "111111111111111111111");
        }

        @Subscribe(event = SDKEventKey.ON_LOGOUT_SUCC)
        private void onLogoutSucc() {
            Log.e("登出成功", "111111111111111111111");
            AccountInfo.instance().setSid("");
            Login();

        }
        @Subscribe(event = SDKEventKey.ON_LOGOUT_FAILED)
        private void onLogoutFailed() {
            Log.e("登出失败", "111111111111111111111");

        }
        @Subscribe(event = SDKEventKey.ON_EXIT_SUCC)
        private void onExit(String desc) {

            UnityPlayerNativeActivity.this.finish();
            // // 退出程序
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            android.os.Process.killProcess(android.os.Process.myPid());
        }

        @Subscribe(event = SDKEventKey.ON_EXIT_CANCELED)
        private void onExitCanceled(String desc) {
            // Toast.makeText(GameActivity.this, desc+"退出失败",
            // Toast.LENGTH_SHORT).show();
        }

        @Subscribe(event = SDKEventKey.ON_CREATE_ORDER_SUCC)
        private void onCreateOrderSucc(OrderInfo orderInfo) {

            Log.e("支付成功", "pay succ");

        }

        @Subscribe(event = SDKEventKey.ON_PAY_USER_EXIT)
        private void onPayUserExit(OrderInfo orderInfo) {

            Log.e("支付失败", "pay fail");

        }

    };
protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);     
        /**
         * 
         * 初始化
         */
        initSDK();
        /**
        *这里的广播是对所有方法事件的回调处理
        */
        UCGameSdk.defaultSdk().registeSDKEventReceiver(receiver);
    //初始化接口
    //根据渠道的不同   即使u3d调取了初始化sdk的方法,也需要  在onCreat方法里在掉一次
    public void initSDK() {
        GameParamInfo gameParamInfo = new GameParamInfo();

        gameParamInfo.setEnablePayHistory(true);// 开启查询充值历史功能
        gameParamInfo.setEnableUserChange(true);// 开启账号切换功能
        gameParamInfo.setCpId(UCSdkConfig.cpId);
        gameParamInfo.setGameId(UCSdkConfig.gameId);
        gameParamInfo.setServerId(UCSdkConfig.serverId);
        gameParamInfo.setOrientation(UCOrientation.LANDSCAPE);

        SDKParams sdkParams = new SDKParams();
        sdkParams.put(SDKParamKey.GAME_PARAMS, gameParamInfo);

        // FIXME always debug
        sdkParams.put(SDKParamKey.DEBUG_MODE, UCSdkConfig.debugMode);
        try {
            UCGameSdk.defaultSdk().initSdk(this, sdkParams);
            Log.e("initSdk", "1------------");
        } catch (AliLackActivityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e("initSdk", "2------------");
    }

u3d:

public class uc1GameSdk
{

    public static void init()
    {
        Debug.Log("##--Start init--##");

        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("initSDK");
            }
        }

登录

android

    /**
     * 登录
     * */
    public void Login() {
        ucSdkLogin();

    }

    public void ucSdkLogin() {

        try {
            UCGameSdk.defaultSdk().login(this, null);
        } catch (AliLackActivityException e) {
            e.printStackTrace();
        } catch (AliNotInitException e) {
            e.printStackTrace();
        }
    }

u3d

    public static void login()
    {
        Debug.Log("##--Start login--##");
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                jo.Call("Login");
            }
        }
    }

支付

android

    public void pay(String sign, String signType, String accountId,
            String cpOrderId, String notifyUrl, String amount) {

        // callSdkApi ("pay", amount, serverId, roleId, roleName, grade,
        // customInfo, notifyUrl, transactionNumCP);
        Map<String, String> paramMap = new HashMap<String, String>();

        paramMap.put(SDKParamKey.SIGN, sign);// 必须
        paramMap.put(SDKParamKey.SIGN_TYPE, signType);// 必须
        paramMap.put(SDKParamKey.ACCOUNT_ID, accountId);// 必须:用户id,充值用户的统一账号ID,由阿里游戏平台生成。
        paramMap.put(SDKParamKey.CP_ORDER_ID, cpOrderId);// 订单号
        paramMap.put(SDKParamKey.NOTIFY_URL, notifyUrl);// 服务器通知地址,如果为空以服务端配置地址作为通知地址,长度不超过100
        paramMap.put(SDKParamKey.AMOUNT, amount);// 价格 必须
        // paramMap.put(SDKParamKey.CALLBACK_INFO, customInfo);//
        // cp自定义信息,在支付结果通知时回传,CP可以自己定义格式,长度不超过250

        SDKParams sdkParams = new SDKParams();
        Map<String, Object> map = new HashMap<String, Object>();
        map.putAll(paramMap);
        sdkParams.putAll(map);
        try {
            UCGameSdk.defaultSdk().pay(this, sdkParams);
        } catch (Exception e) {
            e.printStackTrace();
            // addOutputResult("charge failed - Exception: " + e.toString() +
            // "\n");
        }
    }

u3d

注:因为根据uc文档来看,支付牵扯到二次请求所以这里在点击商品后和打开sdk的支付界面之间加入了一个post请求,先向服务器下订单,根据服务器返回的数据,在调出sdk支付界面。这样安全性更高点

    public static void pay(RechargeConfig config)
    {
        //用户在我们服务器上的id
        //角色id
        //服务器id
        //用价格
        //角色名称
        //商品Id
        //uc帐号Id
        //设备号
        long str = PlayerData.curCharacter.id;
    //  payload["goods"] = config.id;
        //向服务器发送生成订单请求
        WWWForm form = new WWWForm();
        form.AddField("uid", PlayerData.cid.ToString());
        form.AddField("charId", str.ToString());
        form.AddField("serverId", PlayerData.curServer.id.ToString());
        form.AddField("amount", config.price + ".00");
        form.AddField("charName", PlayerData.curCharacter.Name.ToString());
        form.AddField("goods",config.id.ToString());
        form.AddField("accountId", ChannelConstant.accountid.ToString());
        form.AddField("device", ChannelConstant.device.ToString());

        string api = "支付回调地址";
        //www  是服务器返回的数据
        ARPGNet.instance.HttpPost(ARPGApplication.instance.host + api, form, (www) =>
     {
            Debug.Log("##--HTTP  POST请求--##");
            if (www == null || !String.IsNullOrEmpty(www.error))
            {
                if (!String.IsNullOrEmpty(www.error))
                {
                    Debuger.LogError(www.error);
                }

                return;
            }
            JsonObject result = SimpleJson.SimpleJson.DeserializeObject<JsonObject>(www.text);

            Debug.Log("##--result服务器返回结果--##"+www.text);        
            if(result.ContainsKey("info") )
            {

                JsonObject info = (JsonObject)result["info"];
                Debug.Log("##--result  if--##"+info.ToString());
                //游戏服务端生成的签名
                //签名类型
                //uc帐号id
                //游戏的服务端订单号
                //支付回调地址
                //充值金额
                string sign = Convert.ToString(info["sign"]);
                string signType = Convert.ToString(info["signType"]);
                string accountId = Convert.ToString(info["accountId"]);
                string cpOrderId = Convert.ToString(info["cpOrderId"]);
                string notifyUrl = Convert.ToString(info["notifyUrl"]);
                string amount = Convert.ToString(info["amount"]);
                Debug.Log("##--服务器返回订单信息--## " +            
                          "sign--"+sign+               
                          "signType--"+signType+
                          "accountid--"+accountId+
                          "cpOrderId--"+cpOrderId+
                          "notifyUrl--"+notifyUrl+
                          "amount--"+amount);
                using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
                    {

                        Debug.Log("##--uc1SDK  pay--##"); 
                        jo.Call("pay",  sign,signType,accountId,cpOrderId,notifyUrl,amount);
                    }
                }
            }

        }, 7f, null);   
    }

本文就说这么多就够了,后面的切换帐号,退出游戏,角色提交,等等,都是大同小异的。游戏接入其实没有想象的那么难,只是比较繁琐而已。

本人描述能力有限,如有不足之处,欢迎留言指出!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值