FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907

参考文章链接:

(1)http://mobile.51cto.com/iphone-389249.htm

(2)http://blog.csdn.net/xiaominghimi/article/details/6937097

(3)http://zengwu3915.blog.163.com/blog/static/2783489720137485857701/

步骤如下:

第一步:你需要在iTunesConnect中创建个新的App,然后为这个App设置一些产品(付费道具)等;

OK,这里Himi稍微解释下,iTunesConnect是苹果提供的一个平台,主要提供AP发布和管理App的,最重要的功能是创建管理项目信息,项目付费产品(道具)管理、付费的测试账号、提交App等等,这里就简单介绍这么多,关于产品一词在此我们可以理解成游戏道具即可;在苹果看来所有付费都属于产品 =。 =千万不要纠结字眼哦~

OK,打开iTunesConnect网站:https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa (注意:企业级的用户必须使用公司主开发者账号登陆才可!)

成功登陆后的页面如下:

这里大概说下重要的一些项:

 Contracts, Tax, and Banking   : 管理银行账号、联系人以及税等等;这里要根据提示完成对应的信息填写!一定要详细填写喔~

             Manage Users :管理用户的,比如主账号以及测试付费的(测试App)账号;

             Manage Your Applictions:管理应用程序的,你所有发布的应用和每个应用的状态都在这里面;

下面我们新建一个App项目,大家放心,我们这里创建的是不会直接提交给App审核的,所以放心创建,只要控制好App的状态不要是待审核状态即可,不过即使你不小心将项目提交了,也没事,直接更改App状态即可了;

选择Manage Your Applictions选项,然后新建一个项目:【Add New App】,根据提示来填写吧,这里就不细致说明了~

创建好一个App之后,在点击Manage Your Applictions后的界面应该如下:

这里你将看到自己创建的App,点击你创建的App项目,这里Himi创建的项目名字叫”ProjectForBuyTest“,点击你的App进入如下界面:

 

  (注意:这里的Bundle ID一定要跟你的项目中的info.plist中的Bundle ID保证一致!!!!)

这里可以管理你的项目的信息、状态、是否嵌入GameCenter等等选项,那么本章我们重点介绍如何使用IAp沙盒测试程序内付费,所以这里我们点击右上角的”Manage In-App Purchases“选项进入创建产品(游戏道具)界面如下:

上图中的下方看到Himi创建过的四个产品(道具)了,你可以点击”Create New“选项新建一个产品(付费道具),点击新建如下界面:

上图中Himi没有截图出所有的选项,这里大概介绍下,这个界面是选择你的消费道具的种类,种类说明如下:

   类型选择有四种选择:

   1.Consumable(消耗品): 每次下载都需要付费;

   2.Non-consumable(非消耗品): 仅需付费一次;

   3.Auto-Renewable Subscriptions:自动订阅;

   4.Free Subscription:免费订阅

   最下方是你沙盒测试的截图,暂且不管即可;

   这里Himi选择Consumable选项,比如很多游戏都是购买金币啦这样子就可以选择这个;然后出现如下界面:

Reference Name: 付费产品(道具的)参考名称

   Product ID(产品ID): 你产品的唯一id。通常格式是 com.xx.yy,但它可以是任何形式,不要求以程序的App ID作为前缀。

   Add Language: 添加产品名称与描述语言;

   Price Tier:选择价格,这里你选择价格后,会出现如上图最下方的价格对照表

   Screenshot(截屏): 展示你产品的截屏。(这个直接无视,测试App务必要管这个的)

 

Product ID(产品ID)可以创建多个,比如我想游戏中分为0.99$ 、1.99$等道具那就创建对应多个产品ID

  我们填写好了”Reference Name“与”Product ID“以及”Price Tier“后,点击”Add Language“选项然后出现如下界面:

上图中的选项:

Language:语言

      Displayed Name(显示名称): 用户看到的产品名称。

      Description(描述): 对产品进行描述。

Ok,一路 Save保存回到”Manage In-App Purchases“界面中会看到我们新建的产品(道具)如下:

大家可以看到新建的产品(道具)ID:这里Himi创建的产品ID是com.himi.wahaha ,这里要记住这个产品ID哦~

第二步:申请测试帐号,利用沙盒测试模拟AppStore购买道具流程;

  回到itunesconnect主页中,选择“Manage Users”然后选择“Test User”,然后出现的界面如下图:

这里Himi已经创建了两个测试账号了,点击界面中的 “Add New User”进行创建即可;记住账号和密码哈,记不住就删掉重新建 娃哈哈~(切记:不能用于真正的AppStore中使用此账号,不仅不能用,而且一旦AppStore发现后果你懂得~)

第三步:填写相关的税务,银行,联系人信息;

1.这里需要先设置一下。
点击“Request”,填写一下Legal Entity的基本信息

完成之后同意一个协议并提交

