關(guān)于IAP防止破解的幾點(diǎn)
1 推薦大家使用ECPurchase,verifyRecepitMode使用ECVerifyRecepitModeiPhone,會和apple的服務(wù) 器再做一次驗(yàn)證,負(fù)作用是可能購買時間稍長一些。不要是使用ECVerifyRecepitModeNone模式。然后 ECVerifyRecepitModeServer模式,在ECPurchase里面和ECVerifyRecepitModeiPhone一樣的作 用,沒有經(jīng)過自己的服務(wù)器驗(yàn)證,需要重寫,參考3。
2 破解的原理,這里就不討論了,根源是Objective-C的runtime的副作用。
3 聯(lián)網(wǎng)游戲,關(guān)鍵數(shù)據(jù)應(yīng)該存儲在服務(wù)器,然后將apple服務(wù)器的json數(shù)據(jù)發(fā)給自己服務(wù)器,再發(fā)到apple服務(wù)器做驗(yàn)證。驗(yàn)證失敗后,你可以任意處理這個用戶了。
4 非聯(lián)網(wǎng)游戲,先做好第1點(diǎn)吧,有精力的可以參考第3點(diǎn)。不能根治,就是因?yàn)?了。
附上服務(wù)器端驗(yàn)證,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);//跟隨頁面的跳轉(zhuǎn)
- // 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