高效率完成一次接入80個手游渠道SDK——游戲接入SDK客戶端篇

2018-01-19 12:04 更新

一、引言

通常,游戲開發(fā)商并不會只在一個渠道上線他們的游戲,接入越多的渠道,代表著可能獲取越多的用戶,但同時也代表著越多的接入SDK工作量、工期和費用。一款游戲要有足夠的用戶,甚至需要接入30家以上的各種渠道,以保障自己的市場覆蓋率。
單個SDK接入流程在一位有經(jīng)驗的全職客戶端程序、一位全職服務端程序員、一位全職QA處理的情況下,需要3天時間才能完成。因此當一款產品面對30個甚至更多不同需求的渠道SDK時,人員成本和時間成本就會急劇增加。

所以我們需要一個通用接口,來處理各種渠道的需求,這就是統(tǒng)一渠道SDK接入框架。

二、資源導入

下載地址:https://github.com/typesdk/TypeSdkClient

將TypeSDKLibrary文件夾整個添加到Unity工程中,注意結構需要與截圖統(tǒng)一。建議游戲中與當前導入的腳本命名沖突的文件,需要由開發(fā)者自行修改沖突的類名

添加后的目錄結構如下所示

三、代碼接入

1、接入流程簡要描述

SDK普通接入邏輯示意圖

1.1在調用其它API前需先調用初始化接口對SDK進行初始化。

1.2在完成初始化接口調用后方可調用登錄接口,登錄成功選擇角色進入游戲后需要調用提交用戶信息接口。

1.3登錄成功后如果需要切換賬號,需調用登出接口。

1.4對于有依賴于登錄用戶的接口,如支付,提交用戶信息接口,需要調用獲取用戶信息接口拿到相關數(shù)據(jù),如user_id….

1.5在游戲退出時需要調用退出接口。

SDK的接入需要接入程序員實現(xiàn)接口的調用和回調函數(shù)的響應兩個部分邏輯

a. 回調函數(shù)的響應主要通過設置監(jiān)聽來實現(xiàn),具體請看第二節(jié)(回調函數(shù)的處理)

回調偵聽的事件類型

事件說明

TypeEventType.EVENT_INIT_FINISH

SDK初始化完畢

TypeEventType.EVENT_LOGIN_SUCCESS

登錄成功回調

TypeEventType.EVENT_PAY_RESULT

支付結果回調

TypeEventType.EVENT_LOGOU

登出完畢回調

TypeEventType.EVENT_RELOGIN

重新登錄成功回調

TypeEventType.EVENT_CANCEL_EXIT_GAME

取消殺應用回調












b. 接口的調用主要為以下的接口調用,將會下后面詳細講解每個接口的調用

接口列表

函數(shù)名稱

功能說明

InitSDK

SDK初始化

Login

顯示登錄界面

Logout

執(zhí)行渠道登出,清理渠道用戶緩存

PayItem

顯示支付界面

ShowPersonCenter

顯示用戶中心(如果渠道支持)

ExitGame

大退游戲(等于殺進程)

IsHasRequest

判斷渠道是否支持某功能(例如:用戶中心)

UpdatePlayerInfo

提交用戶信息到渠道(渠道要求在進入游戲后調用)









2、回調函數(shù)的處理

typesdkbaselib中已經(jīng)提供了預先注冊完畢所有回調偵聽的cs文件:U3DTypeEventListener.cs接入方需要在U3DTypeEventListener監(jiān)聽類中,根據(jù)不同回調事件實現(xiàn)相應的游戲邏輯。

也可以根據(jù)自己需要,在游戲內合適的地方,參考demo自行注冊相關的函數(shù)偵聽。

注:接入方只能修改以下方法實現(xiàn)相應的邏輯,U3DTypeEventListener類中其它代碼段建議不要更改,以免影響功能。

部分需要界面響應的監(jiān)聽,請判斷當時場景,避免造成游戲邏輯混亂。如,在PVP時檢測到用戶切換賬號。

//初始化完成后回調函數(shù)
void NotifyInitFinish(U3DTypeEvent evt)
{
//游戲需要等待此回調才允許調用登錄接口。
}

    //登錄操作完成后的回調函數(shù)
    void NotifyLogin(U3DTypeEvent evt){
        //解析渠道登錄成功返回的信息,一般有user_token,user_id...
              //此時返回的結果不能作為登錄依據(jù),需要進過服務端驗證,取的服務器返回的最終數(shù)據(jù)。
        //CP方需要將信息解析為CP服務器約定的數(shù)據(jù)格式轉發(fā)給游戲服務器,并由游戲服務器轉發(fā)至TypeSDK Server以完成游戲的登錄驗證
         string userId = evt.evtData.GetData(U3DTypeAttName.USER_ID);
}

    //更新渠道更新檢測完成后回調
