关于iOS内支付(简称IAP,全称In App Purchase)的demo可以从以下链接下载:点击打开链接

一、实现支付功能的前提条件:

1.有一个可以发布产品的开发者账号,有一个可以运行应用的开发环境,IAP只能真机测试。

2.自己开发的IAP内支付APP的支付功能实现是需要有Product ID才能实现的,Product ID就是你要购买的产品的标识,可以由以下途径获得:登陆到iTunes Connect,用申请开发者账号的APP ID创建一个新的应用,创建应用内付费项目,设置好价格和Product ID等等。主要是要记住你自己设置好的所有Product ID。

二、iOS内支付开发步骤:

拿以上demo作为实例,其运行成功出现的界面有以下两个按钮:

如果Product ID是错误的话,上面第一个Buy按钮的buyButton.enabled属性为NO。只有当Product ID提供正确,其属性改为YES,才能点击进行购买操作。

此demo的主要流程如下:

1.先在工程导入storekit.frame框架,在EBPurchase.h里#import<StoreKit/StoreKit.h>

2.在ViewController.m文件里将"Your.IAP.Product.ID"改成你自己在上面创建应用时设置好的一个Product ID

#define SUB_PRODUCT_ID @"Your.IAP.Product.ID"

3.在Product ID成功的前提下进行讲解:

1)程序运行后到ViewController.m以下方法:

-(void) viewWillAppear:(BOOL)animated
{   buyButton.enabled = NO; // Only enable after populated with IAP price.// Request In-App Purchase product info and availability.if (![demoPurchase requestProduct:SUB_PRODUCT_ID]) {// Returned NO, so notify user that In-App Purchase is Disabled in their Settings.[buyButton setTitle:@"Purchase Disabled in Settings" forState:UIControlStateNormal];}
}

从此方法buyButton.enabled = NO能看出一开始上面界面的第一个按钮是不能点击的。

2)在以上方法的 [demoPurchase requestProduct:SUB_PRODUCT_ID] 方法将Product ID传进程序,并跳转到EBPurchase.m以下方法:

