苹果内购那些事

作者: 没有名字就是我的名字 | 来源:发表于2017-01-12 12:24 被阅读334次
在内购项目中的那些奇葩事

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

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

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

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、 具体是哪一张后续继续更新❗️

相关文章

  • 苹果内购那些事

    在内购项目中的那些奇葩事 一、 首先就是在自己的开发者账号中设置的一些乱七八糟的东西,在我们公司这些东西都是运营的...

  • 苹果内购In-app purchase

    关于苹果内购(IAP)的一些问题以及那些坑: 最近在研究苹果内购功能,所以,在网上找了一些资料,进行学习。但是,内...

  • 苹果内购那些事儿

    1.简介 苹果内购是指Apple Store的应用内购买,是苹果为App内购买虚拟商品或服务提供的一套交易系统。 ...

  • iOS 11 如何测试苹果商店内内购

    如何测试苹果商店内内购? 有什么现象? 0、苹果商店的内购,用户在苹果商店中选择内购产品时,如果用户已经安装好此应...

  • 苹果内购和Apple Pay 的区别

    苹果内购 和 Apple Pay 的区别 关注苹果支付和内购也是从苹果发布打赏功能必须走“内购”流程后,引发微信以...

  • 苹果内购流程

    苹果内购流程

  • 苹果内购

    先附上一篇介绍怎么填写协议、税务和银行业务的文章 本文主要介绍内购代码部分 首先导入StoreKit/StoreK...

  • 苹果内购

    代码经过验证,但是这里只提供了iap相关的代码,有依赖其他的代码自行删减 直接上代码

  • 苹果内购

    内购简介: 在APP里面购买一些东西的时候,必须要使用苹果的支付方式进行购买.如果你的APP当中销售的商品,跟AP...

  • 苹果内购

    1.登录开发者中心[开发者中心链接](https://developer.apple.com) 2.点击iTune...

网友评论

    本文标题:苹果内购那些事

    本文链接:https://www.haomeiwen.com/subject/aqpdbttx.html