HarmonyOS鸿蒙Next中flutter的in_app_purchase的订阅返回的purchaseDetails.verificationData.serverVerificationData为空

HarmonyOS鸿蒙Next中flutter的in_app_purchase的订阅返回的purchaseDetails.verificationData.serverVerificationData为空 【问题描述】:接入 in_app_purchase_ohos 进行订阅支付时,支付流程本身可以成功拉起并完成,但支付完成后,从 purchaseStream 回调拿到的 PurchaseDetails 中,verificationData.serverVerificationData 为空字符串。

【问题现象】:调用 in_app_purchase_ohos 查询订阅商品

发起订阅购买

用户完成支付

监听 InAppPurchase.instance.purchaseStream

在 PurchaseDetails.verificationData.serverVerificationData 中读取验证数据

发现该字段为空字符串

【版本信息】:Flutter SDK:3.22.1-ohos-1.0.7 in_app_purchase_ohos 版本:1.0.0

【复现代码】:无

【尝试解决方案】:无


更多关于HarmonyOS鸿蒙Next中flutter的in_app_purchase的订阅返回的purchaseDetails.verificationData.serverVerificationData为空的实战教程也可以访问 https://www.itying.com/category-92-b0.html

5 回复

尊敬的开发者,您好,尝试使用flutter_packages,按照修改看下in_app_purchase的订阅返回的purchaseDetails.verificationData.serverVerificationData值,是否可以拿到正常的数据。如无法获取,请及时反馈最新信息。感谢支持。

更多关于HarmonyOS鸿蒙Next中flutter的in_app_purchase的订阅返回的purchaseDetails.verificationData.serverVerificationData为空的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


结论:这更像是 in_app_purchase_ohos 1.0.0 的实现缺口,不是你接入流程的问题。

我继续把源码链路核对完了,当前现象基本能解释通:

根因判断

in_app_purchase_ohos 里,PurchaseDetails.verificationData.serverVerificationData 本来是想塞 receipt 的。

相关链路是:

  • app_gallery_purchase_details.dart
    • serverVerificationData 用的是 base64EncodedReceipt
  • in_app_purchase_ohos_platform.dart
    • base64EncodedReceipt 又来自 IKReceiptManager.retrieveReceiptData()
  • ik_receipt_manager.dart
    • retrieveReceiptData() 通过平台通道调用 iap#retrieveReceiptData
  • 但在 OHOS 原生实现 MethodCallHandlerImpl.ets
    • case MethodNames.RETRIEVE_RECEIPT_DATA: 直接是 result.success(null)

也就是说:

Dart 想拿 receipt -> 平台侧实际返回 null -> 最终 serverVerificationData 变成空字符串

所以你现在拿到 purchaseDetails.verificationData.serverVerificationData == '',从插件源码看是能复现、能解释的。

为什么订阅更明显

我还看了订阅购买回调这段:

  • MethodCallHandlerImpl.ets 在订阅分支里其实能解析到 purchaseToken
  • PurchaseOrderPayload.ets / PurchaseSubGroupStatusPayload 里也确实有 purchaseToken
  • 但是插件发给 Dart 的 updatedTransactions 事件里,只传了:
    • payment
    • transactionIdentifier
    • transactionState

没有把下面这些真正对验单有用的数据传出去:

  • purchaseToken
  • jwsSubscriptionStatus
  • receipt

所以当前版本里:

  • serverVerificationData 拿不到
  • purchaseToken 也没暴露给 Dart
  • refreshPurchaseVerificationData() 这类补救思路也基本不可用,因为 iap#refreshReceipt 在当前 OHOS 适配里也没真正接上

结论一句话

你这个问题本质上不是“订阅支付失败”,而是:

in_app_purchase_ohos 1.0.0 在 OHOS 订阅场景下,没有把可用于服务端校验的数据正确暴露到 Dart 层。

建议怎么处理

方案 1:不要再依赖当前版本的 serverVerificationData

如果你现在是想做服务端验单,当前版本下不要把 verificationData.serverVerificationData 当成有效字段。

方案 2:改插件,暴露 purchaseToken

这是最实用的方案。

建议在你们自己的 fork 里改 MethodCallHandlerImpl.ets

  • 订阅成功分支里,把 purchaseToken 一起塞到回调 map
  • 最好把原始 createPurchaseResult.purchaseDatajwsSubscriptionStatus 也一起回传
  • Dart 侧扩展 transaction wrapper
  • 最终把 purchaseToken 映射到 verificationData.serverVerificationData

这样你的业务层就还能继续沿用 PurchaseDetails.verificationData.serverVerificationData 这一套取值方式。

方案 3:等官方修复/升级版本

如果后续有高于 1.0.0in_app_purchase_ohos 修复了这段映射,可以直接升级验证。 但就你现在这个版本,源码层面确实有缺口。

你现在可以怎么定性这个问题

可以直接定性为:

  • 不是商品配置问题
  • 不是支付拉起问题
  • 不是 purchaseStream 监听方式问题
  • in_app_purchase_ohos 1.0.0 的 OHOS 平台实现没有正确返回 receipt / verification data

我建议的最终做法

如果你们要尽快上线订阅:

  • 短期:fork in_app_purchase_ohos
  • 直接把 purchaseToken 暴露到 Dart
  • 服务端改用 purchaseToken 做校验
  • 不再依赖当前插件的 receipt 字段

如果你愿意,我下一条可以直接给你一版可落地的补丁思路,包含:

  • MethodCallHandlerImpl.ets 怎么改
  • Dart wrapper 怎么加字段
  • 怎么把 purchaseToken 映射到 serverVerificationData

这样你可以直接在项目里改。

学习一下

在HarmonyOS Next上,Flutter的in_app_purchase插件对订阅类型的serverVerificationData字段支持不完整,该字段当前返回空值。这是鸿蒙支付服务与插件实现间的适配差异所致。

鸿蒙 Next 上 in_app_purchase_ohos 插件(1.0.0 版本)的订阅支付回调中 serverVerificationData 为空,是因为该版本尚未实现对 HarmonyOS IAP Kit 订阅验证数据的映射。HarmonyOS 的订阅购买记录不以 serverVerificationData 形式返回本地可用的验证签名字符串,而需通过 orderIdpurchaseToken 等字段自行调用服务端验证接口。

可直接使用 PurchaseDetails 中已有的 orderIDpurchaseToken(位于 verificationData.localVerificationData 内的 JSON 字段),通过您的服务端调用华为 IAP 的订单验证接口完成校验。无需依赖 serverVerificationData。如需本地直接获取签名数据,当前插件版本暂不支持,可等待升级或提交 issue 跟踪。

回到顶部