IOS 内购分为四种商品类型:
- 消耗品项目
- 非消耗品项目
- 自动续期订阅
- 非续期订阅
基本实现流程
- 添加支付监听
[[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];
}
}
}
- 实现SKRequestDelegate接口
//MARK: - SKRequestDelegate
//请求商品列表等请求完后的回调
- (void)requestDidFinish:(SKRequest *)request {
if ([request isMemberOfClass:[SKReceiptRefreshRequest class]]) {
DLog(@"刷新凭据完成,开始检查是否有遗留的校验订单");
//此处需要重新校验订单
}
DLog(@"反馈信息结束");
}
//请求商品列表失败等回调
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
DLog(@"购买请求错误: %@", error);
}
- 实现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];