[转]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
发表评论
-
[转载]【引用】毛衣编织小技巧
2012-01-20 11:26 684[转载]【引用】毛衣编织小技巧 2012年01月18日 ... -
初二期末测试题
2012-01-20 11:26 619初二期末测试题 17小时 ... -
2012年1月11日
2012-01-20 11:26 5712012年1月11日 2012年01月11日 中国 科 ... -
erefde_快乐急速青春
2012-01-20 11:26 658erefde_快乐急速青春 2012年01月11日 山东 ... -
2012-01-16
2012-01-20 11:26 4522012-01-16 2012年01月16日 ... -
c/c++连接mysql数据库-justinzhang-博客园
2012-01-19 16:06 1320c/c++连接mysql数据库-justinzhang-博客园 ... -
开始研究Directshow
2012-01-19 16:06 2465开始研究Directshow 2011年09月19日 重 ... -
【转】 Android Suspend/resume 过程分析.
2012-01-19 16:06 1115【转】 Android Suspend/resume 过程分析 ... -
评论:什么力量让我们如此害怕
2012-01-17 05:57 598评论:什么力量让我们如 ... -
关于国金证券
2012-01-17 05:57 653关于国金证券 2011年10月22日 一、主要概况 国金 ... -
DOM――获取页面信息
2012-01-17 05:57 789DOM――获取页面信息 2011年10月24日 1、获得 ... -
《论语》解读之3-15《德行之要谦恭谨慎》
2012-01-16 04:45 773《论语》解读之3-15《德 ... -
打造新中式空间
2012-01-16 04:45 599打造新中式空间 2011年1 ... -
2011-12-13
2012-01-16 04:45 5432011-12-13 2011年12月13日 ... -
还生活在父母之命的年代吗?
2012-01-16 04:44 650还生活在父母之命的年 ...
相关推荐
iOS通用链接(Universal Links),服务器端部署apple-app-site-association配置文件
iOS签名工具源码,喜欢研究签名的朋友参考下吧!
iOS_IAPTooliOS in-app-purchase tool, you can use it to upload iap or edit it through ruby scripts.由于我现在公司产品的特殊性(主要是手游 app),经常性的要加巨大数量的 ipa(in-app-purchases),真的是数量...
ios-app-architecture
映客直播iOS-App-性能优化.pdf
app之前相互访问,更多开发资料 请加QQ群代码库:524884683
iOS-App-签名流程.doc编程资料
HTML6-iOs-App-2模板官网落地页APP主页产品宣传页源码 landing静态页面
$ npm install rn-in-app-review --save 或者$ yarn add rn-in-app-review 对于React Native <0> = 0.60 $ cd ios $ pod install 用法 import RnInAppReview from 'rn-in-app-review' ; RNInAppReview . ...
iOS 12程式设计实战心法 swift-ios12-book-繁体 pdf 格式 swift 5教程,从入门开始搭建一个属于自己的APP。此版本为官方中文繁体版pdf 格式
最近刚好在弄In App Purchase这个,自己简单总结了下,下面主要是对代码的部分的,ItunesConnect部分的网上好多有,不懂得可以问我。下面是内购demo,大家用自己的测试账号,里面换上对应的产品ID和和你们项目Bundle...
iOS-联络人-应用程式
iOS-APP内置调试工具(debugging-tool).zip,iOS调试工具
HTML2-iOs-App模板官网落地页APP主页产品宣传页源码 landing静态页面
iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能) http://blog.csdn.net/u014220518/article/details/52248803
iOS 10 App Development Essentials: Learn to ...110. Configuring and Creating App Store Hosted Content for iOS 10 In-App Purchases 111. Preparing and Submitting an iOS 10 Application to the App Store
IOS开发-发布到appstore.pdf
app主题一键替换,支持高度自定义 https://github.com/CranzCapatain/IATheme
react-native-in-app-notification的基本外观: 您可以使用自定义组件来使react-native-in-app-notification : 安装 yarn add react-native-in-app-notification 要么 npm install react-native-in-app-...