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端的发送凭证操作用过进行持久化,如果程序退出或者崩溃/网络异常,可以恢复重试。
浙公网安备 33010602011771号