iOS内购功能调研
术语 in-app purchase
或 IAP
大致流程
- 应用发送请求到服务器,获取所有的可用Products Id集合,(当然你也可以把Products Id硬编码到程序中,这样会导致不能动态配置商品).
- 根据服务器返回的 Products Id 以及信息设置购买界面UI.(这里跟图一有些不同)
- 用户点击购买商品.
- 客户端根据相应的 Product Id 向 App Store 请求产品信息,并发起购买 payment.(使用StoreKit)
- App Store处理该 payment,并返回完成的 transaction
- 客户端从 transaction 中获取 receipt 凭证数据,并将其发送给服务器,等待返回.
- 服务器验证 receipt 凭证数据是否使用过,保存然后发给App Store验证是否合法
- 服务器得到 App Store 验证结果,返回给客户端相应购买成功或失败信息
- 客户端提示用户购买结果以及处理相应UI.
另一个流程
注意事项
- 需要提前在 iTunes Connect 中创建项目(entry)
- 只能为虚拟物品提供内购服务
- 测试 IAP 需要创建“沙盒用户”(Sandbox User)
购买项目种类
- Consumable 消费品,可重复购买
- Non-Consumable 购买一次,永久有效
- Non-Renewing Subscription 有有效期的订阅
- Auto-Renewing Subscription 可重复的订阅
物品属性
- Reference Name 在 iTunes Connect 中显示的物品昵称,该昵称不会出现在 app 中。
- Product ID 一个唯一的字符串,用来区别 IAP 的物品。通常是由 Bundle ID + name 来定义。
- Cleared for Sale 开启/关闭 该物品的购买服务
- Price Tier 定价
- Display Name 展示名称
- Description 物品描述
创建沙盒用户
添加方式
iTunes Connect -> Users and Roles -> Sandbox Testers -> “+”
注意事项
- 所创建的邮箱,不能与 Apple ID 相关联
- 如果要测试 Non-Consumable 类型的购买,每次都需要创建一个新的沙盒用户,否则下次购买时,会被判定为恢复购买(restoring)
- 测试 Consumable 时,需要重新安装应用
- The first time you submit your app for review, you also need to submit in-app products to be reviewed at the same time. After the first submission, you can submit updates to your app and products for review independently of each other.
Tips
- 避免重复注册邮箱:如果有gmail,可以使用“别名”(alias)来注册。比如,原有地址 abc@gmail.com,可以写成 abc+iap1@gmail.com。
配置Xcode
- 确认 Team 及 Bundle ID 和线上配置一样
- 在 Capabilities 中,打开 In-App Purchase
Show me the code
列出商品列表
注意:你无法从苹果服务器获得商品列表,必须自己维护商品标识列表(product identifiers)
通过商品的标识(product identifier)来获取商品信息(描述、标题、价格等)
|
|
查找已购买的商品
iOS 7.0+可以使用 SKReceiptRefreshRequest
|
|
购买商品
创建一个购买请求
|
|
等待苹果返回支付结果
|
|
持久化
客户端需考虑将 receipt
凭证数据本地持久化,并加入请求失败重发机制
通过沙盒用户购买商品
使用沙盒用户购买商品时,需要退出当前登录的 iTunes & App Store 账号
服务器端验证 receipt
- 接收ios端发过来的购买凭证。
- 判断凭证是否已经存在或验证过,然后存储该凭证。
- 将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
- 如果需要,修改用户相应的会员权限。
如何验证
将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。
验证地址
Always verify your receipt first with the production URL; proceed to verify with the sandbox URL if you receive a 21007 status code. Following this approach ensures that you do not have to switch between URLs while your application is being tested or reviewed in the sandbox or is live in the App Store.
虽然在审核时,我们会将地址切换到生产环境。但在验证支付收据环节上,苹果的审核人员使用的是 sandbox
环境。所以,在进行验证时,都需要遵循以下步骤:
- 通过生产环境URL验证
- 判断返回的状态码,若为 21007 ,则通过测试环境进行验证
check receipt but recommend to use in server side instead of using this function
在一段源码中,我看到了这样的提示。建议将验证收据的过程放到服务器端进行。我觉得很有道理,因为我们无法保证用户的网络环境。