iOS自动订阅商品(Auto-Renewable Subscriptions)相关处理

news/2025/1/15 18:06:36/

来源:http://blog.csdn.net/xyxjn/article/details/17412453

 由于网上有关自动订阅的信息较少,自己姑且整理一下目前接触到的信息,希望能够对一些朋友有所帮助,如有疑问欢迎随时留言交流。


相关内容可参见苹果官方文档:

https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/APIOverview/OverviewoftheStoreKitAPI.html#//apple_ref/doc/uid/TP40008267-CH100-SW1

           自动订阅商品在订阅过程及订阅完成后的有效期内,均可理解为非消费品,其支付过程及恢复流程(这里特指苹果自身的恢复流程)均和非消费品相同。

           目前主要有如下几个问题需要注意:

           1、订阅到期的处理

                     目前网上并没有对于订阅到期的明确处理方式,目前据说有如下几种做法:

a、订阅到期或者用户手动取消订阅之后,再次进入客户端,会收到苹果发来的回调,就是在之前的购买成功/失败/恢复流程接收回调的observer里,客户端根据该回调进行相关处理。

这其实是最合理的处理方式,但是经过自测,发现客户端并未收到任何消息,至少在测试环境下没有收到任何消息,网上有朋友说是测试环境收不到,但是正式环境可以收到,由于测试难度较大,所以一直没有拿线上产品这么尝试过。

b、客户端自行连服务器判断是否订阅过期,过期之后执行恢复流程。

执行恢复流程确实可以达到目的,可以通过恢复回来的receipt向苹果验证,从而得到用户在苹果当前的订阅信息。但是恢复流程的一个致命缺陷就是需要输入密码,而且用户可以选择不输入,这样的话用户体检就大打折扣了。

c、客户端在订阅成功后将苹果返回的receipt记录本地,每次程序启动后(防止客户端时间被篡改的情况)向苹果验证一次订阅是否有效,然后执行后续逻辑。

这样处理也可以达到目的,但是与其如此做,还不如把记录和验证receipt的工作放在服务器,过期时间也由服务器判断,这样可以保证稳定性,同时也可以优化流程。

     因此可考虑如下操作:

                     当客户端订阅成功之后,苹果会返回当前订阅的有效期及其相应的receipt,服务器记录这些参数。

                     在订阅到期时(可先由客户端判断订阅是否到期,未到期则不做处理,客户端判断到期则先向服务器验证是否真的订阅到期,若服务器也判断为订阅到期,则说明确实到期),服务器用之前记录的receipt向苹果再次验证,通过苹果返回的错误码来判断用户已经自动续订还是手动取消订阅。

                     在这个过程中,客户端不需要做任何处理,只需要走check订阅有效期的流程即可。(当客户端判断出用户已经不在有效期后,会向服务器请求,服务器会将新的有效期下发给客户端)

           2、用户手动篡改时间的预防机制

                     可考虑如下操作:

     在客户端订阅成功之后,苹果会返回当前订阅的有效期间(起始时间+中止时间,是两个时间点),客户端记录该时间。

                     每当程序切换到前台之后,获取系统当前时间。用该时间对上述已记录的订阅有效期进行验证。若当前时间仍在订阅有效期内,则更新起始时间为当前时间;若不在有效期内,则向服务器发送请求,服务器将当前时间及有效期等相关信息回传给客户端,客户端再次检测当前是否在有效期之内,然后执行后续流程。

                     这样处理可以不停的缩短用户的订阅有效期,并在很大程度上避免客户端修改本地时间的作弊行为。

