MAUI应用Android端Plugin.InAppBilling订阅确认失败求助
MAUI中Plugin.InAppBilling Android订阅订单确认解决方案
核心误区先明确
订阅类商品绝对不能调用ConsumePurchaseAsync,这个方法是给消耗型商品(比如一次性道具)设计的,强制调用必然触发异常。订阅的正确操作是订单确认(Acknowledgment)。
方案1:使用Plugin.InAppBilling内置订阅确认API
确保你使用的是v6.x及以上版本的Plugin.InAppBilling,新版本已内置订阅确认方法,无需自定义实现:
- 购买成功后获取有效
Purchase对象 - 调用
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平台层实现确认逻辑:
- 在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; } }
- 在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
相关产品推荐
相关产品推荐

