http://tank2308635.iteye.com/blog/1238687Apple 应用内支付

首先简要说一下IAP 流程

简要步骤说明:

  1. 用户进入购买虚拟物品页面,App从后台服务器获取产品列表然后显示给用户
  2. 用户点击购买购买某一个虚拟物品,APP就发送该虚拟物品的productionIdentifier到Apple服务器
  3. Apple服务器根据APP发送过来的productionIdentifier返回相应的物品的信息(描述,价格等)
  4. 用户点击确认键购买该物品,购买请求发送到Apple服务器
  5. Apple服务器完成购买后,返回用户一个完成购买的凭证
  6. APP发送这个凭证到后台服务器验证
  7. 后台服务器把这个凭证发送到Apple验证,Apple返回一个字段给后台服务器表明该凭证是否有效
  8. 后台服务器把验证结果在发送到APP,APP根据验证结果做相应的处理

由于IAP相关文档有限,为此特整理在IAP开发过程中的一些注意事项:

一、产品类型的选择

IAP的商品从消费性质上分为四种:

1.消耗型商品(Consumable),比如游戏道具,子弹,药品等等。由于这类商品可以被消耗,所以支持重复购买。苹果应用商店不保存此类商品的购买记录,如果要保存则需要开发者同步到自己的服务器上。

2.非消耗型商品(Non-Consumable),比如游戏关卡,隐藏地图等等。这类商品只要购买一次便可以了,苹果应用商店里每一个用户对非消耗型商品的购买都有记录,可以在不同的设备上恢复购买状态,这个恢复的过程叫做Restore。  在自己做测试时,首次购买非消耗型商品时,在updateTransaction回调中,会调用XXXpurchasing \ XXXpurchased .再次购买该商品时,苹果会自动提示该商品已经购买您需要再次免费获取吗?此时走的流程和首次购买是一样的,也会调用XXXpurchasing \ XXXpurchased 。都未调用XXXrestore 回调,具体原因不详。

