標籤:這不 des pps 問題 pos datawit 好的 遊戲伺服器 ios8
iOS的in-app purchase實現,早在ios4的時候,我實現了一次,這次升級到ios8,重新看了下文檔,ios本身有了更新,加上這次我們要做伺服器二次驗證,還是好好摸索了下。
首先我要說的是,ios的文檔內雖然給出了伺服器驗證的代碼,但是完全是用object-c實現的。我想這本身沒什麼太多價值吧。至少我還沒遇見用oc來實現遊戲邏輯伺服器的。如果是應用,可能很多人會使用PHP,asp,或者Java來實現伺服器,那麼這塊我就不說了,網上可以搜到非常多的資料。我這裡著重介紹C#伺服器的實現(為什麼遊戲伺服器用C#,不用C++?項目就是這樣,也就不解釋了)。用戶端的代碼網上到處都是了,不再羅列
設計思路:
注意點:
1.ios7以後的版本,transaction中的transactionReceipt已經被淘汰,雖然目前到8.1.3為止,仍舊可以訪問該變數,但是誰知道哪天就不行了呢,正確的存取方法
NSURL *url = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData datawithContentsOfURL:url];
2.接下來很容易出現問題的部分,按照ios的文檔,此時你需要把這個NSData*的收據資料發送到你的伺服器上進行二次驗證,ios很輕巧的給出了一段oc的範例代碼。(但是有幾個人會用OC來寫遊戲伺服器啊,範例代碼完全沒有參考價值)。也就是說,此時,我們需要把NSData*轉換成我們伺服器能讀取的資料格式,大部分的伺服器代碼(java,php,c++,C#)我們會使用byte數組,或是string,char數組來傳遞。我們的項目比較特殊,使用了Unity3D的介面,所以只接受string格式。
這裡我要說的是,我看到網上有人,包括unity3d的某個外掛程式是在用戶端上直接使用httpwebrequest的方式,然後用戶端直接處理httpwebresponse,這種做法可以獲得正確的驗證,但這不是伺服器二次驗證,因為根本沒有遞交到伺服器上,只是在用戶端代為行使了伺服器的權利。還有網上有文章介紹在用戶端使用httprequest把資料POST到伺服器,再由伺服器POST給app store,我沒有試過這種方式,但是我一樣覺得這完全多此一舉,且麻煩。最佳的方式,就應該是像ios文檔描述的那樣,使用socket發送給伺服器,由伺服器post給app store。
但是要注意的是,此時讀取出來的NSData*不能直接轉NSString*,可能裡面由結束符,直接轉的話,你將無法獲得完整或是正確的字串。所以直接調用NSData的base64EncodeString,才能轉出爭取完整的字串。(其實這步更好的是放到伺服器上去加密,假如你不像我一樣必須傳遞給伺服器string類型的話,你可以直接把NSData傳遞給本地的socket,但是我估計,無論此時你本地是C++還是C#,如果你不適用基於64的加密程式,直接轉string,都會出現無法正確轉出字串的,如果你能把NSData轉byte數組來傳遞,也許就沒有這個問題了)
3.伺服器收到加密後的字串,然後使用httpwebrequest post資料。注意,post的body主體必須是json字串,{“receipt-data”:“伺服器收到的收據資料”},大括弧也是要的哦,我因為沒有加大括弧,曾不停的出現{“status”:21002}的錯誤
4.設定HttpwebRequest
method肯定是POST,這個不多說
ContentType可以是"application/x-www-form-urlencoded"或者“application/json”
ContentLength可以設,可以不設,看你怎麼傳遞資料,
Body就是你要傳給appstore的JSON字串,在C#裡沒有這個變數,直接使用流寫入,PHP,java等有,所以看用什麼語言實現了
iOS的in-app purchase C#伺服器二次驗證實現