Apple 应用内支付心得
http://tank2308635.iteye.com/blog/1238687Apple 应用内支付
首先简要说一下IAP 流程
简要步骤说明:
- 用户进入购买虚拟物品页面,App从后台服务器获取产品列表然后显示给用户
- 用户点击购买购买某一个虚拟物品,APP就发送该虚拟物品的productionIdentifier到Apple服务器
- Apple服务器根据APP发送过来的productionIdentifier返回相应的物品的信息(描述,价格等)
- 用户点击确认键购买该物品,购买请求发送到Apple服务器
- Apple服务器完成购买后,返回用户一个完成购买的凭证
- APP发送这个凭证到后台服务器验证
- 后台服务器把这个凭证发送到Apple验证,Apple返回一个字段给后台服务器表明该凭证是否有效
- 后台服务器把验证结果在发送到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 应用内支付心得的更多相关文章
- iOS应用内支付(IAP)的那些坑
本文转载至 http://blog.devtang.com/2013/04/07/tricks-in-iap/ 前言 udacity 中的在线课程 <How to build a startup ...
- IOS IAP APP内支付 Java服务端代码
IOS IAP APP内支付 Java服务端代码 场景:作为后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证. 基础:可以参考上一篇转载的博文In-App Purcha ...
- SDK接入(3)之iOS内支付(In-App Purchase)接入
SDK接入(3)之iOS内支付(In-App Purchase)接入 继整理了Android平台的SDK接入过程.再来分享下iOS平台的内支付(In-App Purchase)接入,作为笔者在游戏开发 ...
- SDK接入(2)之Android Google Play内支付(in-app Billing)接入
SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之 ...
- 【读书笔记】iOS-验证应用内支付的凭证注意事项
1,简单来说,越狱后的手机由于没有沙盒作为保护,黑客可以对系统进行任意的修改,所以,在支付过程中,苹果返回的已付款成功的凭证可能是伪造的.客户端拿到付款凭证之后,还需要将凭证上传到自己的服务器,进行二 ...
- Google play billing(Google play 内支付) 上篇
写在前面: 最近Google貌似又被全面封杀了,幸好在此之前,把Google play billing弄完了,现在写篇 博客来做下记录.这篇博客一是自己做个记录,二是帮助其他有需要的人.因为现在基本登 ...
- 应用内支付(IAP)可加入三方支付
Windows Phone 放开政策 - 应用内支付(IAP)可加入三方支付 Windows Phone 应用商店在 今年(2013)11月04号 修改了商店政策 允许公司账户的应用使用三方支付S ...
- Windows Phone 放开政策 - 应用内支付(IAP)可加入三方支付
Windows Phone 应用商店在 今年(2013)11月04号 修改了商店政策 允许公司账户的应用使用三方支付SDK. 通过 App certification requirements cha ...
- 关于app集成支付宝应用内支付的问题总结
pem文件生成,将合作伙伴密钥复制到notepad++中,每45个字符回车,去除空格,头尾加上标题,文件需保存为无BOM的UTF8格式,就OK. 可以每行64个字符,共216个字符. 近来处理了 ...
随机推荐
- javascript中判断数据类型
编写javascript代码的时候常常要判断变量,字面量的类型,可以用typeof,instanceof,Array.isArray(),等方法,究竟哪一种最方便,最实用,最省心呢?本问探讨这个问题. ...
- css3 mask遮罩动画(照明灯效果)
<pre><!DOCTYPE html><html lang="en"><head><meta charset="U ...
- SSM配置梳理
这两天梳理了一下 SSM 的配置,做一个小总结 可能有一些不对的地方,如果您发现了什么错误,非常希望能帮忙指出,谢谢 我参考了很多文章,都标明了来源(链接),可能会影响阅读的连贯性,抱歉 ...
- 如何基于 PHP-X 快速开发一个 PHP 扩展
0x01 起步 PHP-X本身基于C++11开发,使用cmake进行编译配置.首先,你需要确定所有依赖项已安装好.包括: gcc-4.8 或更高版本 PHP7.0 或更高版本,需要php7-dev 开 ...
- IDEA+JSP+Servlet+Tomcat简单的登录示例
1.用IDEA新建Java WEB项目并配置Tomcat 这一部分可以参考之前的一篇随笔 https://www.cnblogs.com/lbhym/p/11496610.html 2.导入Servl ...
- (C#)WPF:Grid面板介绍
Grid:网格面板 Grid和其他各个Panel比较起来,功能最多也最为复杂.要使用Grid,首先要向RowDefinitions和ColumnDefinitions属性中添加一定数量的RowDefi ...
- idea2017建立jsp工程及tomcat等配置
1:建立工程,选择Java Enterprise,可能需要选择tomcat路径和jdk路径: =============================== 以下作为第二种方式参考: 1:创建新工程 ...
- hdu 1530 Maximum Clique (最大包)
Maximum CliqueTime Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 小白学 Python 爬虫(4):前置准备(三)Docker基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- Redshitf Install
创建VPC 和 子网和internet网关(子网需开启自动分配公网IP,VPN 需添加到internet网关的路由) 创建安全组: 创建cluster subnet Group; 创建redshift ...