flutter中如何使用in_app_purchase解决掉单和恢复购买逻辑

在Flutter中使用in_app_purchase插件时,如何正确处理掉单和恢复购买逻辑?

我在实现应用内购买功能时遇到以下问题:

  1. 用户支付成功后偶尔会出现掉单情况,如何确保交易完成后正确验证并交付商品?
  2. 用户更换设备或重装应用后,如何恢复已购买的非消耗型商品?
  3. 是否有必要在服务端验证收据?最佳实践是什么?
  4. 在iOS和Android平台上,恢复购买的实现方式是否有差异?

希望能分享具体的代码示例和错误处理方案,谢谢!

2 回复

在Flutter中使用in_app_purchase处理掉单和恢复购买:

  1. 初始化:配置InAppPurchase.instance并监听购买流
  2. 恢复购买:调用InAppPurchase.instance.restorePurchases()获取历史订单
  3. 验证凭证:服务器端验证购买凭证,确保交易完成
  4. 处理掉单:检查未完成的交易,调用completePurchase()确认完成
  5. 状态管理:使用PurchaseStatus跟踪购买状态,及时更新用户权益

建议结合后端验证确保交易安全可靠。

更多关于flutter中如何使用in_app_purchase解决掉单和恢复购买逻辑的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中使用 in_app_purchase 处理掉单和恢复购买逻辑,主要涉及以下步骤:

1. 初始化与监听购买流

  • 初始化插件并监听购买流,确保及时处理购买状态。
final InAppPurchase _inAppPurchase = InAppPurchase.instance;
late StreamSubscription<List<PurchaseDetails>> _subscription;

void init() {
  _subscription = _inAppPurchase.purchaseStream.listen(
    _handlePurchaseUpdate,
    onDone: () => _subscription.cancel(),
    onError: (error) => // 处理错误,
  );
}

2. 处理购买更新

_handlePurchaseUpdate 中验证购买并处理状态(如 pendingpurchasederror):

void _handlePurchaseUpdate(List<PurchaseDetails> purchases) {
  for (var purchase in purchases) {
    if (purchase.status == PurchaseStatus.purchased) {
      _verifyPurchase(purchase); // 验证购买
    } else if (purchase.status == PurchaseStatus.error) {
      _handleError(purchase.error!); // 处理错误
    }
    if (purchase.pendingCompletePurchase) {
      await _inAppPurchase.completePurchase(purchase); // 完成购买
    }
  }
}

3. 验证购买凭证

通过服务器验证购买真实性(推荐使用后端验证):

void _verifyPurchase(PurchaseDetails purchase) async {
  bool isValid = await Server.verifyPurchase(purchase); // 自定义服务器验证
  if (isValid) {
    _deliverProduct(purchase.productID); // 交付商品
  } else {
    _handleInvalidPurchase(purchase); // 处理无效购买
  }
}

4. 恢复购买逻辑

调用 queryPastPurchases 获取历史购买记录,重新交付商品:

void restorePurchases() async {
  try {
    final QueryPurchaseDetailsResponse response = 
        await _inAppPurchase.queryPastPurchases();
    for (var purchase in response.pastPurchases) {
      if (purchase.status == PurchaseStatus.purchased) {
        _verifyPurchase(purchase); // 重新验证并恢复
      }
    }
  } catch (e) {
    // 处理恢复失败
  }
}

5. 处理掉单问题

  • 监听中断:确保应用重启或网络异常时重新监听购买流。
  • 持久化状态:本地存储购买状态,启动时检查未完成的购买。
  • 错误重试:对失败购买实现重试机制。

注意事项:

  • 服务器验证:避免本地验证,防止篡改。
  • 完成购买:务必调用 completePurchase,否则购买流程会阻塞。
  • 平台差异:iOS 和 Android 的恢复逻辑略有不同,需测试兼容性。

通过以上步骤,可有效管理购买状态,减少掉单风险,并支持用户恢复购买。

回到顶部