IOS IAP开发
具体的开发流程可以参考一下几篇文章:
http://blog.devtang.com/blog/2012/12/09/in-app-purchase-check-list/
http://www.himigame.com/iphone-cocos2d/550.html
开发中遇到的几个问题:
1、在程序开发的测试阶段,使用创建好的测试账号,如果点击购买后可以获得产品的id,但是还是进入到这个方法中-(void)failedTransaction:(SKPaymentTransaction*)transaction {
if(transaction.error.code!= SKErrorPaymentCancelled) {
[loadingView dismissWithMessage:NSLocalizedString(@"buyFail",
nil)];
} else {
[loadingView dismiss];
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
提示购买失败。是因为使用测试账户购买自己的产品,与购买正式的产品一样,所以我们的手机也要绑定这个测试账户。到手机的设置—>iTunes Store和App Store中注销当前用户,然后添加进测试账户。再运行程序就可以购买了。
2、[SKPaymentQueue
defaultQueue] removeTransactionObserver:self];要放在dealloc里面移除。dealloc在页面消失时会执行,在这样将其移除后,当再进入这个界面时又会执行viewDidLoad方法,还会再注册一次。
3、在itunes connect中提交程序时也要将应用内购买的产品,一起提交进行审核,在创建应用内购买的产品时,要将产品截图上传,如果没有具体的东西可以截图,截取产品列表页面也行,这个截图不会在app store显示出来。
如果不将产品提交,那么应用直接会被拒绝!!
4、在PHP端进行处理时,先验证凭证是否存在,存在了则不处理,不存在则将凭证存储在服务器上。然后像苹果服务器发送请求,验证凭证的有效性。
<?php /* this little script is intended for in-app purchasing on iOS devices params receipt-data=[receipt-data] */ include("conn_db.php"); error_reporting(55); $uuid =$_POST['uuid']; //先验证此凭证是否已经存在 $sql=mysql_query("select* from Receipt where uuid = '".$uuid."' and receipt ='".$rec."'"); if(mysql_num_rows($sql)>0){ echo"1"; //凭证已经存在了 } else{ //将凭证进行存储 $sql =mysql_query("insert into Receipt (id, uuid, receipt) values (null,'".$uuid."', '".$rec."')"); //向苹果服务器进行二次请求 $receipt =json_encode(array('receipt-data' => $rec)); //$url ="https://sandbox.itunes.apple.com/verifyReceipt";测试的时候请求这个 $url ="https://buy.itunes.apple.com/verifyReceipt"; // curl options tomake it all work correctly $curl_handle=curl_init(); curl_setopt($curl_handle,CURLOPT_URL, $url); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, true); curl_setopt($curl_handle,CURLOPT_HEADER, 0); curl_setopt($curl_handle,CURLOPT_POST, true); curl_setopt($curl_handle,CURLOPT_POSTFIELDS, $receipt); curl_setopt($curl_handle,CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl_handle,CURLOPT_SSL_VERIFYPEER, 0); $response_json =curl_exec($curl_handle); $response =json_decode($response_json); curl_close($curl_handle); $receipt_resp =$response->{'receipt'}; if($receipt_resp->{'bid'}!=”自己应用的bundle id”){ echo"3"; //iap free发送的假凭证 } else{ // if thereceipt-data request returs 0, all went well and we can proceed if($response->{'status'} == "0") { //成功付款后的操作,如给用户积分或下载资源等等。 echo"4"; //购买成功 } else{ echo"2"; //假凭证 } } } ?>
为什么验证是否为iap free发送的假凭证时,要那样做呢?看一下下面的这两个凭证的比较,这是我找到的判断方法。
正确的凭证的格式如下:
不正确的凭证格式如下: