iOS iAP 支付与购买

1. 创建应用

首先进入iTunes Connect然后按下 Manage Your Applications


接下来按下Add New Application按钮创建应用

2. 在应用中创建IAP


创建应用之后,在Manage Your Applications中点应用的图示,进入应用

就会看到上图画面点击Manage In App Purchases就可以进入IAP的管理画面

在这边要注意左边的Bundle ID,在Xcode项目中,info.plist中的设定需与此Bundle相同

(此Bundle ID会在创建应用时填入)

此为IAP的管理画面,只要按下Create New按钮就可创建IAP

在本图中我已经创建好三个IAP

而其中要注意的是Product ID,只要用Product ID就可以请求IAP的相关讯息及交易

Consumable

消耗品,每次下载都需付费

Non-Consumable

一次性付费,通常用在升级pro版或是移除广告等

Auto-Renewable Subscriptions

自动更新订阅

Free Subscription

免费订阅

Non-Renewing Subscription

自动更新订阅

3. 如何创建沙盒测试用户

进入iTunes Connect,点击Manage Users

在这个画面中点下Test User

按下Add New User就可以了Email Address就是登入沙盒测试的用户名

密码的部份在Add New User时可自行创建

4.代码

  1. /* 
  2.  *  CBiOSStoreManager.h 
  3.  *  CloudBox Cross-Platform Framework Project 
  4.  * 
  5.  *  Created by Cloud on 2012/10/30. 
  6.  *  Copyright 2011 Cloud Hsu. All rights reserved. 
  7.  * 
  8.  */  
  9.   
  10. #import <UIKit/UIKit.h>   
  11. #import <StoreKit/StoreKit.h>  
  12.   
  13. @interface CBiOSStoreManager : NSObject<SKProductsRequestDelegate,SKPaymentTransactionObserver>  
  14. {  
  15.     NSString* _buyProductIDTag;  
  16. }  
  17.   
  18. + (CBiOSStoreManager*) sharedInstance;  
  19.   
  20. - (void) buy:(NSString*)buyProductIDTag;  
  21. - (bool) CanMakePay;  
  22. - (void) initialStore;  
  23. - (void) releaseStore;  
  24. - (void) requestProductData:(NSString*)buyProductIDTag;  
  25. - (void) provideContent:(NSString *)product;  
  26. - (void) recordTransaction:(NSString *)product;  
  27.   
  28. - (void) requestProUpgradeProductData:(NSString*)buyProductIDTag;  
  29. - (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;  
  30. - (void) purchasedTransaction: (SKPaymentTransaction *)transaction;  
  31. - (void) completeTransaction: (SKPaymentTransaction *)transaction;  
  32. - (void) failedTransaction: (SKPaymentTransaction *)transaction;  
  33. - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;  
  34. - (void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;  
  35. - (void) restoreTransaction: (SKPaymentTransaction *)transaction;  
  36.   
  37. @end  

  1. /* 
  2.  *  CBiOSStoreManager.mm 
  3.  *  CloudBox Cross-Platform Framework Project 
  4.  * 
  5.  *  Created by Cloud on 2012/10/30. 
  6.  *  Copyright 2011 Cloud Hsu. All rights reserved. 
  7.  * 
  8.  */  
  9.   
  10. #import "CBiOSStoreManager.h"  
  11.   
  12. @implementation CBiOSStoreManager  
  13.   
  14. static CBiOSStoreManager* _sharedInstance = nil;  
  15.   
  16. +(CBiOSStoreManager*)sharedInstance  
  17. {  
  18.     @synchronized([CBiOSStoreManager class])  
  19.     {  
  20.         if (!_sharedInstance)  
  21.             [[self alloc] init];  
  22.           
  23.         return _sharedInstance;  
  24.     }  
  25.     return nil;  
  26. }  
  27.   
  28. +(id)alloc  
  29. {  
  30.     @synchronized([CBiOSStoreManager class])  
  31.     {  
  32.         NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of a singleton.\n");  
  33.         _sharedInstance = [super alloc];  
  34.         return _sharedInstance;  
  35.     }  
  36.     return nil;  
  37. }  
  38.   
  39. -(id)init {  
  40.     self = [super init];  
  41.     if (self != nil) {  
  42.         // initialize stuff here  
  43.     }  
  44.     return self;  
  45. }  
  46.   
  47. -(void)initialStore  
  48. {  
  49.     [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
  50. }  
  51. -(void)releaseStore  
  52. {  
  53.     [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];  
  54. }  
  55.   
  56. -(void)buy:(NSString*)buyProductIDTag  
  57. {  
  58.     [self requestProductData:buyProductIDTag];  
  59. }  
  60.   
  61. -(bool)CanMakePay  
  62. {  
  63.     return [SKPaymentQueue canMakePayments];  
  64. }     
  65.   
  66. -(void)requestProductData:(NSString*)buyProductIDTag  
  67. {  
  68.     NSLog(@"---------Request product information------------\n");  
  69.     _buyProductIDTag = [buyProductIDTag retain];  
  70.     NSArray *product = [[NSArray alloc] initWithObjects:buyProductIDTag,nil];  
  71.     NSSet *nsset = [NSSet setWithArray:product];  
  72.     SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];  
  73.     request.delegate=self;  
  74.     [request start];  
  75.     [product release];  
  76. }  
  77.   
  78. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{     
  79.       
  80.     NSLog(@"-----------Getting product information--------------\n");  
  81.     NSArray *myProduct = response.products;  
  82.     NSLog(@"Product ID:%@\n",response.invalidProductIdentifiers);  
  83.     NSLog(@"Product count: %d\n", [myProduct count]);  
  84.     // populate UI  
  85.     for(SKProduct *product in myProduct){  
  86.         NSLog(@"Detail product info\n");  
  87.         NSLog(@"SKProduct description: %@\n", [product description]);  
  88.         NSLog(@"Product localized title: %@\n" , product.localizedTitle);  
  89.         NSLog(@"Product localized descitption: %@\n" , product.localizedDescription);  
  90.         NSLog(@"Product price: %@\n" , product.price);  
  91.         NSLog(@"Product identifier: %@\n" , product.productIdentifier);  
  92.     }  
  93.     SKPayment *payment = nil;  
  94.     payment = [SKPayment paymentWithProduct:[response.products objectAtIndex:0]];  
  95.     NSLog(@"---------Request payment------------\n");  
  96.     [[SKPaymentQueue defaultQueue] addPayment:payment];  
  97.     [request autorelease];      
  98.       
  99. }  
  100. - (void)requestProUpgradeProductData:(NSString*)buyProductIDTag  
  101. {  
  102.     NSLog(@"------Request to upgrade product data---------\n");  
  103.     NSSet *productIdentifiers = [NSSet setWithObject:buyProductIDTag];  
  104.     SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];  
  105.     productsRequest.delegate = self;  
  106.     [productsRequest start];      
  107.       
  108. }  
  109.   
  110. - (void)request:(SKRequest *)request didFailWithError:(NSError *)error  
  111. {  
  112.     NSLog(@"-------Show fail message----------\n");  
  113.     UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]  
  114.                                                        delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];  
  115.     [alerView show];  
  116.     [alerView release];  
  117. }     
  118.   
  119. -(void) requestDidFinish:(SKRequest *)request  
  120. {  
  121.     NSLog(@"----------Request finished--------------\n");  
  122.       
  123. }     
  124.   
  125. -(void) purchasedTransaction: (SKPaymentTransaction *)transaction  
  126. {  
  127.     NSLog(@"-----Purchased Transaction----\n");  
  128.     NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];  
  129.     [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];  
  130.     [transactions release];  
  131. }      
  132.   
  133. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions  
  134. {  
  135.     NSLog(@"-----Payment result--------\n");  
  136.     for (SKPaymentTransaction *transaction in transactions)  
  137.     {  
  138.         switch (transaction.transactionState)  
  139.         {  
  140.             case SKPaymentTransactionStatePurchased:  
  141.                 [self completeTransaction:transaction];  
  142.                 NSLog(@"-----Transaction purchased--------\n");  
  143.                 UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Congratulation"  
  144.                                                               message:@"Transaction suceed!"  
  145.                                                               delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];     
  146.                   
  147.                 [alerView show];  
  148.                 [alerView release];  
  149.                 break;  
  150.             case SKPaymentTransactionStateFailed:  
  151.                 [self failedTransaction:transaction];  
  152.                 NSLog(@"-----Transaction Failed--------\n");  
  153.                 UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"Failed"  
  154.                                                                message:@"Sorry, your transcation failed, try again."  
  155.                                                                delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];     
  156.                   
  157.                 [alerView2 show];  
  158.                 [alerView2 release];  
  159.                 break;  
  160.             case SKPaymentTransactionStateRestored:  
  161.                 [self restoreTransaction:transaction];  
  162.                 NSLog(@"----- Already buy this product--------\n");  
  163.             case SKPaymentTransactionStatePurchasing:  
  164.                 NSLog(@"-----Transcation puchasing--------\n");  
  165.                 break;  
  166.             default:  
  167.                 break;  
  168.         }  
  169.     }  
  170. }  
  171.   
  172. - (void) completeTransaction: (SKPaymentTransaction *)transaction     
  173. {  
  174.     NSLog(@"-----completeTransaction--------\n");  
  175.     // Your application should implement these two methods.  
  176.     NSString *product = transaction.payment.productIdentifier;  
  177.     if ([product length] > 0) {     
  178.           
  179.         NSArray *tt = [product componentsSeparatedByString:@"."];  
  180.         NSString *bookid = [tt lastObject];  
  181.         if ([bookid length] > 0) {  
  182.             [self recordTransaction:bookid];  
  183.             [self provideContent:bookid];  
  184.         }  
  185.     }     
  186.       
  187.     // Remove the transaction from the payment queue.     
  188.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction];     
  189.       
  190. }     
  191.   
  192. -(void)recordTransaction:(NSString *)product  
  193. {  
  194.     NSLog(@"-----Record transcation--------\n");  
  195.     // Todo: Maybe you want to save transaction result into plist.  
  196. }     
  197.   
  198. -(void)provideContent:(NSString *)product  
  199. {  
  200.     NSLog(@"-----Download product content--------\n");  
  201. }     
  202.   
  203. - (void) failedTransaction: (SKPaymentTransaction *)transaction  
  204. {  
  205.     NSLog(@"Failed\n");  
  206.     if (transaction.error.code != SKErrorPaymentCancelled)  
  207.     {  
  208.     }  
  209.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction];  
  210. }  
  211. -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction  
  212. {     
  213.       
  214. }  
  215.   
  216. - (void) restoreTransaction: (SKPaymentTransaction *)transaction  
  217. {  
  218.     NSLog(@"-----Restore transaction--------\n");  
  219. }  
  220.   
  221. -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error  
  222. {  
  223.     NSLog(@"-------Payment Queue----\n");  
  224. }  
  225.   
  226. #pragma mark connection delegate  
  227. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
  228. {  
  229.     NSLog(@"%@\n",  [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);  
  230. }  
  231. - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
  232. {     
  233.       
  234. }     
  235.   
  236. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
  237. {  
  238.     switch([(NSHTTPURLResponse *)response statusCode]) {  
  239.         case 200:  
  240.         case 206:  
  241.             break;  
  242.         case 304:  
  243.             break;  
  244.         case 400:  
  245.             break;  
  246.         case 404:  
  247.             break;  
  248.         case 416:  
  249.             break;  
  250.         case 403:  
  251.             break;  
  252.         case 401:  
  253.         case 500:  
  254.             break;  
  255.         default:  
  256.             break;  
  257.     }  
  258. }     
  259.   
  260. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
  261. {  
  262.     NSLog(@"test\n");  
  263. }     
  264.   
  265. -(void)dealloc  
  266. {  
  267.     [super dealloc];  
  268. }  
  269.   
  270. @end  


  1. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
由于交易是永久有效的,建议addTransactionObserver这个于应用启动后就行监听,而不要在用户想买东西时才监听

  1. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions  
交易结果会于此处显示

苹果准备沙盒测试环境需一段时间,若是创建IAP后可以取得资讯,却无法交易成功,要稍待一下

另外若是模拟器可以购买,但真机购买却失败的话,做Hard Reset就可以了,一直按住Home键跟电源键就可以做Hard Reset

按住后会出现关机画面,不要理会它,继续等,直到等到白苹果出现后,就可以放开等重开机完毕后再测试

5. IAP运作流程图

6.范例下载

下载连结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值