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
尊敬的开发者,您好,尝试使用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.dartserverVerificationData用的是base64EncodedReceipt
in_app_purchase_ohos_platform.dartbase64EncodedReceipt又来自IKReceiptManager.retrieveReceiptData()
ik_receipt_manager.dartretrieveReceiptData()通过平台通道调用iap#retrieveReceiptData
- 但在 OHOS 原生实现
MethodCallHandlerImpl.etscase MethodNames.RETRIEVE_RECEIPT_DATA:直接是result.success(null)
也就是说:
Dart 想拿 receipt -> 平台侧实际返回 null -> 最终 serverVerificationData 变成空字符串
所以你现在拿到 purchaseDetails.verificationData.serverVerificationData == '',从插件源码看是能复现、能解释的。
为什么订阅更明显
我还看了订阅购买回调这段:
MethodCallHandlerImpl.ets在订阅分支里其实能解析到purchaseTokenPurchaseOrderPayload.ets/PurchaseSubGroupStatusPayload里也确实有purchaseToken- 但是插件发给 Dart 的
updatedTransactions事件里,只传了:paymenttransactionIdentifiertransactionState
没有把下面这些真正对验单有用的数据传出去:
purchaseTokenjwsSubscriptionStatus- receipt
所以当前版本里:
serverVerificationData拿不到purchaseToken也没暴露给 DartrefreshPurchaseVerificationData()这类补救思路也基本不可用,因为iap#refreshReceipt在当前 OHOS 适配里也没真正接上
结论一句话
你这个问题本质上不是“订阅支付失败”,而是:
in_app_purchase_ohos 1.0.0 在 OHOS 订阅场景下,没有把可用于服务端校验的数据正确暴露到 Dart 层。
建议怎么处理
方案 1:不要再依赖当前版本的 serverVerificationData
如果你现在是想做服务端验单,当前版本下不要把 verificationData.serverVerificationData 当成有效字段。
方案 2:改插件,暴露 purchaseToken
这是最实用的方案。
建议在你们自己的 fork 里改 MethodCallHandlerImpl.ets:
- 订阅成功分支里,把
purchaseToken一起塞到回调 map - 最好把原始
createPurchaseResult.purchaseData或jwsSubscriptionStatus也一起回传 - Dart 侧扩展 transaction wrapper
- 最终把
purchaseToken映射到verificationData.serverVerificationData
这样你的业务层就还能继续沿用 PurchaseDetails.verificationData.serverVerificationData 这一套取值方式。
方案 3:等官方修复/升级版本
如果后续有高于 1.0.0 的 in_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 形式返回本地可用的验证签名字符串,而需通过 orderId、purchaseToken 等字段自行调用服务端验证接口。
可直接使用 PurchaseDetails 中已有的 orderID 与 purchaseToken(位于 verificationData.localVerificationData 内的 JSON 字段),通过您的服务端调用华为 IAP 的订单验证接口完成校验。无需依赖 serverVerificationData。如需本地直接获取签名数据,当前插件版本暂不支持,可等待升级或提交 issue 跟踪。