3、订阅模块的返回结果

                     由于每套订阅流程对应的业务逻辑不同,因此目前暂定为订阅模块可返回一个BOOL标志当前是否在有效期之内,和两个时间戳,标识订阅起始时间和终止时间,由外部接到返回数据之后进行自身业务逻辑的处理。


           4、订阅商品的family

                     由于本支付模块包含多处订阅+普通购买,因此每一处订阅可使用一个family标签,其中可包含多个期间档。不同的订阅使用不同的family。

                     一个family下可以包含多个订阅商品,但最多6个(7天,1个月,2个月,3个月,6个月,1年)。同一个family下的多个商品,当已有商品被订阅且当前仍在有效期时(如7天),其他商品(如1个月)不可被订阅。不同family没有此限制。

           5、过度订阅

                      需要确定订阅到期之后,是否所有订阅过程中获取到的信息全部清零,如有需要延续的物品,则需要考虑过度订阅的问题。如在某些应用中,在订阅期内把所有的商品都购买了,然后取消订阅。这里需要考虑清楚预防机制。

           6、恢复流程相关

                     该恢复流程是指广义上的恢复,即通过服务器的同步操作,可将用户的相关信息跨设备共享,操作对象为已登陆用户和获取openUDID后的未注册用户。

                     可优先选择使用服务器的同步操作,同步完成之后,可提示用户是否需要执行苹果的恢复操作,并以此来决定是否执行苹果的恢复流程(狭义上的恢复流程)。如需执行苹果的IAP恢复操作,则需要注意从苹果拿到数据后的处理,有些数据可能在服务器同步的过程中已经被恢复过了,这里要注意兼容。

           7、管理已订阅内容

  1. 在设备的主屏幕上,轻按 App Store
  2. 轻按屏幕底部的精品推荐
  3. 滚动到页面底部。
  4. 轻按左下角的 Apple ID 按钮。(如果未登录,可轻按登录按钮并通过您的 Apple ID 登录。然后滚动回页面底部,轻按Apple ID 按钮。)
  5. 轻按查看 Apple ID 按钮。
  6. 输入您的密码,然后点按“好”。
  7. 在帐户主页面上,向下滚动并轻按管理 App 订阅。如果您没有 app 订阅,此按钮将不显示。
  8. 从 iPhone、iPad 或 iPod 上的“管理 App 订阅”页面中,轻按您要管理的 app。
  9. 根据不同的 app,您可以选择管理不同的订阅类别。

详见 http://support.apple.com/kb/HT4098?viewlocale=zh_CN&locale=zh_CN

————————————————————————————————————————————

目前的订阅商品包括:自动续订的订阅(Auto-RenewableSubscriptions),非自动续订的订阅(Non-RenewingSubscription),免费订阅(Free Subscription)。

           这里暂时只描述自动续订的订阅。

 

           自动订阅商品在订阅过程及订阅完成后的有效期内,均可理解为非消费品,其支付过程及恢复流程(这里特指苹果自身的恢复流程)均和非消费品相同。

           目前主要有如下几个问题需要注意:

           3.1、客户端修改时间的预防

                     可考虑如下操作:

在客户端订阅成功之后,苹果会返回当前订阅的有效期间(起始时间+中止时间,是两个时间点),客户端记录该时间。

                     每当程序切换到前台之后,获取系统当前时间。用该时间对上述已记录的订阅有效         期进行验证。若当前时间仍在订阅有效期内,则更新起始时间为当前时间;若不在有效       期内,则向服务器发送请求,服务器将当前时间及有效期等相关信息回传给客户端,客户端再次检测当前是否在有效期之内,然后执行后续流程。

                     这样处理可以不停的缩短用户的订阅有效期,并在很大程度上避免客户端修改本地         时间的作弊行为。

           3.2、订阅到期的处理

                     目前网上并没有对于订阅到期的明确处理方式,可考虑如下操作:

                     当客户端订阅成功之后,苹果会返回当前订阅的有效期及其相应的receipt,服务    器记录这些参数。

                     在订阅到期时,服务器用之前记录的receipt向苹果再次验证,通过苹果返回的错   误码来判断用户已经自动续订还是手动取消订阅。

                     在这个过程中,客户端不需要做任何处理,只需要走check订阅有效期的流程即可。      (当客户端判断出用户已经不在有效期后,会向服务器请求,服务器会将新的有效期下       发给客户端)

           3.3、订阅模块的返回结果

                     由于每套订阅流程对应的业务逻辑不同,因此目前暂定为订阅模块只返回一个         BOOL标志当前是否在有效期之内,由外部接到返回数据之后进行自身业务逻辑的处理。

           3.4、订阅商品的family

                     由于本支付模块包含多处订阅+普通购买,因此每一处订阅可使用一个family标    签,其中可包含多个期间档。不同的订阅使用不同的family。

                     一个family下可以包含多个订阅商品,但最多6个(7天,1个月,2个月,3个月,      6个月,1年)。同一个family下的多个商品,当已有商品被订阅且当前仍在有效期时(如  7天),其他商品(如1个月)不可被订阅。不同family没有此限制。

           3.5、过度订阅

                      需要确定订阅到期之后,是否所有订阅过程中获取到的信息全部清零,如有需要延         续的物品,则需要考虑过度订阅的问题。如在大德符咒中,在订阅期内把所有的符都请       了,然后取消订阅。

           3.6、恢复流程相关

                     该恢复流程是指广义上的恢复,即通过服务器的同步操作,可将用户的相关信息跨         设备共享,操作对象为已登陆用户和获取openUDID后的未注册用户。

                     可优先选择使用服务器的同步操作,同步完成之后,可提示用户是否需要执行苹果         的恢复操作,并以此来决定是否执行苹果的恢复流程(狭义上的恢复流程)。如需执      行苹果的IAP恢复操作,则需要注意从苹果拿到数据后的处理,有些数据可能在服务器           同步的过程中已经被恢复过了,这里要注意兼容。



