You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin InAppBillingPlugin v4 AcknowledgePurchaseAsync调用时机咨询

InAppBillingPlugin 4 版本购买确认逻辑说明

首先对齐基础信息:AcknowledgePurchaseAsync是v4版本针对Android端Google Play结算规则新增的方法,旧版本的FinalizePurchaseAsync是它的曾用名,v4版本做了命名统一。你看到的不同示例写法差异,本质是严谨度区别,不是逻辑冲突。

各平台调用规则

  • 非Android平台不需要主动调用该方法。该方法的底层实现仅对接了Google Play的购买确认接口,iOS、UWP等平台调用时会直接走空实现,不会抛出异常,但不会产生任何实际业务效果。
  • James Montemagno博客示例中增加Android平台判断是更严谨的写法,减少无意义的跨平台方法调度;TurnipTracker示例不加判断是兼容写法,不会引发线上错误,两种写法都可正常运行。

调用时机要求

  • 必须在购买对象的State属性为PurchaseState.Purchased时才能调用,其余状态下调用会被Google Play接口直接拒绝,返回业务错误。
  • 针对免费试用场景的特殊说明:
    • 不需要等免费试用期结束再确认。Google Play的72小时确认窗口是从用户完成订阅授权、购买正式生效的时间点开始计算,不是从试用期结束转付费的节点计算。
    • FreeTrial是订阅的权益标记,不是独立的购买状态:用户开通带免费试用的订阅时,完成授权的瞬间State就会标记为Purchased,你可以通过IsFreeTrial属性判断当前订阅是否处于试用期,不需要等待状态变更。
    • 如果无法保证用户在购买完成后72小时内打开App,必须通过服务端对接实现确认逻辑:服务端可通过Google Play实时开发者通知接收购买完成事件,直接调用服务端接口完成确认,完全不依赖客户端启动,这也是官方推荐的生产环境方案,能彻底避免客户端漏确认导致的订单自动退款问题。

博客示例核心参考逻辑:

var purchase = await CrossInAppBilling.Current.PurchaseAsync(productIdSub, ItemType.Subscription);

if (purchase == null)
{
    return;
}

if (purchase.State == PurchaseState.Purchased)
{
    // 仅Android端需要执行确认
    if (DeviceInfo.Platform == DevicePlatform.Android)
    {
        await CrossInAppBilling.Current.AcknowledgePurchaseAsync(purchase.PurchaseToken);
    }
}

内容的提问来源于stack exchange,提问作者Brian Rak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:42:06