`
iog689mq
  • 浏览: 13548 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

[转]iOS In-app Pursechase

 
阅读更多

[转]iOS In-app Pursechase
2012年01月11日
  有树的天空...
  你看到天空上有一棵树吗???... 原贴: http://tiny4cocoa.com/thread-1423-1-1.html
  apple内支付其实这个一直都不想写,因为网上有很多介绍内支付相关的帖子,公司内部要求把apple内支付相关流程写成文档,借此贴出来与大家一起分享吧!
  这篇文章会把内支付的整个实现流程记录下来:
  商品注册部分
  1.首先登录您的itunesconnect.apple.com,主页界面如下图:
  
  2.确保签署App支付合约或者iAd网合约(图中:Contracts, Tax, and Banking标记)
  3.点击“Manage Users ” 建议一个“Test User”作为内支付测试帐号 
  4.如果你的首页没有出现“Manager Your In App Purchases”的话,在应用的简介页面也会出现的
  
  5.在上图中点击"Manager In App-Purchase" ==> "Create New"后
  
  6.选择你的支付方式,我选择的是"Non-Consumable"
  
  7.填写你的商品名称,商品id,Language(选择为:"Simplified Chinese"),商品定价,商品截图,然后点击save ,你的商品就会出现在下图中
  
  代码实现部分
  8.打开Xcode建立你的App,导入"StoreKit,framework"到你的工程
  9.构建一个处理购买的Controller,添加如下代码:(这个文件也在附件中)
  PaymentViewController.h文件
  #import 
  #import
  #import "MyStoreObserver.h"
  @interface PaymentViewController : UIViewController {
  NSArray *listData;
  NSString *inAppPurchase;
  }
  @property (nonatomic, retain) NSArray *listData;
  @property (nonatomic, retain) NSString *inAppPurchase;
  -(void)setPayment:(NSString *)productId;
  @end
  PaymentViewController.m文件实现如下:
  //外部调用
  //#import "PaymentViewController.h"
  //PaymentViewController *payViewController = [[PaymentViewController alloc] init];
  // [payViewController setPayment:@"test"]; //你的产品编号
  #import "PaymentViewController.h"
  @implementation PaymentViewController
  @synthesize listData,inAppPurchase;
  #pragma mark -
  #pragma mark SotoreKit method
  #define kMyFeatureIdentifier inAppPurchase
  //#define kMyFeatureIdentifier @"com.21epub.comic.TestInAppBuy2"
  - (void) requestProductData{
  NSLog(@"kMyFeatureIdentifier %@",kMyFeatureIdentifier);
  SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: kMyFeatureIdentifier]];
  request.delegate = self;
  [request start];
  }
  #pragma mark request delegate
  //!收到产品的消息
  - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
  SKPayment *payment = [SKPayment paymentWithProductIdentifier: kMyFeatureIdentifier];
  [[SKPaymentQueue defaultQueue] addPayment: payment];
  MyStoreObserver *observer = [[MyStoreObserver alloc] init];
  [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
  }
  - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
  NSLog(@"error %@",error);
  NSLog(@"[error localizedDescription] %@",[error localizedDescription]);
  UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Alert" message:[error localizedDescription]
  delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
  [alerView show];
  [alerView release];
  }
  -(void)setPayment:(NSString *)productId {
  NSLog(@"productId %@",productId);
  if([SKPaymentQueue canMakePayments])
  {
  inAppPurchase = [@"jason." stringByAppendingString:productId];
  [self requestProductData];
  }else {
  //请检测购买是否被禁用,请开启购买
  }
  }
  10.导入MyStoreObserver.h和MyStoreObserver.m文件,MyStoreObserver实现如下
  MyStoreObserver.h
  #import 
  #import  
  #import  
  @interface MyStoreObserver : NSObject {
  NSString *productId;
  }
  - (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:(NSErr or *)error;
  -(void)getProduct:(NSString *)product;
  -(void)setDownloadBooks:(NSString *)bookid;
  - (void) restoreTransaction: (SKPaymentTransaction *)transaction;
  -(void)provideContent:(NSString *)product;
  -(void)recordTransaction:(NSString *)product;
  @end
  MyStoreObserver.m
  #import "MyStoreObserver.h"
  #import
  #import
  #import "JSON.h"
  #import "GTMBase64.h"
  @implementation MyStoreObserver
  - (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:
  [self restoreTransaction:transaction];
  default:
  break;
  }
  }
  }
  -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
  NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
  [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
  [transactions release];
  }
  - (void) completeTransaction: (SKPaymentTransaction *)transaction
  {
  // 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{
  }
  //处理下载内容
  -(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:(NSErr or *)error{
  }
  #pragma mark connection delegate
  - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  {
  NSLog(@"%@",  [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
  //[self.receivedData appendData:data];
  }
  - (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");
  }
  @end
  以上这四个文件的实现都在附件中,只需要下载后加入你的工程即可
  下面是我的App内支付购买过程
  询问是否购买
  
  输入测试帐号
  
  购买成功
  [attach]275[/attach]
  源程序下载
  
  Storeaads.zip
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics