Apple App Store

配置 Apple Provider Adapter,连接 App Store Server API 与 StoreKit 2 交易验证。

概述

SubHub Phase 1 支持 Apple App Store。Provider Adapter 负责验证 StoreKit 2 signed transaction 并将结果归一化为通用 Purchase + Entitlement。

Apple 特定字段(如 originalTransactionId)仅存在于 Adapter 层,不会出现在核心 API 响应中。

前置条件

  • App Store Connect 账号
  • App Store Connect API 密钥(.p8 文件)
  • App 内购买项目已在 App Store Connect 配置
  • StoreKit 2 支持(iOS 15+)

控制台配置

在应用详情 → Apple 配置中填写:

字段说明
Issuer IDApp Store Connect → 用户与访问 → 密钥 → Issuer ID
Key IDAPI 密钥的 Key ID
Team IDApple Developer Team ID
Shared Secret(可选)旧版 receipt 验证用

StoreKit 2 集成

SubHub SDK 自动处理
// SDK 内部流程:
// 1. Product.products(for: [sku]) 获取商品
// 2. product.purchase() 发起交易
// 3. 提取 Transaction.signedPayload
// 4. POST /v1/purchases/verify 提交至 SubHub
// 5. 返回 Entitlement 结果

// 开发者只需调用:
let result = try await SubHub.purchase(
    productId: "com.neo.focustimer.promo"
)

App Store Server Notifications V2

SubHub 可接收 Apple Server Notifications 以处理续订、退款与订阅状态变更。

每个应用有独立的通知接收地址:`https://hooks.subhub.dev/v1/providers/apple/apps/{app_id}`。在 App Store Connect → App → App 信息 → App Store Server Notifications 中填入该 URL(将 `{app_id}` 替换为 SubHub 应用 ID,如 app_01KFOCUSIOS)。

同一工作区下有多个 iOS 应用时,每个应用需分别配置各自的地址 — 平台通过 app_id 路由到对应应用,不会混淆。

你无需直接处理 Apple 原始通知 — Provider Adapter 归一化后写入 Purchase 并触发 Webhook。

Sandbox 测试

  • 使用 Sandbox Apple ID 在 TestFlight 或 Xcode 调试
  • 控制台中区分 live / test 环境密钥
  • Sandbox 交易会写入 test 环境数据