[转]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
猜你喜欢
转载自iog689mq.iteye.com/blog/1359509
今日推荐
周排行