【关于IAP内购详细流程】

为一名iOS开发,苹果已经在强制推行内购了,所以,你不得不了解一下啦。可能还有些人不知道哪种情况下一定要用到内购,简单说明一下,如果你购买的商品,是在本app中使用和消耗的,就一定要用内购,否则会被拒绝上线,例如:游戏币,在线书籍,app中使用的道具等

- 1. 向appStore提交帐户资料

- 1.1 第一步

图片.png

- 1.2 第二步

图片.png

- 1.3 第三步

图片.png

操作完第三步然后记得保存!

- 1.4 第四步

图片.png

- 1.5 第五步

图片.png

先点击Contact Info 的Set Up

- 1.6 第六步

图片.png

- 1.7 第七步

图片.png

都填写完记得保存,然后回到上一个页面

- 1.8 第八步

图片.png

- 1.9 第九步

图片.png

- 1.10 第十步

图片.png

- 1.11 第十一步

图片.png

- 1.12 第十二步

进行十二步的时候可能有些银行通过苹果这个方法查不到,就需要借助百度了,一定要准确查询,否则会有问题。我这里推荐一个地址https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp

图片.png

- 1.13 第十三步

这一步需要注意的是,货币类型可能有歧义,看你是想收美元还是人民币了,都说美元合适。不过,我做的时候为了避免事情,还是选择了CNY,支持国产。还有一点,银行账号如果是对公的账号,需要填写公司的英文名称,如果没有的话,上拼音!然后点击保存银行信息就算ok了,然后退回到最开始的页面!

图片.png

- 1.14 第十四步

图片.png

- 1.15 第十五步

图片.png

- 1.16 第十六步

图片.png

- 1.17 第十七步

图片.png

- 1.18 第十八步

图片.png

- 1.19 第十九步

这里要注意的是,虽然这个页面看起来要填写的信息很多,其实很多都没有什么卵用,都是对于美国那边什么法律需要配合的那些,一般咱们都不用,只需要把该勾选的地方勾选,然后提交就好了


图片.png

- 1.20 第二十步

图片.png

- 1.21 第二十一步

图片.png

- 1.22 第二十二步

图片.png


第二部分 ,创建内购项目

- 2.1 第一步

图片.png

- 2.2 第二步

图片.png

- 2.3 第三步

图片.png

- 2.4 第四步

图片.png

- 2.5 第五步

图片.png

- 2.6 第六步

图片.png

到这里内购商品添加完成【新版界面可能有所不同,但功能是一致的】

第三部分 添加内购测试帐号

- 3.1 第一步

图片.png

- 3.2 第二步

记住不能是用户使用过的的AppleID帐号!不然无效···


图片.png

第四部分,客户端代码集成部分!

在工程中添加 storeKit 库

图片.png
#import <StoreKit/StoreKit.h>
enum
{
    IAP0p20=20,
    IAP1p100,
    IAP4p600,
    IAP9p1000,
    IAP24p6000,
}buyCoinsTag;

//代理
@interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate >
{
         int buyType;
}
- (void) requestProUpgradeProductData;
- (void) RequestProductData;-(void)buy:(int)type;
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
- (void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentTransaction *)transaction;
- (void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
- (void) restoreTransaction: (SKPaymentTransaction *)transaction;
- (void) provideContent:(NSString *)product;
- (void) recordTransaction:(NSString *)product;
@end

然后看.m文件
#import "RechargeVC.h"//在内购项目中创的商品单号
#define ProductID_IAP0p20 @"Nada.JPYF01"//20
#define ProductID_IAP1p100 @"Nada.JPYF02" //100
#define ProductID_IAP4p600 @"Nada.JPYF03" //600
#define ProductID_IAP9p1000 @"Nada.JPYF04" //1000
#define ProductID_IAP24p6000 @"Nada.JPYF05" //6000
@interface RechargeVC ()
@end@implementation RechargeVC
- (void)viewDidLoad
 { 
     [super viewDidLoad];
     [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
     [self buy:IAP0p20];
}
-(void)buy:(int)type
{
     buyType = type; 
     if ([SKPaymentQueue canMakePayments]) 
     { 
            [self RequestProductData]; 
            NSLog(@"允许程序内付费购买");
      }
      else
      { 
             NSLog(@"不允许程序内付费购买"); 
             UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"您的手机没有打开程序内付费购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
             [alerView show];
        }
}
-(void)RequestProductData
{ 
      NSLog(@"---------请求对应的产品信息------------");
      NSArray *product = nil; 
      switch (buyType) 
      { 
            case IAP0p20: product=[[NSArray alloc]  initWithObjects:ProductID_IAP0p20,nil];
            break; 
     
            case IAP1p100: product=[[NSArray alloc] initWithObjects:ProductID_IAP1p100,nil];
            break; 

            case IAP4p600: product=[[NSArray alloc] initWithObjects:ProductID_IAP4p600,nil]; 
            break; 

            case IAP9p1000: product=[[NSArray alloc] initWithObjects:ProductID_IAP9p1000,nil]; 
            break; 

            case IAP24p6000: product=[[NSArray alloc] initWithObjects:ProductID_IAP24p6000,nil];
            break; 

            default: break;
       } 
     NSSet *nsset = [NSSet setWithArray:product]; SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset]; 
     request.delegate=self; 
[request start];}
//<SKProductsRequestDelegate> 请求协议//收到的产品信息

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{ 
        NSLog(@"-----------收到产品反馈信息--------------"); 

        NSArray *myProduct = response.products; 
        NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers); 
        NSLog(@"产品付费数量: %d", (int)[myProduct count]); 
       // populate UI 

        for(SKProduct *product in myProduct)
        {  
             NSLog(@"product info"); 
             NSLog(@"SKProduct 描述信息%@", [product description]);        
             NSLog(@"产品标题 %@" , product.localizedTitle); 
             NSLog(@"产品描述信息: %@" , product.localizedDescription); 
             NSLog(@"价格: %@" , product.price); 
             NSLog(@"Product id: %@" , product.productIdentifier);
         } 
        SKPayment *payment = nil; 
        switch (buyType) 
        { 
              case IAP0p20: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; 
              //支付20        
              break;  
              
              case IAP1p100: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; 
             //支付108           
              break; 
          
             case IAP4p600: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; 
             //支付618 
             break; 
          
             case IAP9p1000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; 
            //支付1048 
            break; 

            case IAP24p6000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; 
             //支付5898 
             break; 
           
             default: break;
           } 
          NSLog(@"---------发送购买请求------------");   

          [[SKPaymentQueue defaultQueue] addPayment:payment];
}


- (void)requestProUpgradeProductData
{ 
       NSLog(@"------请求升级数据---------");
       NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"]; 
       SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];   
       productsRequest.delegate = self;  
       [productsRequest start];
}

//弹出错误信息
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{ 
         NSLog(@"-------弹出错误信息----------"); 
         UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
         [alerView show];
}

-(void) requestDidFinish:(SKRequest *)request
{ 
        NSLog(@"----------反馈信息结束--------------");
}

-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction
{  
        NSLog(@"-----PurchasedTransaction----");
        NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
       [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
//<SKPaymentTransactionObserver>千万不要忘记绑定,代码如下://----监听购买结果
//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

//交易结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
         NSLog(@"-----paymentQueue--------"); 
          for (SKPaymentTransaction *transaction in transactions) 
         { 
               switch (transaction.transactionState)
              {  
                     case SKPaymentTransactionStatePurchased:
                     {
                           //交易完成 
                           [self completeTransaction:transaction];       

                           NSLog(@"-----交易完成 --------"); 
                           UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"" message:@"购买成功" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView show];
                       }
                      break; 
           
                     case SKPaymentTransactionStateFailed://交易失败 
                     {
                           [self failedTransaction:transaction]; 
                           NSLog(@"-----交易失败 --------"); 
                           UIAlertView *alerView2 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"购买失败,请重新尝试购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
                            [alerView2 show];
                      }
                      break;
 
                     case SKPaymentTransactionStateRestored:
                     {
                              //已经购买过该商品 
                              [self restoreTransaction:transaction];
                              NSLog(@"-----已经购买过该商品 --------");
                     }
                  
                   case SKPaymentTransactionStatePurchasing: 
                  {
                            //商品添加进列表 NSLog(@"-----商品添加进列表 --------");
                   }
                   break; 
                  
                   default: 
                    break; 

                } 
         }
}

- (void) completeTransaction: (SKPaymentTransaction *)transaction
{ 
          NSLog(@"-----completeTransaction--------"); // Your application should implement these two methods. 
          NSString *product = transaction.payment.productIdentifier;  
          if ([product length] > 0)
           { 
                  NSArray *tt = [product componentsSeparatedByString:@"."]; 
                  NSString *bookid = [tt lastObject]; 
                   if ([bookid length] > 0) 
                   {
                          [self recordTransaction:bookid]; 
                          [self provideContent:bookid];
                    }
            } 
// Remove the transaction from the payment queue. 

         [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

//记录交易
-(void)recordTransaction:(NSString *)product
{ 
               NSLog(@"-----记录交易--------");
}

//处理下载内容
-(void)provideContent:(NSString *)product
{ 
          NSLog(@"-----下载--------");
}

- (void) failedTransaction: (SKPaymentTransaction *)transaction
{ 
            NSLog(@"失败"); 
           if (transaction.error.code != SKErrorPaymentCancelled) 
           { } 
            [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
} 

- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{ 
           NSLog(@" 交易恢复处理");
}


-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error
{ 
              NSLog(@"-------paymentQueue----");
}

#pragma mark connection delegate

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{ 
              NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{  
          switch([(NSHTTPURLResponse *)response statusCode])
          { 
                   case 200: 
                   case 206: break; 
                   case 304: break; 
                   case 400: break; 
                   case 404: break;
                   case 416: break; 
                   case 403: break; 
                   case 401: 
                   case 500: break; 
                   default: break; 
         }
}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 { 
          NSLog(@"test");
}

-(void)dealloc
{
           //解除监听
           [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 


}

@end



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

推荐阅读更多精彩内容