iOS内购实现及测试Check List
在内购使用中存在的几种丢单的情况
1.客户端获取到交易回调后-(void) purchasedTransaction: (SKPaymentTransaction *)transaction 后在交易成功的情况下,要拿到
transactionReceipt凭证,给后台验证的时候用户推出。(用户已经付钱但商家还没给商品)


    解决方法:在支付之前需要通过自己的服务器创建订单,在交易成功回调之后,立马将该订单和本次交易凭证存储到数据库中。在用户下次登录的时候,要首先验证该数据库中的交易凭证是否都经过后台验证过并成功给玩家商品。


2.这种情况是当交易回调有延时或者没有成功回调的时候,用户推出游戏。这个时候没有回调的transaction,无法将transactionReceipt和自己创建的订单绑定,也就是无法知道交易的用户。(感觉苹果这边有BUG,起码在交易对象中包含用户的数据)。这个时候,用户再下次登录的时候可以获取到transaction,但无法确定该交易的用户。


   解决方法:在下次购买的时候,从购买队列中获取交易集合,对已经成功购买,但没下载的不需要重复购买,终止本地交易,将其存入已购买数据库中。


  但还有一个问题,对于上次没有回调回来的交易,我们无法处理,以为虽然拿到了交易集合,但只凭借交易对象是无法知道用户信息的,也就无法充值。也就是说无法避免的丢单问题.................


找到解决办法了:ios7 苹果增加了一个属性applicationusername,SKMutablepayment的属性,所以用户在发起支付的时候可以指定用户的username及自己生成的订单,这样用户再下次得到回调的时候就知道,此交易是哪个订单发起的了进而完成交易。回调中获取username。


transaction.payment.applicationUsername(订单)将该属性连同transactionReceipt 传给后台做验证。完美解决问题 perfect