IOS OC IPA内购流程

IOS 内购分为四种商品类型:

  1. 消耗品项目
  2. 非消耗品项目
  3. 自动续期订阅
  4. 非续期订阅

基本实现流程

  1. 添加支付监听
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

2.删除支付监听
在界面销毁处,添加删除支付监听,或者在 deallo方法处销毁

 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

3.查询商品
IOS的查询商品信息、支付,都需要先调用以下方法,获取SKProduct后,进行购买。

 SKProductsRequest *buyRequets = [[SKProductsRequest alloc] initWithProductIdentifiers:productIDs];
        buyRequets.delegate = self;
        [buyRequets start];

4.实现SKProductsRequestDelegate接口

//MARK: - SKProductsRequestDelegate
//接受到产品返回的信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
   
   NSArray *products = response.products;
    if (products == nil || products.count <= 0) {
        DLog(@"商品均不存在,请检查传递的商品ID"); 
        return;
    }
    if (response.invalidProductIdentifiers.count > 0) {
        DLog(@"不可用的商品ID: %@",response.invalidProductIdentifiers); 
    }
    //向苹果发送请求
    for(SKProduct *product in products){
         if ([self.productIdentifier isEqualToString:product.productIdentifier] ) {
         //self.productIdentifier 研发传递过来需要购买的商品ID
            //支付逻辑
           SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
            payment.applicationUsername = applicationUsername;
            [[SKPaymentQueue defaultQueue] addPayment:payment];
        }
    }
}
  1. 实现SKRequestDelegate接口
//MARK: - SKRequestDelegate 
//请求商品列表等请求完后的回调
- (void)requestDidFinish:(SKRequest *)request {
    if ([request isMemberOfClass:[SKReceiptRefreshRequest class]]) {
        DLog(@"刷新凭据完成,开始检查是否有遗留的校验订单");
        //此处需要重新校验订单 
    }
    DLog(@"反馈信息结束");
}
//请求商品列表失败等回调
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    DLog(@"购买请求错误: %@", error); 
}
  1. 实现SKPaymentTransactionObserver接口
    当用户进入购买流程后,购买结果会在次回调中响应。
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
    for (SKPaymentTransaction *tran in transactions) {
        switch (tran.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                DLog(@"商品加入列表"); 
                break;
            case SKPaymentTransactionStatePurchased:{
                DLog(@"商品购买成功");                
                NSString *applicationUsername = tran.payment.applicationUsername;
                NSString *orginalID;
                if (tran.originalTransaction) {
                    orginalID = tran.originalTransaction.transactionIdentifier;
                    // 如果是自动续费的订单,originalTransaction会有内容
                    DLog(@"自动续费的订单,originalTransaction =%@",tran.originalTransaction);
                } else {
                    // 普通购买,以及第一次购买自动订阅
                    DLog(@"普通购买,以及第一次购买自动订阅");
                } 
               
                [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                break;
            } 
            case SKPaymentTransactionStateFailed:
               { 
                   DLog(@"商品购买失败");
                   [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 
                }
                break;
            case SKPaymentTransactionStateRestored:
                DLog(@"已经购买过此商品 =%@",tran.payment.productIdentifier); 
                [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                break;
            case SKPaymentTransactionStateDeferred:
                DLog(@"交易状态未决定"); 
                break;
            default:
                 [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                break;
        }
    }
} 

//所有的Restore结束后,进入此回调
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
 
}

如果需要透传参数(把参数传递给苹果服务器,然后再把此参数原样返回,可用于标识用户),需要设置:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
 //设置透传参数
 payment.applicationUsername = applicationUsername;

获取透传参数:
transaction.payment.applicationUsername

对于 1.非消耗 2.自动续期订阅 3.非续期订阅 要提供restore功能

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值