之后页面中会出现Contracts In Process.
2.这时,分别来设置Contact Info、Tax Info和Bank Info
(1)、Contact
点击Contact Info下的“Set Up”,进入Contact Information页面,并点击“Add New Contact”来增加新的contact
填写好里面对应的信息,点Save保存就可以了
然后回到Contact Information页面,刚增加的Contact就会出现在下拉框中,将对应的Role设置对应的Contact然后点Done完成
(2)、Bank
回到Contracts, Tax, and Banking主页面,选择Bank Info下面的”Set Up“,进入Bank Information 页面。选择“Add Bank Account”来增加一个银行信息
选择你银行卡开户所在哪个国家,这里有China了,呵呵
下一步设置银行的CNAPS Code,这个号有的地方说是联行号,可以理解为每个银行支行的唯一ID吧,这个可以打电话问你银行卡开户行,就是他们那的一个唯一12位的标示号码,也可以通过苹果的Look up Transit Number去搜索。

不过,我觉得苹果的搜索全英文的,都不知道国内银行的英文名叫什么,什么支行的英文又是什么。好吧,那就用下面这个网站去查询也是可以的https://e.czbank.com/CORPORBANK/WebBank?&tranFlag=0&dse_operationName=wgQueryUnionBankSrvOp

复制获取的现代化支付系统行号,粘帖到上面苹果页面中的CNAPS Code项。点击下一步,苹果会根据你写的那个代码读出对应的银行信息,这在你可以验证一下你写的银行号是否正确。

再下一步就设置你的卡号,账户名以及币种(人民币是CNY,当初还以为是RMB呢,找了半天,纳闷。当然,如果你的卡支持美元什么的也可以选择别的币种)

 
这步设置完后就是显示你设置的所有信息,这在你可以核对一下是否有误,问没题的话点“Save”保存,保存后就回到前面的Choose Bank页面,选择刚才设置的这个银行“Save”完成银行设置
 
(3)、Tex
回到Contracts, Tax, and Banking主页面,选择Tex Info下面的”Set Up“,进入Tex Information 页面。如果上面有你所在的国家就选,没有的都选择U.S. Tax Forms。下面就来设置一下在天朝的情况:
A. 选择第一个U.S Tax Forms,点击下面的“Set Up”
B. 是否美国公民、或美国公司什么的,这个选择“No”就可以了,不然后面要你设置税号的,这个,真心木有。
C. 有没有美国商业活动.这个也用“No”吧,这个神马的太遥远了,呵呵

D. 设置Tax Infomation。设置一下基本的信息

设置好后点“Confirm”就完成了

 
同样的,把World也设置一下。设置完成后会需要一个处理时间,理论值会在24小时内完成。

第四步:在项目中申请购买产品代码以及监听;

一、开发工作(ios端)

1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>

2、 获得所有的付费Product ID列表。这个可以用常量存储在本地,也可以由自己的服务器返回。

3、 制作一个界面,展示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但如果是不带服务器的单机游戏应用或工具类应用, 则可以通过向App Store查询获得。我在测试时发现,向App Store查询速度非常慢,通常需要2-3秒钟,所以不建议这么做,最好还是搞个自己的服务器吧。

4、当用户点击了一个IAP项目,我们先查询用户是否允许应用内付费,如果不允许则不用进行以下步骤了。代码如下:

  1. if ([SKPaymentQueue canMakePayments]) {
  2. // 执行下面提到的第5步:
  3. [self getProductInfo];
  4. } else {
  5. NSLog(@"失败,用户禁止应用内付费购买.");
  6. }

5、 我们先通过该IAP的ProductID向AppStore查询,获得SKPayment实例,然后通过SKPaymentQueue的 addPayment方法发起一个购买的操作。

  1. // 下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目。否则查询会失败。
  2. - (void)getProductInfo {
  3. NSSet * set = [NSSet setWithArray:@[@"ProductId"]];
  4. SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
  5. request.delegate = self;
  6. [request start];
  7. }
  8. // 以上查询的回调函数
  9. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
  10. NSArray *myProduct = response.products;
  11. if (myProduct.count == 0) {
  12. NSLog(@"无法获取产品信息,购买失败。");
  13. return;
  14. }
  15. SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
  16. [[SKPaymentQueue defaultQueue] addPayment:payment];
  17. }

6、 在viewDidLoad方法中,将购买页面设置成购买的Observer。

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 监听购买结果
  4. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  5. }
  6. - (void)viewDidUnload {
  7. [super viewDidUnload];
  8. [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
  9. }

7、 当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理即可。

  1. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
  2. for (SKPaymentTransaction *transaction in transactions)
  3. {
  4. switch (transaction.transactionState)
  5. {
  6. case SKPaymentTransactionStatePurchased://交易完成
  7. NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
  8. [self completeTransaction:transaction];
  9. break;
  10. case SKPaymentTransactionStateFailed://交易失败
  11. [self failedTransaction:transaction];
  12. break;
  13. case SKPaymentTransactionStateRestored://已经购买过该商品
  14. [self restoreTransaction:transaction];
  15. break;
  16. case SKPaymentTransactionStatePurchasing:      //商品添加进列表
  17. NSLog(@"商品添加进列表");
  18. break;
  19. default:
  20. break;
  21. }
  22. }
  23. }
  24. - (void)completeTransaction:(SKPaymentTransaction *)transaction {
  25. // Your application should implement these two methods.
  26. NSString * productIdentifier = transaction.payment.productIdentifier;
  27. NSString * receipt = [transaction.transactionReceipt base64EncodedString];
  28. if ([productIdentifier length] > 0) {
  29. // 向自己的服务器验证购买凭证
  30. }
  31. // Remove the transaction from the payment queue.
  32. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  33. }
  34. - (void)failedTransaction:(SKPaymentTransaction *)transaction {
  35. if(transaction.error.code != SKErrorPaymentCancelled) {
  36. NSLog(@"购买失败");
  37. } else {
  38. NSLog(@"用户取消交易");
  39. }
  40. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  41. }
  42. - (void)restoreTransaction:(SKPaymentTransaction *)transaction {
  43. // 对于已购商品,处理恢复购买的逻辑
  44. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  45. }