void NotifyUpdateFinish(U3DTypeEvent evt){
       //建議等待此更新完成后,再進行游戲的更新邏輯,否則會造成渠道更新和游戲自身更新沖突。
}

    //支付結果通知回調,CP需根據(jù)支付返回結果完成相應邏輯,此處為客戶端返回結果,不可作為支付到賬依據(jù),游戲需等待TypeSDK Server的支付成功回調。
    void NotifyPayResult(U3DTypeEvent evt){
        if (evt.evtData.GetData(U3DTypeAttName.PAY_RESULT).Equals("1"))
{ //支付完成,可嘗試延遲刷新賬戶余額信息。
            Debug.Log("pay finished:" + evt.evtData.GetData(U3DTypeAttName.PAY_RESULT_DATA));
        }
        else
        {//支付失敗,或取消。
            Debug.Log("pay failed:" + evt.evtData.GetData(U3DTypeAttName.PAY_RESULT_REASON));
        }
}

    //登出結果通知回調,說明用戶已經(jīng)做了退出賬戶操作,需要返回登錄界面,并重新調用登錄
    void NotifyLogout(U3DTypeEvent evt){
}

    //重登錄結果通知回調,用戶在渠道SDK進行用戶切換操作,需要切換到新賬號界面。
    void NotifyRelogin(U3DTypeEvent evt){
}

    //取消退出游戲通知回調,把退出游戲邏輯說明一下。
    void NotifyCancelExit(U3DTypeEvent evt){
}

3、SDK傳遞的基本數(shù)據(jù)類型

sdk用到的數(shù)據(jù)類型 都繼承于U3DTypeBaseData,相關使用示例如下:

3.1創(chuàng)建U3DTypeBaseData對象

U3DTypeBaseData baseData = new U3DTypeBaseData();

3.2設置一條屬性

函數(shù)名

public void SetData(string attName,string attValue)

參數(shù)列表

string attName,

U3DTypeAttName中定義的字段


string attValue

目前支持int,string,boolean 三種類型基本數(shù)據(jù)

返回值

Void








示例:

//(鍵名使用U3DTypeAttName定義的字段)
baseData.SetData(“鍵名”,”值”);

3.3獲得一個string類型的屬性 attname為標識

函數(shù)名

public string GetData(string attName)

參數(shù)列表

string attName,

U3DTypeAttName中定義的字段

返回值

String

指定key值的string類型value






3.4獲得一個int類型的屬性 attname為標識

函數(shù)名

public int GetInt (string attName)

參數(shù)列表

string attName,

U3DTypeAttName中定義的字段

返回值

Int

指定key值的int類型value






3.5獲得一個bool類型的屬性 attname為標識

函數(shù)名

函數(shù)名

public bool GetBool(string attName)

參數(shù)列表

string attName,

U3DTypeAttName中定義的字段

返回值

Bool

指定key值的boolean類型value






使用例子:

//新建一個對象
       U3DTypeBaseData egData = new U3DTypeBaseData ();
//給該對象賦值
egData.SetData (U3DTypeAttName.APP_KEY, "123456789");
//讀取一個string類型數(shù)據(jù)readStr = "123456789
        string readStr = egData.GetData (U3DTypeAttName.APP_KEY);
//讀取一個int類型數(shù)據(jù)readInt
        int readInt = egData.GetInt(U3DTypeAttName.APP_KEY); = 123456789

響應消息傳遞的消息類型

public class U3DTypeEvent

函數(shù)名

public bool GetBool(string attName)

成員變量列表

public TypeEventType evtType

該事件的類型(枚舉)


public U3DTypeBaseData evtData

該事件所包含的數(shù)據(jù)(可以通過上述函數(shù)獲取相關數(shù)據(jù))


事件對象例子

void LoginResult(U3DTypeEvent evt)
    {
        U3DTypeBaseData data = evt.evtData;
        string userID = data.GetData(U3DTypeAttName.USER_ID);
        string userToken = data.GetData(U3DTypeAttName.USER_TOKEN);
  }

4、接口接入與描述

(1)初始化

函數(shù)名

public void InitSDK()

說明

sdk的初始化接口,再調用其他sdk功能前,請務必先執(zhí)行該接口,所有渠道都要求在應用啟動開始就調用此接口。

調用例子

