iOS_应用内支付

 该文档的前提是 iTunes connect 上已经创建了应用,及证书、配置文件等

内购项目的创建

1. 点击➕ 添加内购项目

2.选择创建的app内购项目的类型

3.

 

iOS 端开发

1.在工程中引入storekit.framework 和 #import "StoreKit/StoreKit.h"

2.获取所有的付费ProductID列表。这个可以用常量存储在本地,也可以有自己的服务器返回。

3.制作一个界面,展示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但是不带服务器的单机游戏应用或者工具类应用,则可以通过向App Store 查询获得。 App Store 查询获得非常慢,不建议使用。

4.当用户点击了一个IAP项目,我们需要先查询用户是否允许应用内付费,如果不允许则不用进行一下步骤了。代码如下:

if ([SKPaymentQueue canMakePayments]){
    [self getProductInfo];  
}else{
    NSLog(@"失败,用户禁止应用内付费购买");
}

5.我们先通过该IAP的Product ID向App Store查询,获得SKPayment 实例,然后通过SKPaymentQueue的addPayment 方法发起一个购买操作。代码如下:

//  下面的Product ID 应该是事先在ITunes Connect中添加好的,已存在的付费项目。否则会查询失败
- (void) getProductInfo{
      NSSet *set = [NSSet setWithArray:@[@"ProductId"]];
      SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
       request.delegate = self;
       [request start];
}
// 以上查询的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
      NSArray *product = response.products;
      if(product.count == 0){
         NSLog(@"无法获取购买产品信息,购买失败");
       }
       SKPayment *payment = [SKPayment paymentWithProduct: product[0]];
       [[SKPaymentQueue defaultQueue] addPayment:payment];
}

6.在viewDidLoad方法中,将购买页面设置购买的Observer。代码如下:

- (void)viewDidLoad{
   [super viewDidLoad];
   // 监听购买结果
   [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
- (void)dealloc{
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
    
}

7.当用户购买的操作有结果是,就会触发下面的回调方法,想要进行处理,代码如下:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
    for(SKPaymentTransaction *tran in transaction){
        NSLog(@"get transaction id is %@",tran.transactionIdentifier);
        switch (tran.transactionState) {
            case SKPaymentTransactionStatePurchased:
                NSLog(@"交易完成");
                [self completeTransaction:tran];
                break;
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"商品添加进列表");
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"已经购买过商品");
                [self restoreTransaction:tran];
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"交易失败---%@--------",tran.error);
                [self failedTransaction:tran];
                break;
            default:
                break;
        }
     }
}

- (void)completeTransaction:(SKPaymentTransaction *)transaction{
   NSString *productIdentifier =  transaction.payment.productIdentifier;
   NSString *receipt = [transaction.transactionReceipt base64EcodedString];
   if (receipt.length > 0){
      // 向自己的服务器验证购买凭证
   }

     // remove the transaction from the payment queue
     [[SKPaymenQueue defaultQueue] finishTransaction:transaction];

}    

- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    if(transaction.error.code != SKErrorpaymentCancelled){
         NSLog(@"购买失败");
    }else{
         NSLog(@"用户取消交易");
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
     
} 
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    // 对于已购买商品,处理回复购买的逻辑    
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
}

8.服务器验证凭证,这是可选的。如果购买成功,我们需要将凭证发送到服务器上进行验证,考虑到网络异常的情况,iOS端的发送凭证操作用过进行持久化,如果程序退出或者崩溃/网络异常,可以恢复重试。

 

posted on 2017-05-04 17:04  黄小逗  阅读(200)  评论(0)    收藏  举报

导航