您的位置:首页 > 移动开发 > IOS开发

IOS应用内购买(IAP)开发时遇到的几个问题总结

2013-10-12 15:53 811 查看
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发送的假凭证时,要那样做呢?看一下下面的这两个凭证的比较,这是我找到的判断方法。

正确的凭证的格式如下:



不正确的凭证格式如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: