梦想者iOS分享的demo程序员的故事

【关于IAP内购详细流程】

2016-12-13  本文已影响1570人  独酌丿红颜

为一名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



上一篇下一篇

猜你喜欢

热点阅读