1 推荐大家使用ECPurchase,verifyRecepitMode使用ECVerifyRecepitModeiPhone,会和apple的服务 器再做一次验证,负作用是可能购买时间稍长一些。不要是使用ECVerifyRecepitModeNone模式。然后 ECVerifyRecepitModeServer模式,在ECPurchase里面和ECVerifyRecepitModeiPhone一样的作 用,没有经过自己的服务器验证,需要重写,参考3。
2 破解的原理,这里就不讨论了,根源是Objective-C的runtime的副作用。
3 联网游戏,关键数据应该存储在服务器,然后将apple服务器的json数据发给自己服务器,再发到apple服务器做验证。验证失败后,你可以任意处理这个用户了。
4 非联网游戏,先做好第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){
- //修改虚拟货币道具
- }
- }
- /**
- * 发送请求
- */
- 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