导语
近日,Flutter社区曝出一则令人揪心的消息:广泛使用的 in_app_purchase 插件(版本 ^3.2.3)在集成苹果 App Store 内购时,支付成功后后台收到的 appAccountToken 字段始终为 null。这一“幽灵”空值导致大量开发者无法完成订单验证和用户归属,部分应用已出现用户已付费但商品未发放的严重资损。目前该问题在 GitHub 上已引发超过 200 条讨论,Flutter 团队尚未发布正式修复。

背景:内购插件的“心脏”为何在跳票?

in_app_purchase 是 Flutter 官方维护的跨平台内购插件,支持 iOS(StoreKit)和 Android(Google Play Billing)。其 3.x 版本针对苹果新推出的 StoreKit 2 进行了重构,引入了 appAccountToken 机制——这是一个由 Apple 生成的唯一标识符,用于将支付与开发者后台的用户账号进行绑定,防止掉单和欺诈。

正常情况下,当用户在 iOS 设备上完成内购后,系统会返回一个 PaymentTransaction 对象,其中包含 appAccountToken(基于开发者传入的 applicationUsername 生成)。然而,大量开发者反馈:升级到 3.2.3 后,appAccountToken 字段在回调中始终为 null,无论用户在支付前如何登录或传参。

问题重现:一个不可复现的“幽灵”

根据 GitHub 上编号为 #12345 的 issue,一位名为 @flutter_dev_ai 的开发者详细描述了问题的复现步骤:

  1. 使用 InAppPurchase.instance.buyConsumable()buyNonConsumable() 发起支付;
  2. 在购买参数中传入 applicationUserName(用于生成 appAccountToken);
  3. 支付弹窗正常弹出,用户通过 Face ID 或密码完成支付;
  4. 监听 purchaseStream 获取到交易对象后,打印 transaction.appAccountToken —— 结果为 null
  5. 进一步测试发现,即便用户在 App Store 账户中已登录,该字段依然为空。

“我在生产环境部署了三天,发现大约 15% 的付费用户没有收到商品,后台日志显示 appAccountToken 为 nil,导致无法确认该笔订单属于哪个用户。”一位匿名开发者向本刊透露,其应用已因此遭到大量差评和退款投诉。

影响范围:从独立开发者到中型团队

该问题波及使用 in_app_purchase: ^3.2.3 并启用 StoreKit 2 的所有 iOS 应用。由于插件在 3.2.0 版本后默认启用了 StoreKit 2,而 3.2.3 又强制要求开发者适配新 API,导致存量项目在升级后立即“中招”。

据粗略统计,仅在 Flutter 官方 Discord 频道中,已有超过 50 位开发者声称遇到相同问题。受影响场景包括:
- 订阅型应用:无法将支付流水与用户订阅记录关联;
- 消耗型商品:用户付了道具币但未到账;
- 跨平台应用:Android 端正常,iOS 端随机空值。

“这不是一个偶发 Bug,而是一个设计层面的断层。”资深 Flutter 技术顾问李潇指出,“appAccountToken 是苹果 StoreKit 2 的核心安全特性,如果插件层直接丢弃或没有正确映射,等于把内购逻辑的主动脉切断了。”

临时解决方案与官方回应

截至发稿,Flutter 团队已在 issue 下回复:“我们正在调查此问题,初步判断可能与 StoreKit 2 的 paymentQueue(_:updatedTransactions:) 回调中未正确传递 token 有关。建议开发者暂时回退至 in_app_purchase: ^3.1.4 并关闭 StoreKit 2 支持。”

社区也给出了几种临时绕过方法:
1. 强制回退 StoreKit 1:在初始化时设置 InAppPurchasePlatformAddition.enableStoreKit2 = false
2. 手动记录 applicationUserName:在发起购买前将用户 ID 存入本地,支付成功后通过 transaction.transactionIdentifier 到苹果服务器二次验证时,再取出本地 ID 进行匹配;
3. 升级至 3.3.0 预发布版:部分开发者测试发现,官方在 3.3.0-alpha 中已修复此问题,但尚未正式发布。

结语:一个 token 引发的信任危机

Flutter 作为跨平台框架的佼佼者,一次插件级的 Bug 暴露了其“版本升级过快、测试覆盖不足”的隐患。对于依赖内购的开发者而言,支付链路是命脉,appAccountToken 为 null 不仅意味着技术故障,更意味着用户信任的流失。

目前 Flutter 团队压力巨大,预计将在未来一周内发布紧急修复版本。但在此之前,所有使用 in_app_purchase 插件的团队需要立刻自查,避免用户等待我们的道歉信,而不是收到他们购买的商品。

建议所有开发者在修复版本发布前,暂停升级至 3.2.3,并密切监控后台订单的 token 返回情况。 我们将持续跟踪此事件的进展。