苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21

一、前言

如果大家的 App 有使用 IAP 功能,那么可能会遇到用户反馈苹果充值成功,但是服务没有到账的情况,用户一般会提供这样的苹果收据:

16239077635884.jpg

用户反馈时提供的苹果收据中,有一个字段中 ORDER ID,苹果叫 Invoice order ID(发票订单号),与我们开发者从 App 内获取到的 receipt 收据解析后,并没有 ORDER ID 字段!!!所以,我们无法定位和联系这个用户提供的发票与我们后台的订单号,从而无法给用户正常补发服务,开发者也是很无奈!

而今年,这个问题苹果终于提供解决方案啦!是不是很开心!点一个赞吧~

大家都知道,手机游戏的收入重要来源就是虚拟物品购买,而 iOS 需要通过 App Store 必须使用苹果的 In-App Purchase (应用内购买,下文统一使用IAP表示内购功能。)功能。而 37手游 是三七互娱旗下独立子公司,作为国内顶尖的手游发行平台,累计运营超过2000款游戏,所以对于 37手游 来说,IAP 的重要性不言而喻!

去年的 WWDC20,苹果推出 IAP退款通知 时,在 What’s new with in-app purchase - WWDC 2020 解读时,小编在 疑问解答 时给出了2个大胆推测:

1、 苹果后台能否查看到退款的订单详情?

答:暂无。(估计明年 WWDC2021 会有啦?)

2、 消耗型、非消耗型、非续期订阅能不能在沙盒环境测试退款?

答:暂时不能。(估计未来会有?等更新吧....)

今年的 WWDC21 大会开始后,小编第一时间就关注 IAP 相关的 Sessions 会议,大喜!今年的 IAP 功能更加开放和透明,去年大家的2个疑问,今年都给解决了!以下就是苹果今年关于 IAP 的三步曲:

16238945099196.jpg

  1. Meet StoreKit 2 - WWDC 2021
  2. Manage in-app purchases on your server - WWDC 2021
  3. Support customers and handle refunds - WWDC 2021

因为以上三个 Session 内容上是相互之间紧密相连,密不可分,所以小编接下来就在本文将这三步曲混合来解读,主要分成三部分:

  1. StoreKit 2:关于在 App 里 API 的更新和变化,包含应用内更改订阅、退款等;
  2. Server to Server:苹果服务器与开发者服务器之间的通讯,包括苹果通知、开发者主动请求苹果服务器、新的验证收据流程等;
  3. Sandbox Test:关于沙盒测试环境相关的更新,还有一些注意事件等。

二、StoreKit 2

16238991331773.jpg

StoreKit 2 主要更新

  • 一套新的基于 Swift 语言特性
  • 更新收据和交易(数据格式和字段变更)
  • 更多订阅类型的接口
  • 相同的 StoreKit 框架
2.1、StoreKit 2 for Swift only

StoreKit 2 for Swift only!没错!仅适用于 SwiftStoreKit 2 利用 Swift的最新特性,包括 Swift并发 等新语言接口,简化在App中获取产品信息、商品产品、处理交易以及管理对内容和订阅的访问。并且,StoreKit 2 只支持 iOS 15+ 。

还在维护 Objective-C 代码的朋友们,是不是瞬间哭晕在洗手间!与新特性无缘,所以现在就是开始学习 Swift 的最佳时刻了,再不学 Swift 开发,连 iOS 开发都不能愉快进行啊~

2.1.1、StoreKit v2 和 v1 是什么关系呢?

我们开发者要怎么选择呢?苹果在选择文档在给出了答案:

  • In-App Purchase: 一个基于 Swift 的 API,以 JSON Web Signature (JWS) 格式提供 Apple 签名交易验证,从 iOS 15、macOS 12、tvOS 15 和 watchOS 8 开始提供。
  • Original API for In-App Purchase: 一个使用 App Store 收据提供交易信息的API,从 iOS 3、macOS 10.7、tvOS 9 和 watchOS 6.2 开始提供。

苹果现在把原来的 StoreKit v1 定义为 Original API for In-App Purchase,StoreKit v2 定义为 In-App Purchase。(小编注:目前来说,使用 v1 和 v2 版本都可以实现完整的 IAP 购买流程,区别就是 v2 必须使用 Swift 开发,同时提供更加强大的 APIs。)

2.1.2、现在什么情况下还需要使用 StoreKit v1 呢?

很好理解,因为 StoreKit v2 目前是重新设计实现,所以部分 v1 提供的 IAP API 在 v2 版本还没有提供相应的 API,所以还需要使用 v1 版本。

如果您的应用程序依赖于以下任何功能,您可能需要使用原始的应用程序内购买API:

  1. 为批量购买计划(VPP,Volume Purchase Program)提供支持。有关更多信息,请参阅 设备管理
  2. 提供应用预订(app pre-orders)。有关更多信息,请参阅 应用预订
  3. 您的 App 从收费更改为免费 App,反之亦然。
  4. 对现有和历史遗留的旧 App 使用 v1 API。

小编注解:

  • 批量购买是针对批量部署设备使用,比如学校有 iPad 提供给学习,可以批量购买应用。
  • 判断用户是否为预订状态时,需要使用 receipt 收据里提供的字段 preorder_date,而 v2 IAP 里已经弃用了 receipt 收据字段。flag:后续有时间,小编在单独写一篇文章来说说应用预订吧。(觉得好就点个赞吧~)
  • App 在 App Store 更改为收费或者免费模式,在 App 里想查询用户购买历史,需要在 receipt 收据里查询。
2.2、Powerful new APIs

16239023498872.jpg

StoreKit 2 提供了以上更新的类(方法)来轻松访问 IAP 接口,可以理解为增强的版本,详细下文会讲解。

  • Products:有关在 App Store Connect 中配置的内购品项的信息
  • Purchases:更新购买品项接口的可选参数,可绑定用户ID
  • Transaction info:更新交易信息的内容格式
  • Transaction history:提供查询交易历史记录的接口
  • Subscription status:提供订阅品项的状态查询接口

16239024399034.jpg

Product 类增加了品项的类型:

public static var consumable: Product.ProductType
public static var nonConsumable: Product.ProductType
public static var nonRenewable: Product.ProductType
public static var autoRenewable: Product.ProductType

同时也扩展订阅类型的信息。订阅类型的品项,包含 isEligibleForIntroOffer,这个字段的作用是判断,用户是否有资格使用优惠价格进行订阅。借助 StoreKit 2,我们以后就可以更轻松地确定客户是否符合您的推介促销优惠的条件。关于订阅类型的复杂度这里就不展开了,大多数同学可能也接触不多,详细可查看自动续期订阅

另外,StoreKit 2 向前兼容原来的 Product,添加称为 BackingValue 的包装类型来实现这一点,用于与 App Store 通信的数据类型。详见文档:BackingValue

16239024780063.jpg

除了原有的请示品项信息外,购买时,增加了一些可选参数 Purchase opthons

16239025159619.jpg

除了购买数据、促销优惠 外,最重要的是新字段:App account token

16239025509939.jpg

  • 开发者创建 App account token
  • 关联到 App 里的用户账号
  • App account token 使用 UUID 格式
  • 在交易(Transcation)订单中永久保存

这个 App account token 是给开发者将用户的 ID 绑定到交易(Transcation)中,也就是把苹果的交易订单数据与用户信息进行映射,可以起到防止充值掉单的问题啊~

示例代码:


                
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值