苹果内购那些事

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

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

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

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

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、 具体是哪一张后续继续更新❗️
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容

  • 原文地址:http://blog.csdn.net/xiaominghimi/article/details/69...
    LuxDark阅读 5,966评论 2 4
  • 做了很多电商的项目了,都在用各大第三方支付,作为一名iOS开发,苹果已经在强制推行内购了,所以,你不得不了解一下啦...
    Xcode_6阅读 1,176评论 0 0
  • 2017、10、31 深圳 晴 前两天进了一个学习如何发声,如果发出好听的声音群,群里面有老师讲解怎...
    梅子日记阅读 196评论 3 5
  • 本文翻译自Matt Galloway的博客 之前的文章(译)窥探Blocks(1)我们已经了解了block的内部原...
    foolishBoy阅读 1,097评论 0 2
  • 痰湿体质最常见的外在表现是“肥胖”,而湿热体质的就是痘痘。我们有时也可以遇到一些四五十岁的人也还在长痘,这究竟是为...
    乾小龙阅读 656评论 0 0