3.自动重置型订阅(Auto-Renewable Subscriptions,比如电子杂志,读物等。消费者购买这类商品时会从列表中选择一个有效期限,卖家在定义商品的时候从一群固定的选项 中选择添加一个有效期,比如7天,一个月,两个月。过了有效期之后,商品的购买状态会被自动重置成未购买,要想继续获得内容则需要再次订阅。这种类型的商品和非消耗型商品一样,会在苹果商店内保存购买记录。

4.非自动重置型订阅(Non-Renewing Subscription,比如用户订阅电子杂志和读物报刊时需要从自定义的期限列表中选择期限,而不是苹果提供的固定选项,比如9天,一个半月或任意时间。在这种情况下,苹果商店无法根据期限来控制订阅的到期行为,所以一切都需要开发商自己编写相应的逻辑来实现。

在创建产品类型的选择决定着客户端/server的处理流程,为此一定要在选择类型时考虑所创建的产品特性,选择时,如果对于自动重置型订阅,特别需要注意,此类型的商品的必须依据苹果设置的使用期限进行创建,如一个月、三个月、半年等,不能创建任意时间段,同时,在此类型中,经过在沙盒测试发现,当产品到期时,苹果服务器会自动进行续订操作,因此,客户端需根据监听处理苹果的续订事件进行续订结果提示用户;

二、产品的支付验证服务器选择

当创建好产品后,客户端进行IAP服务监听后,由于IAP在支付后成功后,会收到苹果服务器的支付凭证,客户端在获取到支付凭证后,需要将支付凭证反馈给server服务器进行支付验证确认。此时,不管是采用客户端APP的server验证方式还是客户端APP验证方式,都需要根据当前APP的支付环境选择正确的验证地址,在苹果服务器中,沙盒测试环境的IAP验证地址为:https://sandbox.itunes.apple.com/verifyReceipt,正常线上交易的验证地址为:https://buy.itunes.apple.com/verifyReceipt,为保证审核的通过,需要在客户端或server进行双重验证,即,先以线上交易验证地址进行验证,如果苹果正式验证服务器的返回验证码code为21007,则再一次连接沙盒测试服务器进行验证即可。

在应用提审时,苹果IAP提审验证时是在沙盒环境的进行的,即:苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,如果没有做双验证,需要特别注意此问题,否则会被拒;

三、产品线上支付过程中的不同环境处理

IAP沙盒环境及线上环境在处理过程中有些问题,需进行特殊处理;

在沙盒环境下,进行支付时,无银行支付验证过程,此时应用一直处于IAP支付过程中,直至支付完成;

而在线环境下,由于IOS6添加了支付确认过程,导致在银行密码确认过程中确认完毕后,应用未能及时返回APP,且此时会收到server下推的SKPaymentTransactionStateFailed事件,当返回到应用后,如果此时已经注册了IAP支付消息处理,当刚才的支付成功后,苹果服务器会反馈SKPaymentTransactionStatePurchased或SKPaymentTransactionStateRestored事件,此时客户端在此事件中获取凭证并进行支付确认;

由于部分类型具有购买恢复操作Restore,所以当删除APP后,又重新安装APP,此时需要恢复之前的购买时,在IAP处理中仍需进行SKPaymentTransactionStateRestored事件的处理,如果通过server方式进行支付凭证验证的,需要判断当前的Restore事件是恢复支付还是购买支付,以保证servver的统计正确;此时可由server根据验证凭证中的有效信息(如有效期信息)进行判断是为新的购买还是以往支付的恢复;

四、IAP事件注册时机

对于IAP支付,当支付成功时但由于网络等引起的支付凭证验证失败或未进行验证时,在IAP事件注册后,苹果服务器会通过SKPaymentTransactionStatePurchased或SKPaymentTransactionStateRestored事件进行返回支付凭证,客户端需对此支付凭证进行验证,以保证支付完整性;为此,在app启动时,应直接进行IAP事件注册;即:[SKPaymentQueuedefaultQueue]addTransactionObserver操作;

五、越狱手机的IAP问题

由于越狱手机可能安装了黑客的恶意程序,监听网络数据,支付凭证中并不包含任何用户的apple id信息,所以我们的app和服务器无法知道这个凭证是谁买的,如果恶意程序截获苹果服务器的有效支付凭证,但恶意程序将假的支付凭证发给后台server导致原支付的账号验证失败,而此时恶意程序将截获的有效支付凭证对应到另外的支付账号上,就会导致该恶意程序设置的账号通过正确的支付凭证而获取server的认证。

所以,对于越狱的手机可禁用IAP支付,采用第三方支付平台进行支付的方式。

IAP支付常见问题 http://www.th7.cn/Program/IOS/201506/472461.shtml

Apple 应用内支付心得的更多相关文章

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

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

  2. IOS IAP APP内支付 Java服务端代码

    IOS IAP APP内支付 Java服务端代码   场景:作为后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证. 基础:可以参考上一篇转载的博文In-App Purcha ...

  3. SDK接入(3)之iOS内支付(In-App Purchase)接入

    SDK接入(3)之iOS内支付(In-App Purchase)接入 继整理了Android平台的SDK接入过程.再来分享下iOS平台的内支付(In-App Purchase)接入,作为笔者在游戏开发 ...

  4. SDK接入(2)之Android Google Play内支付(in-app Billing)接入

    SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之 ...

  5. 【读书笔记】iOS-验证应用内支付的凭证注意事项

    1,简单来说,越狱后的手机由于没有沙盒作为保护,黑客可以对系统进行任意的修改,所以,在支付过程中,苹果返回的已付款成功的凭证可能是伪造的.客户端拿到付款凭证之后,还需要将凭证上传到自己的服务器,进行二 ...

  6. Google play billing(Google play 内支付) 上篇

    写在前面: 最近Google貌似又被全面封杀了,幸好在此之前,把Google play billing弄完了,现在写篇 博客来做下记录.这篇博客一是自己做个记录,二是帮助其他有需要的人.因为现在基本登 ...

  7. 应用内支付(IAP)可加入三方支付

    Windows Phone 放开政策 - 应用内支付(IAP)可加入三方支付   Windows Phone 应用商店在 今年(2013)11月04号 修改了商店政策 允许公司账户的应用使用三方支付S ...

  8. Windows Phone 放开政策 - 应用内支付(IAP)可加入三方支付

    Windows Phone 应用商店在 今年(2013)11月04号 修改了商店政策 允许公司账户的应用使用三方支付SDK. 通过 App certification requirements cha ...

  9. 关于app集成支付宝应用内支付的问题总结

    pem文件生成,将合作伙伴密钥复制到notepad++中,每45个字符回车,去除空格,头尾加上标题,文件需保存为无BOM的UTF8格式,就OK.  可以每行64个字符,共216个字符.   近来处理了 ...

随机推荐

  1. Dockerfile介绍及指令详情

    Dockerfile简介:   镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么哪些无法重复的问题.镜 ...

  2. 使用CXF发布webservice服务及注意要点

    一.概念 1.什么是webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用 ...

  3. 创建基于OData的Web API - Knowledge Builder API, Part IV: Write Controller

    基于上一篇<创建基于OData的Web API - Knowledge Builder API, Part III:Write Model and Controller>,新创建的ODat ...

  4. mpvue开发微信小程序,分享按钮报错:`Cannot read property 'apply' of null`

    用mpvue开发微信小程序,分享按钮报错:Cannot read property 'apply' of null onShareAppMessage 是于微信小程序Pages的生命周期钩子,顾这个方 ...

  5. Mysql备份还有这么多套路,还不了解下?

    逻辑备份和物理备份 逻辑备份 逻辑备份用于备份数据库的结构(CREAET DATABASE.CREATE TABLE)和数据(INSERT),这种备份类型适合数据量小.跨SQL服务器.需要修改数据等场 ...

  6. Cesium坐标系及坐标转换详解

    前言 Cesium项目中经常涉及到模型加载.浏览以及不同数据之间的坐标转换,弄明白Cesium中采用的坐标系以及各个坐标系之间的转换,是我们迈向三维GIS大门的前提,本文详细的介绍了Cesium中采用 ...

  7. veu npm run dev指定host

    通常,我们可以在vue项目中的config/index.js指定host,,如下(解host的注释) 但是,在接手的目前项目中,解注释host后,npm run dev并有变为 http://192. ...

  8. 数据库05 使用percona软件来进行数据备份

    1.为什么要与用percona来备份 常见的MySQL备份工具 —跨平台性差 —备份时间长.冗余备份.浪费存储空间 mysqldump备份缺点: —效率较低.备份与还原速度慢,锁表(即备份数据库中的一 ...

  9. Ubuntu 16.04源码编译boost库 编写CMakeLists.txt | compile boost 1.66.0 from source on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/d5d4a460/,欢迎阅读! compile boost 1.66.0 from source on ubuntu 16.04 G ...

  10. C博客作业00—我的第一篇博客

    C博客作业00-我的第一篇博客 1. 你对网络专业或者计算机专业了解是怎样? 泛泛了解 - 原先只知道网络工程隶属于计算机工程学院,与院中其他专业一样,同样都需要学习大量的计算机基础知识,然后再分支学 ...