移动开发iOS技术中心内购

说说IOS内购那些事

2016-09-13  本文已影响2494人  萧子然

1.支付类和协议

Store Kit框架下提供用来处理应用内购大致的类可以分为两部分:1.请求商品,2.购买商品。具体如下:
Store Kit框架下提供以下协议用来处理请求事件

2.一般的内购流程

2.1 场景

用户点击进入一个内购页面,页面刷新当前版本支持的内购商品列表,用户点击商品列表中的一个商品,弹出app strore帐号校验,完成校验后,弹出提示框询问用户是否购买,点击购买或是取消。

2.2 流程

  1. 获取商品列表:这里获取商品列表,分两步,首先是从自己的服务器获取,其次是从app store获取。最终都是以app store获取为准。具体过程有以下几步:

  2. 每次进入商品列表界面都会直接去自己的服务器拉取。

  3. 拉取列表成功后,查询本地是否缓存了商品列表中的每一个商品id,

  4. 如果所有商品都已经缓存了,则直接返回商品列表,

  5. 如果校验发现有商品没有缓存(商品更新),此时,清空当前缓存,

  6. 并且直接去app store拉取商品列表,拉取成功后缓存再返回。

  7. 购买商品:点击某个商品进程购买,具体流程有以下几步:

  8. 检验当前是否支持内购(网络环境,权限等)

  9. 根据当前点击的商品,向自己的服务器去申请订单,如果申请订单成功

  10. 向app store发起支付请求,如果申请订单失败,直接返回提示信息

  11. 监听并等待app store返回支付交易信息。

  12. 如果交易完成,向自己的服务器更新订单状态,并结束完成app store交易。

  13. 如果交易失败,并结束完成app store交易。

  14. 如果交易取消,向自己的服务器取消订单,并结束完成app store交易。

2.3 状态处理

整个内购流程里面可分为两种类型的状态,一种是支付行为状态,就是从想苹果发起支付请求开始,中间包括支付校验的取消,确定两种行为状态,最后返回的支付交易完成和失败。一种是针对自己服务器的订单校验的状态,主要是开始校验,成功,失败,已校验,无法校验几种。

  1. 支付行为状态:该状态是通过监听app store回调来做区别处理。
  1. 本地订单校验凭证状态:该状态是根据支付行为状态用来对服务器的订单凭证进行管理。

细节处理

1.缓存

主要缓存:商品列表信息,支付凭证信息。

  1. 商品列表信息:每次进入内购界面时,根据从服务器拉取的商品信息与本地缓存做比较后,如果保持一直,则直接返回,如果存在差异,则还需要从app store拉取商品信息,再更新本地缓存后返回。

  2. 支付凭证信息:缓存每次交易支付凭证,用来与服务器订单进行校验。针对校验失败的凭证,会采取多次校验。每次进入商品购买时,需要对上次缓存的未成功的支付凭证进行再次校验。以确保服务器订单状态正确。

2.流程顺序

具体流程以伪代码

  1. 获取商品列表

      - (void)fetchProducts:(xxxCompletBlock)complete {
          if (![netWork isAvalabel]) {
          if (complete)
            complete(....);
        }
    
          [[ProductsOrderModel shareInstance] fetchProductsFromServer:xxxx complete:^(BOOL success, NSArry* products,.....) {
          if (success) {
          // 检验本地缓存
          NSArry* cacheProducts = [[ProductOrderCache shareInstance] cacheProducte];
          ......
    
        //缓存与服务器一直
        if (complete) 
          complete(....);
    
        //如果不一致,再去app store拉取
        [ProductOrderCache shareInstance] cleanCacheProducte];
        [[ProductsOrderModel shareInstance] fetchProductsFromApple:xxxx     complete:^(BOOL success, NSArry* products,.....) {
            if (complete) 
              complete(....);
              ...
            }]; 
          } else {
          .....
        }
      }]; 
    }
    
  2. 支付

  - (void)orderProduct:(NSString*)id complete:(xxxCompletBlock)complete {
     //先去服务器获取订单
    [[ProductsOrderModel shareInstance] fetchOrderFromServer:id  complete:^(BOOL success, ...) {
        if (success) {
       //发起苹果支付

       SKPayment * payment = [SKPayment paymentWithProduct:product];
       [[SKPaymentQueue defaultQueue] addPayment:payment];
     } else {
         ....
     }
   }];
 }

 //苹果支付回调
 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

 for (SKPaymentTransaction *transaction in transactions)
 {
     switch (transaction.transactionState)
     {
         case SKPaymentTransactionStatePurchased:
             [self completeTransaction:transaction state:xxx_Succeed];
             break;
         case SKPaymentTransactionStateFailed:
             [self completeTransaction:transaction state:xxx_Failed];
             break;
         case SKPaymentTransactionStateRestored:
             [self completeTransaction:transaction state:xxx_Succeed];
             break;
         case SKPaymentTransactionStatePurchasing:
             break;
         default:
             break;
     }
   }
 }

 - (void)completeTransaction:transaction state:(xxx_State)state {
   switch(state) {
     case xxx_Succeed:
     {
     //拿到苹果返回的凭证去和服务进行校验
     [ProductsOrderModel shareInstance] verifyTransactionReceipt:xxx orderId:xxx complete:^(BOOL success, xxxx) {
     if (success) {
     // 更新缓存状态
          [[ProductOrderCache shareInstance] updateOrderState:xxxid state:YES];
           ...
          } else {
         // 再次校验
          ...
         }
       }];
       }
     break;

   case xxx_Failed:
   {
   // 更新缓存状态
     [[ProductOrderCache shareInstance] updateOrderState:xxxid state:NO];
    }
   break;
   default:
       break;
     }
   }

3.其他

  1. 每次进行购买时,需要对本地缓存的上一次失败凭证进行再次校验。
  2. 商品列表信息,支付凭证信息需要做文件缓存。
上一篇下一篇

猜你喜欢

热点阅读