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

正确的凭证的格式如下:

iOS的IAP四种购买类型的规则 iap购买失败,用户取消_应用内购买

不正确的凭证格式如下:

iOS的IAP四种购买类型的规则 iap购买失败,用户取消_应用内购买_02