8、服务器验证凭证(Optional)。如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网络异常情况,iOS端的发送凭证操作应该进行持久化,如果程序退出,崩溃或网络异常,可以恢复重试。

二、开发工作(服务端)

服务端的工作比较简单,分4步:

  1. 接收ios端发过来的购买凭证。
  2. 判断凭证是否已经存在或验证过,然后存储该凭证。
  3. 将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
  4. 如果需要,修改用户相应的会员权限。

考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。

与苹果的验证接口文档在这里。简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。

苹果AppStore线上的购买凭证验证地址是https://buy.itunes.apple.com/verifyReceipt ,测试的验证地址是:https://sandbox.itunes.apple.com/verifyReceipt

[转]iOS 应用内付费(IAP)开发步骤的更多相关文章

  1. iOS应用内付费(IAP)开发步骤列表

    iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...

  2. iOS应用内付费(IAP)开发步骤

    1.苹果iTunes Connect内购产品信息录入. 1)创建app内购买项目(Create New),选择类型: 1.消耗型项目 对于消耗型 App 内购买项目,用户每次下载时都必须进行购买.一次 ...

  3. Cocos2d-x使用iOS游戏内付费IAP(C++篇)

    本文章转载 http://www.ityran.com/archives/5515.非本人原创! 前期准备 设备与账号 在开始编码之前我们需要准备测试环境. IAP只能真机测试,准备一台iOS设备是必 ...

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

    本文转载至 http://blog.devtang.com/2013/04/07/tricks-in-iap/ 前言 udacity 中的在线课程 <How to build a startup ...

  5. iOS 应用内付费(IAP)开发步骤

    折腾好几天,原来是税务信息没有填写,哎...  国内就是好啊,没有这些麻烦的事情...  :) 等24小时,等税务的审核结果...     有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...

  6. IOS应用内支付IAP从零开始详解

    前言 什么是IAP,即in-app-purchase 这几天一直在搞ios的应用内购,查了很多博客,发现几乎没有一篇博客可以完整的概括出所有的点,为了防止大伙多次查阅资料,所以写了这一篇博客,希望大家 ...

  7. 苹果内付费 IAP

    创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...

  8. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

    转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成 ...

  9. iOS开发支付篇-内购(IAP)

    一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...

随机推荐

  1. 配置SharePoint使用ADFS

    1. 如果网站应用程序没有使用声明式验证 $wpp = Get-SPWebApplication <URL> $wpp.UseClaimsAuthentication = 1 $wpp.U ...

  2. 得到设备是何种iPhone设备 + 怎么获得启动页面图片

    一.前言 今天做一个功能,需要动态的获得启动页,然后根据不同设备去使用不用的启动页图片. 二.正文 常规来说,我们直接判断是何种设备,然后通过name去获得图片选择性加载即可.但是实际上遇到的两个问题 ...

  3. 【原】结构体包含CString类型成员变量出错的原理

    问题如下:我定义了如下的一个结构体: typedef struct{   CString csText;}MyStruct; 并有如下的程序段1:MyStruct * p=NULL;p=(MyStru ...

  4. jquery1.0源码【1-60行】构造函数及全局$变量

    一.jquery源码1-60行 该部分代码主要完成jquery对象的创建,以及全局变量$与jQurey类的映射: /* * jQuery - New Wave Javascript * * Copyr ...

  5. JS 中html 动态替换

    一.定义通用替换js函数,或调用JQuery验证的$.format函数: //----通用JS操作// var a = "我喜欢吃{0},也喜欢吃{1},但是最喜欢的还是{0},偶尔再买点{ ...

  6. Effective Java 14 In public classes, use accessor methods, not public fields

    Principle To offer the benefits of encapsulation you should always expose private field with public ...

  7. 关于移动端的font和图片的问题

    一.font-family 使用无衬线字体 body { font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif ...

  8. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  9. c#注册表对象映射

    用于快捷保存与读取注册表,为对应的对象 示例 [RegistryRoot(Name = "superAcxxxxx")] public class Abc : IRegistry ...

  10. ERP产品价格成本计算的几个方法(转)

          一般财务计算产品价格又很多方法,我这里做了几个供参考,实体属性主要是编号.数量.价格等,这里就不列出了. /// <summary> /// 先进先出算法 /// </s ...