苹果内购那些事

在内购项目中的那些奇葩事

一、 首先就是在自己的开发者账号中设置的一些乱七八糟的东西,在我们公司这些东西都是运营的哥哥姐姐们搞得,不过在其它的博客中也有详细的说明,我也不再多说。

注意:在开始撸代码的时候银行卡的一些税务信息必须是通过苹果审核通过的,否则是无法撸代码进行测试的。

二、 接下来就是搞代码的时候了:

1、 #import <StoreKit/StoreKit.h>导入文件
2、 <SKPaymentTransactionObserver,SKProductsRequestDelegate,SKRequestDelegate>这些代理协议是必须遵守的
3、 在你的充值控制器里面自定义自己的方法
/**
 请求产品信息
 @param product prodect
 */
-(void)requestProductData:(NSString *)product;
/**
是否允许购买
 @param buy buy
 */
- (void)allowedBuy:(NSString *)buy;
/**
交易结果
 @param queue queue
 @param transactions ransactions
 * /
- (void)paymentQueue:(SKPaymentQueue *)queue         updatedTransactions:(NSArray *)transactions;
/**
 购买交易
 @param transaction transaction
 */
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
/**
 交易完成
 @param transaction transaction
 */
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
/**
 交易失败
@param transaction transaction
 */
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
去实现这些方法
1.、在ViewDidLoad里面添加苹果的监听
//添加苹果支付监听
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2、 在dealloc里面接触这个监听
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除监听
3、 #pragma mark -- /*苹果支付*/
/**
 是否允许购买
 @param buy buy
 */
- (void)allowedBuy:(NSString *)buy {
    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"允许程序内购买此商品");
        [self requestProductData:buy];    
    }else {
        NSLog(@"不允许程序内购买此商品");
    }
}
/**
 请求产品信息
 @param product prodect
 */
-(void)requestProductData:(NSString *)product {
    NSArray *productArray = @[product];
    NSSet *productSet = [NSSet setWithArray:productArray];//集合
    //开始请求
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet];
    request.delegate = self;
    [request start];
}
/**
 收到产品的反馈信息
 @param request request
 @param response response
 */
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *myProduct = response.products;
    SKProduct *p = nil;
    for (SKProduct *product in myProduct) {    
    p = product;
    }
    SKPayment *payment = [SKPayment paymentWithProduct:p];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
/**
 请求失败
 @param request request
 @param error error
 */
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    [self.loading stop];
    UIAlertController *alertController = [[UIAlertController alloc] init];
    UIAlertAction *errorAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Alert", NULL) style:UIAlertActionStyleCancel handler:nil];
    [alertController addAction:errorAction];
    [self presentViewController:alertController animated:YES completion:nil];
}
/**
 结束反馈
 @param request request
 */
- (void)requestDidFinish:(SKRequest *)request {
    NSLog(@"-----反馈结束-----");
}
/**
 交易结果
 @param queue queue
 @param transactions ransactions
 */
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased: {//交易完成
                [self completeTransaction:transaction];
            }
                break;
            case SKPaymentTransactionStateFailed: {
                //交易失败
                [self failedTransaction:transaction];
            }
                break;
            case SKPaymentTransactionStateRestored: {    
            }
                break;
            case SKPaymentTransactionStatePurchasing:      //商品添加进列表
                break;
            default:
                break;
        }
    }
}
/**
 购买交易
 @param transaction transaction
 */
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction {
    NSLog(@"-----购买交易----");
    NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
/**
 交易完成
 @param transaction transaction
 */
- (void) completeTransaction: (SKPaymentTransaction *)transaction { 
    NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:recepitURL];
    NSDictionary *requestContents = @{
                                  @"receipt": [receipt base64EncodedStringWithOptions:0]
                                  };
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
/*中间在这个地方做二次验证,可以去服务器验证也可以在客户端完成验证,建议在服务器验证(但是时间稍微慢一点) 根据个人需求吧 */
}
/**
 交易失败
 @param transaction transaction
 */
- (void) failedTransaction: (SKPaymentTransaction *)transaction     {    
    [self.loading stop];
    if (transaction.error.code != SKErrorPaymentCancelled)
{    
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

特别注意:
1、 在提交审核的时候App内购项目的产品名称建议统一化,包括在购买界面的显示问题。否则被苹果打回的可能性非常高❗️
2、 记得在内购的地方上传内购的照片,有的app上传的是购买列表的照片,有的app是上传的购买成功的照片。
3、 具体是哪一张后续继续更新❗️

推荐阅读更多精彩内容