關于IAP防止破解的幾點
1 推薦大家使用ECPurchase,verifyRecepitMode使用ECVerifyRecepitModeiPhone,會和apple的服務 器再做一次驗證,負作用是可能購買時間稍長一些。不要是使用ECVerifyRecepitModeNone模式。然后 ECVerifyRecepitModeServer模式,在ECPurchase里面和ECVerifyRecepitModeiPhone一樣的作 用,沒有經(jīng)過自己的服務器驗證,需要重寫,參考3。
2 破解的原理,這里就不討論了,根源是Objective-C的runtime的副作用。
3 聯(lián)網(wǎng)游戲,關鍵數(shù)據(jù)應該存儲在服務器,然后將apple服務器的json數(shù)據(jù)發(fā)給自己服務器,再發(fā)到apple服務器做驗證。驗證失敗后,你可以任意處理這個用戶了。
4 非聯(lián)網(wǎng)游戲,先做好第1點吧,有精力的可以參考第3點。不能根治,就是因為2了。
附上服務器端驗證,php的代碼:
- <?php
- public function recharge($params){
- $url = "https://buy.itunes.apple.com/verifyReceipt";
- $receipt = json_encode(array("receipt-data" => $base_key));
- $response_json = $this->getHeader($url, $receipt);
- $response = json_decode($response_json['content'], true);
- if($response['status'] == 0){
- //修改虛擬貨幣道具
- }
- }
- /**
- * 發(fā)送請求
- */
- protected function getHeader($url, $data){
- $ch = curl_init();
- $timeout = 300; // set to zero for no timeout
- curl_setopt($ch, CURLOPT_URL, $url);
- // curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); //post到https
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);//跟隨頁面的跳轉
- // curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
- $handles = curl_exec($ch);
- $header = curl_getinfo($ch);
- curl_close($ch);
- $header['content'] = $handles;
- return $header;
- }
- ?>
附件ECPurchase的zip包下載地址:http://down.51cto.com/data/937473