-(bool) requestProduct:(NSString*)productId
{if (productId != nil) {NSLog(@"EBPurchase requestProduct: %@", productId);if ([SKPaymentQueue canMakePayments]) {// Yes, In-App Purchase is enabled on this device.// Proceed to fetch available In-App Purchase items.// Initiate a product request of the Product ID.SKProductsRequest *prodRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productId]];prodRequest.delegate = self;[prodRequest start];[prodRequest release];return YES;} else {// Notify user that In-App Purchase is Disabled.NSLog(@"EBPurchase requestProduct: IAP Disabled");return NO;}} else {NSLog(@"EBPurchase requestProduct: productId = NIL");return NO;}}

此方法最重要的是以下这一段代码:里面的 [SKPaymentQueue canMakePayments] 方法是查询用户是否允许应用内付费,如果不允许就不用进行下面的操作了

if ([SKPaymentQueue canMakePayments]) {// Yes, In-App Purchase is enabled on this device.// Proceed to fetch available In-App Purchase items.// Initiate a product request of the Product ID.SKProductsRequest *prodRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productId]];prodRequest.delegate = self;[prodRequest start];[prodRequest release];return YES;} else {// Notify user that In-App Purchase is Disabled.NSLog(@"EBPurchase requestProduct: IAP Disabled");return NO;}

3)由以上代码里的 [prodRequest start ]方法会由系统调SKProductsRequestDelegate协议里以下方法:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {// Parse the received product info.self.validProduct = nil;int count = [response.products count];if (count>0) {// Grab the first product in the array.self.validProduct = [response.products objectAtIndex:0];}if (self.validProduct) {// Yes, product is available, so return values.[delegate requestedProduct:self identifier:self.validProduct.productIdentifier name:self.validProduct.localizedTitle price:[self.validProduct.price stringValue] description:self.validProduct.localizedDescription];} else {// No, product is NOT available, so return nil values.[delegate requestedProduct:self identifier:nil name:nil price:nil description:nil];}
}

上面提供的Product ID如果不正确,以上方法查询会失败,count为0.如果正确,在以上方法里由 [delegate requestedProduct:self identifier:self.validProduct.productIdentifier name:self.validProduct.localizedTitle price:[self.validProduct.price stringValue] description:self.validProduct.localizedDescription] 调ViewController.m里EBPurchaseDelegate协议里的以下方法:

-(void) requestedProduct:(EBPurchase*)ebp identifier:(NSString*)productId name:(NSString*)productName price:(NSString*)productPrice description:(NSString*)productDescription
{NSLog(@"ViewController requestedProduct");if (productPrice != nil) {// Product is available, so update button title with price.[buyButton setTitle:[@"Buy Game Levels Pack " stringByAppendingString:productPrice] forState:UIControlStateNormal];buyButton.enabled = YES; // Enable buy button.} else {// Product is NOT available in the App Store, so notify user.buyButton.enabled = NO; // Ensure buy button stays disabled.[buyButton setTitle:@"Buy Game Levels Pack" forState:UIControlStateNormal];UIAlertView *unavailAlert = [[UIAlertView alloc] initWithTitle:@"Not Available" message:@"This In-App Purchase item is not available in the App Store at this time. Please try again later." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];[unavailAlert show];[unavailAlert release];}
}

从上面方法代码能看到 buyButton.enabled = YES 现在点击界面里的Buy按钮进行购买操作

跳转到以下方法:

-(IBAction)purchaseProduct<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">由此方法里的</span><span style="font-family: Arial, Helvetica, sans-serif;">[demoPurchase purchaseProduct:demoPurchase.validProduct]</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">跳转到EBPurchase.m里的以下方法:</span>
-(bool) purchaseProduct:(SKProduct*)requestedProduct
{if (requestedProduct != nil) {NSLog(@"EBPurchase purchaseProduct: %@", requestedProduct.productIdentifier);if ([SKPaymentQueue canMakePayments]) {// Yes, In-App Purchase is enabled on this device.// Proceed to purchase In-App Purchase item.// Assign a Product ID to a new payment request.SKPayment *paymentRequest = [SKPayment paymentWithProduct:requestedProduct]; // Assign an observer to monitor the transaction status.[[SKPaymentQueue defaultQueue] addTransactionObserver:self];// Request a purchase of the product.[[SKPaymentQueue defaultQueue] addPayment:paymentRequest];return YES;

当购买有结果时会由系统调用SKPaymentTransactionObserver协议里的以下方法:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {for(SKPaymentTransaction *transaction in transactions) {switch ((int)transaction.transactionState) {case SKPaymentTransactionStatePurchasing:// Item is still in the process of being purchasedbreak;case SKPaymentTransactionStatePurchased:// Item was successfully purchased!// Return transaction data. App should provide user with purchased product.[delegate successfulPurchase:self identifier:transaction.payment.productIdentifier receipt:transaction.transactionReceipt];// After customer has successfully received purchased content,// remove the finished transaction from the payment queue.[[SKPaymentQueue defaultQueue] finishTransaction: transaction];break;case SKPaymentTransactionStateRestored:// Verified that user has already paid for this item.// Ideal for restoring item across all devices of this customer.// Return transaction data. App should provide user with purchased product.[delegate successfulPurchase:self identifier:transaction.payment.productIdentifier receipt:transaction.transactionReceipt];// After customer has restored purchased content on this device,// remove the finished transaction from the payment queue.[[SKPaymentQueue defaultQueue] finishTransaction: transaction];break;case SKPaymentTransactionStateFailed:// Purchase was either cancelled by user or an error occurred.if (transaction.error.code != SKErrorPaymentCancelled) {// A transaction error occurred, so notify user.[delegate failedPurchase:self error:transaction.error.code message:transaction.error.localizedDescription];}// Finished transactions should be removed from the payment queue.[[SKPaymentQueue defaultQueue] finishTransaction: transaction];break;}}
}

购买成功后进行移除监听:

- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{NSLog(@"EBPurchase removedTransactions");// Release the transaction observer since transaction is finished/removed.[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

[汇文教育]iOS内支付(IAP)研究相关推荐

  1. Cocos2dx使用ios内支付IAP详细流程-白白

    今天总结了一下cocos2d-x使用ios内支付iap的详细流程,封装好了调用接口,代码与详细说明在此 http://download.csdn.net/detail/u010229677/81566 ...

  2. Cocos2dx使用ios内支付IAP具体流程-白白

    今天总结了一下cocos2d-x使用ios内支付iap的具体流程,封装好了调用接口,代码与具体说明在此 http://download.csdn.net/detail/u010229677/81566 ...

  3. 使用iOS内支付IAP详细流程

    1.appstore信息完善 首先肯定有一个可以发布产品的开发者账号,有一个可以运行应用的开发环境,IAP只能真机测试,我们必须有一台IOS设备. 我们进行的所有操作都是在mac上面进行的,测试都是真 ...

  4. IOS 内购IAP 自动订阅收据验证文档服务端翻译

    将收据数据发送到App Store: 提交此JSON对象作为HTTP POST请求的有效负载. 中文文档:https://help.apple.com/app-store-connect/#/dev7 ...

  5. iap php,PHP语言之华为应用内支付IAP验签

    背景描述 项目对接华为HMS SDK的应用内支付IAP SDK3.x以后,支付成功后,可从PurchaseResultInfo对象中获取到购买数据InAppPurchaseData及其签名数据,需要使 ...

  6. PHP语言之华为应用内支付IAP验签

    背景描述 项目对接华为HMS SDK的应用内支付IAP SDK3.x以后,支付成功后,可从PurchaseResultInfo对象中获取到购买数据InAppPurchaseData及其签名数据,需要使 ...

  7. iOS 内购IAP(In-App Purchases)代码实现(上)

    iOS 内购IAP(In-App Purchases)代码实现(上) iOS 内购,也叫内支付,是在iOS应用内部,向苹果服务器发起购买请求的过程.我们在这边来讲一讲代码的实现过程.还有,在做内购的时 ...

  8. iOS应用内支付(IAP)的那些坑

    我们在今年春节后上线了新的在线智能题库:猿题库.猿题库现在推出了公务员考试行测和申论2个产品,均包括web, iOS和Android三个平台.这次我们尝试做一个收费的产品,所以在iOS端集成了应用内支 ...

  9. IOS 应用内支付(IAP)接口使用说明

    群里看到一个关于ios支付回调问题如下 问题: 箭头函数的回调没有执行 解决办法: 不要着急改成箭头函数, 先按官网复制代码跑通流程 为什么用箭头函数有这个bug呢? 文档说了 : 服务端要做好防重校 ...

最新文章

  1. 图书馆为什么使用sip2协议_RFID无人智能借还书柜让微型图书馆“触手可及”
  2. 计算机视觉之OpenCV教程 --- Mat图像类基础(二)
  3. Nginx之共享内存与slab机制
  4. 彻底解决.net中编码问题的心得
  5. java密码学原型算法_java密码学原型算法实现——双线性对.pdf
  6. java 正则表达式使用_如何用正则表达式杀死Java
  7. 新手学html 第一节:html简介
  8. java设计模式初探之装饰者_JAVA设计模式初探之装饰者模式
  9. python 算法库安装_Mahotas(Python 计算机视觉、图像处理库)安装
  10. 网易云音乐云打卡平台源码
  11. 稞麦显示无法连接服务器,Modern Ops无法连接服务器是什么原因
  12. 国内外贵金属白银有何区别?
  13. python操作符是什么意思_如何使用python操作符**与*?有什么区别?
  14. Linux系统启动和内核管理
  15. python文件批量改名
  16. 利用PHP GD库生成位图
  17. 4、基于XML的AOP配置
  18. 第五天实验---MGRE环境下的OSPF实验
  19. mySQL的备份及导入
  20. MATLAB输出格式控制 %d,%f,%c,%s的用法

热门文章

  1. java弱签名视为未签名,[java 被视为未签名]QQ幸福签名:你所愿,我终于将你视为平常,连看你一眼都觉得多余。...
  2. 批量训练pytorch练习
  3. vue使用iview中Upload上传组件
  4. 信息学奥赛一本通 题解目录
  5. 二叉树的公共祖先问题
  6. modis数据简介及批处理工具
  7. to 自动班学生:假期C++免费幕课
  8. 不锈钢常识 - Powered by Discuz!
  9. 口罩危机下的电商大考
  10. OA办公自动化系统开发方案及源码