U3DTypeSDK.Instance.InitSDK();

(2)登錄

函數(shù)名

public void Login ()

說明

顯示登錄界面,若登錄成功則會發(fā)送TypeEventType.EVENT_LOGIN_SUCCESS消息。請在登錄界面自動執(zhí)行調用,不要出現(xiàn)需要點擊按鈕才顯示的情況。

當用戶登錄失敗時需要,再次調用此接口。

調用例子

U3DTypeSDK.Instance.Login();

(3)提交用戶信息

函數(shù)名

public void UpdatePlayerInfo ()

說明

在有些指定事件,需要設置用戶相關信息并且提交。登錄完成進入游戲、用戶升級、建角。

調用例子

U3DTypeSDK.Instance.UpdatePlayerInfo()

當用戶成功完全登錄進入游戲后,需要設置用戶相關信息并且提交

該函數(shù)的所有內容,不能使用SDK客戶端本地緩存的數(shù)據(jù),建議從服務端獲得

需要設置的屬性如下,當沒有該屬性時,請傳空字符串

string ROLE_TYPE = “create_role”;//角色統(tǒng)計信息類型即調用時機,(createRole:創(chuàng)建角色,levelUp:角色升級,enterGame:選定角色進入游戲)(不能為空)
string SAVED_BALANCE = “0”;//當前角色余額(RMB購買的游戲幣),默認為0
string USER_NAME = "user_name"; //用戶名
string USER_TOKEN = "user_token"; //用戶渠道驗證用token
string USER_ID = "user_id"; //用戶id
string USER_HEAD_ID = "user_head_id"; //用戶頭像id
string USER_HEAD_URL = "user_head_url"; //用戶頭像url
string VIP_LEVEL = “vip_level”;//VIP等級,沒有傳0
string PARTY_NAME = “party_name”;//工會名稱,如:天下第一
string ROLE_ID = "role_id"; //角色id
string ROLE_NAME = "role_name"; //角色名字
string ROLE_LEVEL = "role_level"; //角色等級
string ROLE_CREATE_TIME = “role_create_time”;//角色創(chuàng)建時間,一定要服務器時間(單位/秒)
string ROLE_LEVELUP_TIME = “role_levelup_time”;//角色升級時間(單位/秒)
string ZONE_ID = "zone_id"; //所在大區(qū)id
string ZONE_NAME= "zone_name"; //所在大區(qū)名稱
string SEVER_ID = "server_id"; //所在服務器id
string SERVER_NAME = “server_name”;//所在服務器名稱
string EXTRA ="extra";

參數(shù)值

說明

"0"

進入游戲主場景(即正式登錄游戲)

"1"

創(chuàng)建新角色

"2"

角色升級

設置方法示例:

U3DTypeSDK.Instance.GetUserData().SetData(U3DTypeAttName.USER_ID, "123");
U3DTypeSDK.Instance.GetUserData().SetData(U3DTypeAttName.EXTRA, "1");
U3DTypeSDK.Instance.UpdatePlayerInfo();

(4)支付

函數(shù)名

public string PayItem (U3DTypeBaseData _in_pay);

說明

在獲取服務器訂單號,并在TypeSDK Server服務器提交訂單信息后,調用此接口啟動渠道的支付界面,進行支付行為

調用例子

U3DTypeSDK.Instance.PayItem (U3DTypeBaseData _in_pay);

其中U3DTypeBaseData中

U3DTypeBaseData userData = U3DTypeSDK.Instance.GetUserData();

必填參數(shù)為:

