苹果内购(IAP)使用

0.前言:

实在躲不过去了,只能妥协了。😸

1.准备工作:

1.1.在ASC配置协议、税务和银行业务的信息,这一步可以交给PM完成。
1.2.在ASC里面配置项目的内购项。首次添加内购项时,内购项填写完整后需要和主项目一起提交审核。后期新增内购项时可以在内购项列表里面单独添加。


1.2.内购项配置.png

注意:
①内购项配置时的产品ID必须唯一,不能重复。(和已删除的也不要重复)
②根据自己的实际业务选择消费类型。


消费类型.png

2.配置沙箱账号:

2.1.登录ASC,选择“用户和访问”,选择“沙盒”里面的“测试员”,点击“+”弹出配置页,如图2.1.


2.1.沙盒测试账号配置页.png

注意事项:
①里面的所有信息均不必是真实信息,可以随便填写。
②电子邮件:可以随便填写,但必须不能和现有的真实账号重复(尽量蒙个唯一的)。

3.代码集成

3.1.新建一个iap的单例类:iapTool。
说明:之所以用单例来实现,就是为了保证订单的生命周期,防止交易中,由于当前类销毁导致的一系列问题。

3.2.在iapTool.m中引入系统的内购头文件

import <StoreKit/StoreKit.h>

3.3.遵循两个代理

<SKPaymentTransactionObserver,
SKProductsRequestDelegate>

3.4.在iapTool初始化里面添加支付监听。
说明:之所以在此处添加监听是为了保证监听的完整性以及监听的可复用性。

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

3.5.根据内购项ID(ASC里面自己配置的),去苹果服务器请求产品信息。

//检测是否允许内购
if ([SKPaymentQueue canMakePayments]) 
{
    NSSet *productSet = [NSSet setWithArray:@[@"自己的内购ID"]];
    SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet];
    productRequest.delegate = self;
    [productRequest start];
} else {
//已禁止内购
}

3.6.执行相关代理

- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    SKProduct *requestProduct = nil;
    for (SKProduct *product in response.products) {
        if([product.productIdentifier isEqualToString:@"自己的内购ID"]) {
            requestProduct = product;
        }
    }
    if (requestProduct) {
        //开始下单
        SKPayment *payment = [SKPayment paymentWithProduct:requestProduct];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    } else {
        //没有查询到相应的产品信息。
    }
}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"请求动作失败");
}

- (void)requestDidFinish:(SKRequest *)request
{
    NSLog(@"请求动作完成");
}

3.7.监听下单结果

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction
{
    for(SKPaymentTransaction *payment in transaction) {
        switch (payment.transactionState) {
            case SKPaymentTransactionStatePurchased:
            {
               NSLog(@"交易完成");
              //结束交易
               [[SKPaymentQueue defaultQueue] finishTransaction:payment];
              //获取收据
                NSData *data = [NSData dataWithContentsOfFile:[[[NSBundle mainBundle] appStoreReceiptURL] path]];
                NSString *receipt = [data base64EncodedStringWithOptions:0];
                 NSLog(@"获取收据 receipt , 发给本地服务器,用于交易验证,根据验证结果下发商品");
                break;
            }
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"交易中");
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"恢复购买");
                break;
            case SKPaymentTransactionStateFailed:
            {
               [[SKPaymentQueue defaultQueue] finishTransaction:payment];
                NSLog(@"交易失败");
                if(payment.error.code != SKErrorPaymentCancelled)
                {
                  NSLog(@"交易失败:%@", payment.error.localizedDescription); 
                } else
                {
                    NSLog(@"交易失败:取消了交易"); 
                }
                break;
            }
            case SKPaymentTransactionStateDeferred:
              [[SKPaymentQueue defaultQueue] finishTransaction:payment];
              NSLog(@"未知错误");
                break;
            default:
                break;
        }
    }
}

3.8.将收据发给本地服务器
将交易完成后的收据信息(receipt)发送给自己的服务器,并存储。同时本地服务器须再次校验订单信息,确保准确,并根据校验结果做对应处理(下发对应的商品,或者给出失败原因)
说明:服务器请求苹果的订单校验接口时的请求时间较长,未报错就耐心等待😸

4.注意事项:

4.1.监听到支付结果后,务必要将交易置为完成状态,防止无效监听。

//将交易置为完成状态
[[SKPaymentQueue defaultQueue] finishTransaction:payment];

4.2.用沙箱进行调试的过程中及其不稳定,例如:某些机型调不通、循环弹出验证或ID的登录页面、每次的步骤不一样、二次验证巨慢等一系列问题。
不要慌!,这些基本是苹果服务器的问题,和本地代码关系不大。
如果不放心可以选择给苹果的技术支持反馈一下(反馈周期巨长😢)。


4.3.首次上线内购项,记得将已经通过批准的内购项目添加到app的提交审页面里面,一起提交审核。


4.4.如果需要做消费类型为“自动续订型”的业务,需要单独处理,本篇文章未涉及。


4.5.开始调起支付的时候,需提前检测一下订单,将已完成的订单结束交易。

//检查订单,若有已完成未结束的交易,须首先结束交易。直到符合条件后再开始新的交易。
    NSArray *transactions = [SKPaymentQueue defaultQueue].transactions;
    if (transactions.count > 0) {
        SKPaymentTransaction *transaction = [transactions firstObject];
        if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            NSLog(@"find unfinish transacion and finish this transacion");
            return;
        }
    }

说明:
①注意代码中 return 的使用,要适时返回😏。

②注意当前代码的使用位置,要放在请求内购详情之前😏


5.如有需要,欢迎讨论

支付完整上线思路,脱坑指南


嘚嘚

@end

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

推荐阅读更多精彩内容