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

MAUI应用Android端Plugin.InAppBilling订阅确认失败求助

MAUI中Plugin.InAppBilling Android订阅订单确认解决方案

核心误区先明确

订阅类商品绝对不能调用ConsumePurchaseAsync,这个方法是给消耗型商品(比如一次性道具)设计的,强制调用必然触发异常。订阅的正确操作是订单确认(Acknowledgment)。

方案1:使用Plugin.InAppBilling内置订阅确认API

确保你使用的是v6.x及以上版本的Plugin.InAppBilling,新版本已内置订阅确认方法,无需自定义实现:

  1. 购买成功后获取有效Purchase对象
  2. 调用AcknowledgePurchaseAsync完成确认:
var billing = CrossInAppBilling.Current;
if (billing != null && purchase != null)
{
    try
    {
        bool isAcknowledged = await billing.AcknowledgePurchaseAsync(purchase.PurchaseToken, "your_dev_payload");
        if (isAcknowledged)
        {
            // 确认成功,更新本地用户订阅状态
        }
    }
    catch (InAppBillingPurchaseException ex)
    {
        // 根据错误码针对性处理
        switch (ex.PurchaseError)
        {
            case PurchaseError.UserCanceled:
                // 用户取消操作
                break;
            case PurchaseError.ServiceUnavailable:
                // 网络或服务不可用
                break;
            // 其他错误码按需处理
        }
    }
}

方案2:直接调用Google Play Billing Library接口(内置API失效时)

如果内置方法仍有问题,可跳过插件封装,直接在Android平台层实现确认逻辑:

  1. 在Android项目中创建工具类:
using Android.Gms.Billing;
using Android.Gms.Billing.Api;

public static class AndroidSubscriptionHelper
{
    public static async Task<bool> AcknowledgeSubscription(string purchaseToken)
    {
        var billingClient = BillingClient.NewBuilder(Android.App.Application.Context)
            .EnablePendingPurchases()
            .Build();

        // 建立连接
        var connectTask = new TaskCompletionSource<bool>();
        billingClient.StartConnection(new BillingStateListener(
            () => connectTask.SetResult(true),
            _ => connectTask.SetResult(false)
        ));

        if (!await connectTask.Task)
        {
            return false;
        }

        // 构建确认参数并执行
        var ackParams = AcknowledgePurchaseParams.NewBuilder()
            .SetPurchaseToken(purchaseToken)
            .Build();

        var ackResultTask = new TaskCompletionSource<bool>();
        billingClient.AcknowledgePurchase(ackParams, new AcknowledgePurchaseResponseListener(
            result =>
            {
                ackResultTask.SetResult(result.ResponseCode == BillingResponseCode.Ok);
                billingClient.EndConnection();
            }
        ));

        return await ackResultTask.Task;
    }
}
  1. 在MAUI共享代码中判断平台后调用:
#if ANDROID
bool confirmSuccess = await AndroidSubscriptionHelper.AcknowledgeSubscription(purchase.PurchaseToken);
if (confirmSuccess)
{
    // 执行订阅生效逻辑
}
#endif

常见排查点

  • 确认Google Play Console中订阅商品已发布(至少处于测试状态),测试账号已加入许可测试列表
  • 检查Purchase对象的PurchaseToken是否为空或无效
  • 确保设备上的Google Play服务为最新版本
  • Android端无需额外配置权限,Plugin.InAppBilling已默认处理必要权限

内容的提问来源于stack exchange,提问作者Matthew Pans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:33:13