//用戶ID,渠道返回,沒有填空
payData.SetData(U3DTypeAttName.USER_ID,userData.GetData(U3DTypeAttName.USER_ID));
//用戶token,登錄驗簽完成后由游戲服務端返回,沒有填空
payData.SetData(U3DTypeAttName.USER_TOKEN,userData.GetData(U3DTypeAttName.USER_TOKEN));
//商品支付價格(單位:分)
payData.SetData(U3DTypeAttName.REAL_PRICE,”100");
//商品名稱
payData.SetData(U3DTypeAttName.ITEM_NAME,"sk bi”);
//商品數(shù)量
payData.SetData(U3DTypeAttName.ITEM_COUNT,”1");
//所在服務器id(如果沒有填“0”)
payData.SetData(U3DTypeAttName.SERVER_ID,”1”);
//所在服務器名字(如果沒有填“server_name”)
payData.SetData(U3DTypeAttName.SERVER_NAME,”安卓一區(qū)”);
//所在大區(qū)id(如果沒有填“0”),注意應用寶要求:賬戶分區(qū)ID_角色ID。每個應用都有一個分區(qū)ID為1的默認分區(qū),分區(qū)可以在cpay.qq.com/mpay上自助配置。如果應用選擇支持角色,則角色ID接在分區(qū)ID號后用"_"連接,角色ID需要進行urlencode。payData.SetData(U3DTypeAttName.ZONE_ID,”1”);
//所在大區(qū)名字(如果沒有填“server_name”)
payData.SetData(U3DTypeAttName.ZONE_NAME,”華北一區(qū)”);

//內部訂單號(必須填寫,并保證多區(qū)情況下,訂單號唯一)
payData.SetData(U3DTypeAttName.BILL_NUMBER,”NO_123456”);
//商品id(需和TypeSDK Server商品列表保持一致)
payData.SetData(U3DTypeAttName.ITEM_SEVER_ID,”id”);
//傳遞的額外參數(shù)(建議傳入需要用來做訂單標識的信息)
payData.SetData(U3DTypeAttName.EXTRA,”extra");
//商品描述
payData.SetData(U3DTypeAttName.ITEM_DESC,”desc”);
//玩家在游戲中的角色ID
payData.SetData(U3DTypeAttName.ROLE_ID,”role_1234”);
//玩家在游戲中的角色名字
payData.SetData(U3DTypeAttName.ROLE_NAME,”玩家編號001”);

當支付行為在客戶端完成后,會接到回調消息:EVENT_PAY_RESULT

其中event的使用類似 login

event中data的參數(shù)包括以下內容

PAY_RESULT//支付結果(1/0/2)成功/失敗(除取消)/支付取消
//說明:客戶端收到“失敗或支付取消”狀態(tài),建議客戶端可以使用戶直接發(fā)起下筆充值。
PAY_RESULT_REASON//支付結果的原因(失敗原因)
PAY_RESULT_DATA

(5)登出

函數(shù)名

public void Logout ();

說明

調用渠道的登出邏輯,不會有界面顯示,但是會把渠道賬戶注銷,需要由cp自行回到登錄界面

調用例子:

U3DTypeSDK.Instance.Logout()

登出成功則會發(fā)送 TypeEventType.EVENT_LOGOUT消息,發(fā)送的參數(shù)U3DTypeBaseData數(shù)據(jù)

(6)退出

函數(shù)名

public void ExitGame ();

說明

調用渠道退出應用程序邏輯,執(zhí)行成功,則會關閉應用

U3DTypeSDK.Instance.ExitGame();

整個游戲的退出行為 ,建議交給sdk處理,并且添加 退出行為取消響應事件偵聽TypeEventType.EVENT_CANCEL_EXIT_GAME 的函數(shù)

當退出成功后 由sdk執(zhí)行系統(tǒng)的退出,當退出取消后,則會發(fā)送 取消退出事件,接入方需完成相應的邏輯。

(7)獲取當前渠道SDK配置參數(shù)

U3DTypeSDK.Instance.GetPlatformData()

包括以下內容:

CHANNEL_ID//渠道的id(由SDK組定義 和ConfigSever上的channel id統(tǒng)一)
SDK_NAME//渠道標記
CP_ID

以上參數(shù) 在CPSeting.txt中填寫(接入方無需關心)

(8)用戶中心

顯示渠道用戶中心

U3DTypeSDK.Instance.ShowPersonCenter()

隱藏用戶中心

U3DTypeSDK.Instance.HidePersonCenter()

在調用這2個函數(shù)之前 需要先執(zhí)行IsHasRequest(U3DTypeAttName.SUPPORT_PERSON_CENTER)函數(shù) 用以判定 是否需要支持該函數(shù)。

當支持時 這2個函數(shù)才會起效,并且需要在游戲內,需要有相應的圖形入口,

當不支持時,這2個函數(shù)不會生效,游戲內頁不需要相應的圖形入口。

使用示例:

if(IsHasRequest(U3DTypeAttName.SUPPORT_PERSON_CENTER)){
       U3DTypeSDK.Instance.ShowPersonCenter();

U3DTypeSDK.Instance.HidePersonCenter();
pushData.DataToString(_json_data);
U3DSDK.instance.SendMessage(“receive_local_notify”,pushData);
}

(9)查詢渠道是否彈出退出框

U3DTypeSDK.Instance.IsHasRequest(“support_exit_window”)

項目已開源,大家有興趣可以自己研究或使用接入
項目地址:https://code.csdn.net/typesdk_code
項目地址:https://github.com/typesdk
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號