http://www.ppmy.cn/news/748595.html

相关文章

IOS开发 NSNotificationCenter

NSNotificationCenter的用途 在iOS应用程序中,有时需要在不同的对象之间传递消息。例如,当用户点击一个按钮时,您可能需要通知其他视图控制器或模型对象,以便它们可以执行某些操作。此NSNotificationCenter就派上了用场。 NSNot…

如何在iPhone或iPad上检查和取消订阅自动续费

现在大部分应用程序和服务会员都开通了订阅功能。一般情况下,自动续费会比购买月度、季度、年度会员要优惠很多,因此,很多用户在购买会员时选择订阅。 对于iPhone和iPad用户,经常是通过Apple ID进行订阅付费。很多时候&#xff0…

苹果订阅测试总结

1. 参考文档 官方文档-介绍App内购买项目订阅优惠的对比官方文档-订阅介绍优秀博文1优秀博文2 2. 配置总结(对两篇优秀博文的补充) 推荐促销优惠适用顾客:凡是没有购买过这个订阅群组的推荐促销优惠的appid都可以享受一次优惠 促销优惠适用…

iOS内购(IAP)自动续订订阅

一、介绍 iOS 的 App 内购类型有四种: 消耗型商品:只可使用一次的产品,使用之后即失效,必须再次购买。示例:钓鱼 App 中的鱼食。 非消耗型商品:只需购买一次,不会过期或随着使用而减少的产品。示…

后端做app连续会员包月功能 -- IOS连续订阅 支付宝周期扣款

IOS连续订阅总结 如何判断后续用户是续费 1. 服务端轮询续费表,会员到期的前一天,根据用户id。去苹果服务器检验用户是否续费成功a. 查询的状态应有:等待扣费、扣费失败b. 扣费失败 , 对于扣费失败的用户, 苹果仍会尝试扣款60天, 此时应该标…

iOS开发者因“自动订阅”被拒N次最终过审的心路历程

我有位刚入行的开发者朋友(以下简称小张),最近在操作订阅这一块的时候的时候,遇到了很多问题,原本以为只是一些小小的问题,没想到他却因此连续被拒了4次,整整持续了十几天时间!下面我…

iOS订阅测试终极指南The Ultimate Guide to iOS Subscription Testing

订阅测试如何测试呢?平时遇到的都是消耗型商品,没有持续性,买完就完了,而订阅型是一个持续时间段,这个时间内有很多故事发生,测试起来相对也是复杂的多。找到一篇文章,参考下: 找到…

apple iOS订阅开发-服务端

前言 开发苹果订阅,客户端的改动不大,主要服务端要处理苹果服务器发送的通知,判断通知类型,验证收据 基本步骤 1.苹果后台创建订阅商品,创建共享密钥password2.苹果后台配置通知自己服务器地址url3.解析苹果通知&am…