IOS IAP开发
开发中遇到的几个问题:
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发送的假凭证时,要那样做呢?看一下下面的这两个凭证的比较,这是我找到的判断方法。
正确的凭证的格式如下:
不正确的凭证格式如下: