題記:很多做游戲開發(fā)的人哲戚,估計(jì)都或多或少地接過渠道SDK,什么UC艾岂,當(dāng)樂顺少,91,小米王浴,360......據(jù)統(tǒng)計(jì)國內(nèi)市場(chǎng)當(dāng)前不下于100家渠道脆炎,還包括一些沒有SDK的小渠道。每個(gè)渠道SDK接入的方法呢氓辣,多是大同小異腕窥。但是,正是這些小異筛婉,又讓SDK的接入,產(chǎn)生了無窮無盡的變數(shù)癞松。所以爽撒,接入SDK之前,如果你沒有經(jīng)驗(yàn)响蓉,或者沒有被SDK坑過硕勿,那么當(dāng)你看到這系列文章的時(shí)候,你很幸運(yùn)枫甲,你可以避免這一切了源武。如果你之前被坑過,而且還在繼續(xù)被坑著想幻,那么現(xiàn)在粱栖,就是你解脫的時(shí)刻。
完成一個(gè)SDK的接入并沒有多少技術(shù)含量脏毯,但是能接入100個(gè)SDK闹究,而且能做到維護(hù)容易,結(jié)構(gòu)清晰食店,安全可靠渣淤,一勞永逸就不是那么容易的事情了。這也是為什么吉嫩,世面上出現(xiàn)了那么多打包工具的介紹价认,SDK接入方法的介紹.....而且,還各不相同自娩。
隨著手游的爆發(fā)用踩,做手游的多了,被坑的人多了,那么總會(huì)有一些能人異士不甘其苦捶箱,開始發(fā)動(dòng)腦筋智什,去尋求一套既可以服務(wù)于自身,也可以服務(wù)于他人的統(tǒng)一SDK接入框架丁屎。俗話說荠锭,有痛苦,就會(huì)有需求晨川。所以证九,SDK接入這個(gè)小市場(chǎng)(或者這個(gè)市場(chǎng)也很不小)就涌現(xiàn)出了共虑,像棱鏡SDK愧怜,AnySDK,易接等這樣專門做SDK接入的公司或者機(jī)構(gòu)妈拌。他們自認(rèn)為拥坛,他們是時(shí)代的拯救者。他們的出現(xiàn)尘分,會(huì)給廣大還在忍受著苦逼SDK接入的童鞋們帶來一片光明猜惋。然而,事實(shí)上呢培愁?
這套統(tǒng)一的SDK接入框架本身著摔,就有著和實(shí)際情形相矛盾的地方。因?yàn)槎ㄐ麄兌紵o一例外地要求谍咆,游戲開發(fā)商在接入他們那個(gè)抽象框架時(shí),服務(wù)器端的登陸認(rèn)證私股,和支付回調(diào)都走他們的服務(wù)器摹察。但是,就是這一點(diǎn)庇茫,讓幾乎所有的游戲開發(fā)商望而卻步港粱。為什么呢?因?yàn)榈┣瑢?duì)于游戲開發(fā)商來說查坪,還有什么比用戶數(shù)據(jù)和支付數(shù)據(jù)更重要呢?讓這些數(shù)據(jù)走別人的服務(wù)器過一趟宁炫,豈不是比讓他們的老婆放在別人的家里睡兩晚更加難受呢偿曙?
但是,像棱鏡SDK羔巢,AnySDK那一套東西望忆,還真的很好罩阵。不用呢,又有點(diǎn)心痛的感覺启摄。那么問題來了稿壁,能不能自己來實(shí)現(xiàn)并維護(hù)一套像棱鏡SDK,或者AnySDK那樣的框架歉备,作為公司自己的統(tǒng)一SDK接入解決方案呢傅是?答案是,當(dāng)然可以蕾羊。只不過喧笔,自己需要苦逼那么一次,之后就解脫了龟再。因?yàn)榈谝淮问檎ⅲ總€(gè)渠道SDK還是要自己接入的。但是利凑,想到這些東東都是自己的浆劲,自己開發(fā),自己維護(hù)哀澈,一個(gè)字:踏實(shí)梳侨。哦,錯(cuò)了日丹,是兩個(gè)字。
本系列教程蚯嫌,我們就來從頭到尾哲虾,實(shí)現(xiàn)一套類似棱鏡SDK,或者AnySDK的那么一套東西择示。那么束凑,我們先來分析一下,接入一個(gè)SDK栅盲,我們需要做實(shí)現(xiàn)哪些東西汪诉。
1、首先谈秫,客戶端需要接入多款SDK扒寄,為了能夠多款游戲重用,我們不可以在游戲里面直接去接入每個(gè)SDK拟烫,而是需要將游戲和SDK接入分離该编。
2、上面既然說了SDK接入和游戲分離硕淑,那么我們就需要抽象出一個(gè)SDK接入框架课竣,游戲只需要接入這個(gè)框架即可嘉赎,然后每個(gè)渠道SDK來實(shí)現(xiàn)這個(gè)框架。
3于樟、我們需要實(shí)現(xiàn)一個(gè)打包工具公条,不可能100個(gè)渠道包,手動(dòng)一個(gè)一個(gè)去點(diǎn)擊打包迂曲,那是會(huì)死人的靶橱。
4、服務(wù)器端奢米,同樣得抓韩,為了支持多款游戲,我們需要一個(gè)統(tǒng)一的用戶登錄認(rèn)證中心鬓长,和一個(gè)統(tǒng)一的支付中心谒拴。
所以,我們這套東西涉波,應(yīng)該有以下幾個(gè)部分:
1英上、統(tǒng)一SDK接入框架
2、各個(gè)SDK接入實(shí)現(xiàn)
3啤覆、一鍵打包工具
4苍日、統(tǒng)一的登陸認(rèn)證中心和支付中心
好,整體的思路有了窗声,我們這好歹也是和棱鏡SDK相恃,AnySDK差不多牛逼的玩意,怎么可以沒有名字呢笨觅?我們姑且叫他 U8 SDK吧±鼓停現(xiàn)在,就讓我們?cè)賮矸治鱿录#话鉙DK接入都有兩大部分杀糯。一部分是登陸,一部分是支付苍苞。那么我們的u8 sdk自然也一樣固翰,我們需要把整個(gè)登陸的流程,和整個(gè)支付的流程給好好規(guī)劃一下羹呵。
我們先看登陸流程骂际,如果不使用這套框架,直接接入SDK冈欢,登陸的流程是什么樣呢方援?我們這里可以看下UC SDK他的登陸流程圖:
1.“游戲客戶端”調(diào)用“SDK 客戶端”的登錄功能,“SDK 客戶端”引導(dǎo)用戶輸入 用戶名密碼涛癌,當(dāng)用戶使用“UC 賬號(hào)”登錄時(shí)犯戏,“SDK 客戶端”調(diào)用“SDK 服務(wù)器” 接口進(jìn)行身份驗(yàn)證送火;
2.“SDK 服務(wù)器”密碼驗(yàn)證通過后返回sid 及用戶相關(guān)信息(包括:ucid、用戶昵 稱等)先匪;
3.“游戲客戶端”在“SDK 客戶端”回調(diào)通知后种吸,可向“SDK 客戶端”獲取sid;
5.“游戲服務(wù)器”可向“SDK 服務(wù)器”請(qǐng)求驗(yàn)證sid(調(diào)用用戶會(huì)話驗(yàn)證接口呀非,詳見《UC 優(yōu)視游戲SDK 開發(fā)參考說明書-服務(wù)器接口》)坚俗;
6.“SDK 服務(wù)器”將sid 的驗(yàn)證結(jié)果和對(duì)應(yīng)的ucid 返回給“游戲服務(wù)器”;
7.“游戲服務(wù)器”將sid 的驗(yàn)證結(jié)果及ucid岸裙、用戶昵稱返回給“游戲客戶端”
那么猖败,我們現(xiàn)在要加入我們統(tǒng)一的登陸認(rèn)證中心,而且降允,我們這個(gè)框架恩闻,本身就是針對(duì)多款游戲的,所以剧董,我們不可以讓游戲服務(wù)器直接和每個(gè)渠道的SDK 服務(wù)器進(jìn)行交互幢尚,所以我們?cè)黾右粋€(gè)統(tǒng)一登陸認(rèn)證服務(wù)器,姑且叫U8 Server翅楼。那么尉剩,我們就設(shè)計(jì)一下u8 sdk的登陸認(rèn)證流程:
1、客戶端接入抽象SDK框架毅臊,根據(jù)當(dāng)前具體是哪個(gè)SDK渠道理茎,調(diào)用登陸界面,然后傳入用戶名和密碼管嬉,進(jìn)行SDK登陸操作
2功蜓、SDK登陸成功,會(huì)返回sid等信息
3宠蚂、游戲客戶端可以通過SDK抽象層的接口,獲取到這個(gè)sid
4童社、游戲客戶端拿著這個(gè)sid以及接入之前向u8 server申請(qǐng)的appid,渠道號(hào)等信息求厕,Http訪問u8 server進(jìn)行登陸認(rèn)證。
5扰楼、u8 server 根據(jù)當(dāng)前傳遞的appid, 渠道號(hào)呀癣,去對(duì)應(yīng)的SDK服務(wù)器進(jìn)行認(rèn)證
6、SDK服務(wù)器認(rèn)證成功弦赖,會(huì)返回SDK服務(wù)器那邊的用戶信息
7项栏、U8 Server拿到用戶信息,生成一個(gè)u8 server統(tǒng)一的用戶信息并存儲(chǔ)蹬竖。然后沼沈,緊接著返回給客戶端一個(gè)有效的token流酬。
8、客戶端拿著這個(gè)token列另,去訪問游戲服務(wù)器(多數(shù)是游戲登陸服務(wù)器)
9芽腾、游戲服務(wù)器,拿著這個(gè)token去u8 server 進(jìn)行登陸認(rèn)證页衙。
10摊滔、u8 server 判定token有效,則返回給游戲服務(wù)器當(dāng)前用戶的用戶信息
11店乐、游戲服務(wù)器拿到用戶信息艰躺,證明當(dāng)前登陸成功,返回給客戶端服務(wù)器列表等數(shù)據(jù)眨八,登陸成功腺兴。
我們?cè)倏匆粋€(gè)登陸認(rèn)證的順序圖,可以更直觀地看到這個(gè)流程的順序:
通過這個(gè)新的登陸流程和之前老的登陸流程進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比踪古,大家就可以看出含长。老的登陸認(rèn)證流程,對(duì)于每一款游戲的服務(wù)器伏穆,都需要和每個(gè)渠道SDK進(jìn)行交互拘泞。但是新的流程,每個(gè)游戲服務(wù)器只需要和U8 Server 進(jìn)行交互就可以了枕扫,全部由U8 Server進(jìn)行第三方SDK的登陸認(rèn)證操作陪腌。同樣的,每開發(fā)一款游戲烟瞧,客戶端也只需要接入抽象的SDK接入層诗鸭,而不再需要去接入每個(gè)渠道的SDK了。所有客戶端的操作参滴,和服務(wù)器端的操作强岸,都只需要做那么一次就OK了。
那么砾赔,接下來蝌箍,我們?cè)賮砜纯粗Ц读鞒蹋绻皇褂眠@套框架暴心,我們直接接入SDK识颊,支付是什么樣子毁葱,我們以UC SDK為例:
1.“游戲客戶端”調(diào)用“SDK 客戶端”API 接口砍艾,提交充值信息码耐; “SDK 客戶端”引導(dǎo)用戶選擇不同的充值方式,輸入充值金額檀夹。
2.“SDK 客戶端”將sid筋粗、gameid策橘、serverid 以及對(duì)應(yīng)的充值信息提交給“SDK 服務(wù)器”;
3.“SDK 服務(wù)器”接收充值請(qǐng)求后亏狰,將返回對(duì)應(yīng)“訂單號(hào)”給“SDK 客戶端”役纹;
4.“SDK 客戶端”將回調(diào)通知“游戲客戶端”對(duì)應(yīng)的充值“訂單號(hào)”;
5.“游戲客戶端”將接收到的“訂單號(hào)”及相關(guān)的游戲角色信息(由游戲自行決定) 提交給“游戲服務(wù)器”暇唾;
6.“SDK 服務(wù)器”在處理完充值請(qǐng)求后促脉,將通過異步方式通知“游戲服務(wù)器”充值 結(jié)果。
7.“游戲服務(wù)器”向“SDK 服務(wù)器”返回是否成功接收充值結(jié)果的標(biāo)志(SUCCESS或FAILURE)策州。充值結(jié)果的成功或失敗與此處的接收標(biāo)志無關(guān)瘸味,不論充值是否成功,只 要“游戲服務(wù)器”能夠接收并識(shí)別充值結(jié)果通知够挂,都應(yīng)該向”SDK 服務(wù)器“返回成功標(biāo) 志(SUCCESS)
那么旁仿,我們現(xiàn)在要加入我們統(tǒng)一的支付中心,同樣針對(duì)多款游戲的孽糖,所以枯冈,我們不可以讓游戲服務(wù)器直接和每個(gè)渠道的SDK 服務(wù)器進(jìn)行交互,我們也增加一個(gè)統(tǒng)一支付服務(wù)器办悟,我們把支付中心的功能也加到U8 Server里尘奏。我們?cè)倏聪滦碌闹Ц读鞒蹋?/p>
1、游戲客戶端病蛉,首先請(qǐng)求游戲服務(wù)器要充值
2炫加、游戲服務(wù)器拿著該用戶的id和一些支付成功之后需要原樣返回的數(shù)據(jù),去訪問U8 Server申請(qǐng)訂單號(hào)
3铺然、U8 Server生成一個(gè)唯一的訂單號(hào)俗孝,同時(shí)數(shù)據(jù)庫中生成一條訂單記錄,狀態(tài)是正在支付狀態(tài)
4魄健、游戲服務(wù)器將訂單號(hào)返回給客戶端
5赋铝、游戲客戶端,拿到訂單號(hào)之后沽瘦,帶著訂單號(hào)以及游戲里充值相關(guān)的數(shù)據(jù)革骨,調(diào)用SDK抽象接口的支付接口,調(diào)用對(duì)應(yīng)的SDK支付界面其垄,進(jìn)行充值操作。
6卤橄、當(dāng)前SDK的渠道實(shí)現(xiàn)在調(diào)用SDK支付界面之前绿满,需要把剛剛的訂單號(hào),放到渠道SDK支付參數(shù)的自定義參數(shù)中窟扑。這個(gè)每個(gè)渠道都是一樣的喇颁。
7漏健、渠道SDK支付成功,立馬返回一個(gè)狀態(tài)
8橘霎、同時(shí)蔫浆,渠道SDK服務(wù)器會(huì)異步通知游戲開發(fā)商設(shè)置的支付回調(diào)地址。注意姐叁,游戲接入的時(shí)候瓦盛,這個(gè)回調(diào)地址要設(shè)置到u8 server提供的一個(gè)地址。
9外潜、u8 server收到充值回調(diào)原环,根據(jù)驗(yàn)證結(jié)果等判定,立馬給渠道SDK服務(wù)器返回一個(gè)成功或者失敗的狀態(tài)处窥。
10嘱吗、然后u8 server根據(jù)自定義參數(shù)中的orderID,查詢到對(duì)應(yīng)的訂單信息滔驾,再根據(jù)訂單信息谒麦,獲取到當(dāng)前用戶信息和對(duì)應(yīng)的游戲信息,然后調(diào)用接入游戲之前哆致,游戲服務(wù)器提供給u8 server的支付回調(diào)地址绕德。這個(gè)回調(diào)地址,游戲服務(wù)器只需要提供一個(gè)給u8 server就可以了沽瞭。因?yàn)橛螒蚍?wù)器只和u8 server交互迁匠。
11、游戲服務(wù)器收到回調(diào)驹溃,驗(yàn)證成功與否城丧,里面返回給u8 server一個(gè)成功或者失敗的信息。同時(shí)豌鹤,給對(duì)應(yīng)的玩家加游戲幣亡哄。
這樣,大家通過對(duì)比兩個(gè)支付流程圖布疙,可以清晰地發(fā)現(xiàn)蚊惯,新的流程,可以做到只接入一次灵临,后面多款游戲截型,可以共同使用。那么這個(gè)就作為我們這個(gè)框架的支付流程儒溉。我們?cè)侔l(fā)個(gè)順序圖宦焦,可以更直觀地看下整個(gè)流程:
所以,通過對(duì)整個(gè)框架需要實(shí)現(xiàn)的功能的分析,我們?cè)O(shè)計(jì)了一套可以實(shí)現(xiàn)統(tǒng)一SDK登陸認(rèn)證和支付中心的架構(gòu)波闹。那么接下來酝豪,我們就會(huì)具體的來實(shí)現(xiàn)每一個(gè)部分。包括抽象的SDK接入框架精堕,游戲客戶端怎么接入這個(gè)抽象的SDK接入框架孵淘,各個(gè)渠道SDK怎么整合到這個(gè)SDK框架中來,怎么實(shí)現(xiàn)一鍵打包工具歹篓,怎么實(shí)現(xiàn)這個(gè)統(tǒng)一的登陸認(rèn)證中心和支付中心瘫证。