iOS IAP 自动更新的订阅服务

本文深入探讨了In-AppPurchase中的自动更新型订阅服务,包括配置、客户端实现及服务器验证流程,以及如何通过JSON数据验证订阅服务的有效性和过期情况。

自动更新的订阅服务

In-App Purchase提供了自动更新型订阅服务的标准方式。自动更新型订阅有如下新的显著特征:

1. 当你在iTunes Connect中配置自动更新型订阅服务时,需要同时指定更新周期和其他的促销选项。
2. 自动更新型订阅服务会被自动恢复(使用Store Kit中恢复非消费型商品一样的函数)。原始的交易信息会和更新的交易信息一起发送给你的程序。详情请查看“Restoring Transactions”一节。
3. 当你的服务器向App Store验证收据(receipt),订阅服务被激活并更新时,App store会向你的app返回更新后的收据信息。

3.为你的商店添加自动更新型订阅服务

按以下步骤来实现自动更新型订阅服务:
1. 连接iTunes Connect网站,并创建一个共享密钥。共享密钥是一个密码,你的服务器在验证自动更新型订阅服务的时候必须提供这个密码。共享密钥为App Store的交易增加了一层保护。(详情,请参考iTunes Connect Developer Guide文档)

2. 在iTunes Connect中创建并配置新的自动更新型订阅服务商品。

3. 修改服务器端关于验证收据部分的代码,添加共享密钥到验证信息用的JSON数据中。服务器的验证代码需要可以解析App store的返回数据以判断订阅是否过期。如果订阅服务已经被用户更新,最新的收据也会返回给你的server。

设计iOS客户端

大多数情况下,iOS客户端程序应做出最小新改来支持自动更新型订阅服务。事实上,客户端程序需要做的更简单,你可以使用非消费型(non-consumable)商品的流程来做自动更新型订阅服务的事情。你的程序在不同时期会收到单独的交易信息来告知订阅已被更新。程序应该单独验证每一条收据。

验证自动更新型订阅服务的收据

验证自动更形型订阅服务的收据和之前讲到的“验证收据”的方式一致。你的程序创建一个JSON对象并把它发送给App Store。自动更新型订阅服务的JSON对象必须包含另外的参数——就是你在iTunes Connect中创建的共享密钥。

{
“receipt-data” : “(actual receipt bytes here)”
“password” : “(shared secret bytes here)”
}

返回内容包含了状态信息,用来标识收据是否验证有效。

{
“status” : 0,
“receipt” : { … }
“latest_receipt” : “(base-64 encoded receipt)”
“latest_receipt_info” : { … }
}

如果用户的收据是有效的,订阅被激活,则status的值为0。receipt对应的值为解码后的收据信息。如果你的服务器收到了非零值的状态码,对照表7-1查看:

表7-1 自动更新型订阅服务返回状态码
状态码 描述
21000 App Store无法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据无法被验证
21004 你提供的共享密钥和账户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
注意:在这里的非零状态码只是针对自动更新型订阅服务,不能将这些状态码用在测试其他类型产品的返回值中。

JSON数据中的receipt栏位包含了解析过的收据信息。自动更新型订阅服务包含了一些新加的信息。请参考表7-2:

表7-2 自动更新型订阅服务的信息:

键名 描述
expires_date 订阅的过期时间,显示方式是从Jan 1, 1970, 00:00:00 GMT计算到过期时间的毫秒数。这个键不包含在恢复的交易信息中。
original_transaction_id 初次购买的交易标识。所有订阅的更新和恢复交易都共享这个标识
original_purchase_date 初次购买(订阅)的日期。
purchase_date 交易的日期。对于更新订阅的交易来说,这个日期表示更新日期。如果从App Store解析的数据是最新的订阅收据,这个值表示最近更新订阅的日期。

除了receipt-Data信息外,返回内容还可能包含另外两个信息。如果用户的订阅服务被激活并更新。则latest_receipt信息会被以base-64方式编码并包含在返回内容中。解码后的新的收据信息也会在latest_expired_receipt_info包含。你的服务器可以使用新的收据来维护最新更新订阅的信息。

4. 如果交易是恢复过来的(restore),我们用这个方法来处理:

– (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
[self recordTransaction: transaction];
[self provideContent: transaction.payment.productIdentifier];

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
这个过程完成购买的过程类似。 恢复的购买内容提供一个新的交易信息,这个信息包含了新的transaction的标识和receipt数据。 如果需要的话,你可以把这些信息单独保存下来,供追溯审(我们的)查之用。但更多的情况下,在交易完成时,你可能需要覆盖原始的transaction数据,并使用其中的商品标识。

### iOS 应用内购买 (IAP) 的促销优惠实现方式 苹果提供了多种机制来支持开发者通过应用内购买(In-App Purchase, IAP)提供促销优惠。这些功能允许开发者向用户提供折扣或其他形式的激励,从而提升用户体验并增加收入。 #### 1. **Promotional Offers** 苹果引入了 Promotional Offers 功能,使开发者能够为自动续订订阅产品创建限时折扣或免费试用期。这种功能可以通过 StoreKit API 实现,并且需要遵循特定规则和流程: - 开发者可以在 App Store Connect 中配置促销优惠的具体细节,例如折扣百分比、持续时间以及适用条件[^2]。 - 用户界面应清晰展示当前可用的促销活动及其条款。如果设备检测到用户可能无意触发交易,则需采取额外的安全措施以防止误操作[^1]。 以下是设置 Promotional Offer 的基本步骤代码示例: ```swift import StoreKit func configureSubscriptionDiscount() { let price: NSDecimalNumber = 9.99 let subscriptionPeriod = SKProductSubscriptionPeriod(numberOfUnits: 1, unit: .month) guard let discount = SKProductDiscount(price: price, subscriptionDuration: subscriptionPeriod, numberOfPeriods: 1, freeTrialPeriod: false) else { return } // Add the discount to your product's list of discounts. } ``` #### 2. **Family Sharing 和 Volume Purchase Program 折扣** 除了直接针对用户的促销外,还可以利用 Family Sharing 或 Volume Purchase Program 提供批量采购折扣给企业客户或者家庭成员共享服务时享受更低价格[^3]。 #### 3. **Custom Code Implementation Considerations** 当实施任何类型的支付选项时,务必考虑安全性问题以防止单纯动作如眨眼被误解成确认付款指令;建议采用双重验证方法比如手势配合确认框等方式提高准确性减少争议发生几率。 #### 注意事项 所有涉及金钱转移的操作都应当格外小心处理以免造成不必要的经济损失风险。同时也要注意不同地区法律法规对于电子商贸合同成立要件的规定差异性影响实际执行效果[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值