Crear compras in app purchase usando Flutter para Android / iOS

Tiempo de lectura: 2 minutos

Perfecto, vamos a hacer un tutorial paso a paso para implementar in_app_purchase en Flutter y crear un widget de compras. Te lo voy a estructurar de manera clara para que puedas integrarlo directamente.

Otoño - pexels

Añadir dependencia

En tu pubspec.yaml agrega:

dependencies:
  flutter:
    sdk: flutter
  in_app_purchase: ^5.0.0   # verifica la última versión en pub.dev

Luego corre:

flutter pub get

Importar el paquete

En tu archivo Dart donde harás la compra:

import 'package:flutter/material.dart';
import 'package:in_app_purchase/in_app_purchase.dart';

Inicializar InAppPurchase

Antes de usar las compras, inicializa la instancia:

final InAppPurchase _iap = InAppPurchase.instance;

Crear un Widget de Compras

Vamos a crear un PurchaseWidget que liste productos y permita comprarlos.

class PurchaseWidget extends StatefulWidget {
  @override
  _PurchaseWidgetState createState() => _PurchaseWidgetState();
}

class _PurchaseWidgetState extends State<PurchaseWidget> {
  final InAppPurchase _iap = InAppPurchase.instance;
  bool _available = false;
  List<ProductDetails> _products = [];
  List<PurchaseDetails> _purchases = [];

  @override
  void initState() {
    super.initState();
    _initialize();
  }

  Future<void> _initialize() async {
    _available = await _iap.isAvailable();
    if (_available) {
      // Define tus IDs de productos
      const Set<String> _kIds = {'product1', 'product2'};
      final ProductDetailsResponse response = await _iap.queryProductDetails(_kIds);
      if (response.error == null) {
        setState(() {
          _products = response.productDetails;
        });
      }

      // Escuchar compras
      _iap.purchaseStream.listen((purchases) {
        for (var purchase in purchases) {
          _handlePurchase(purchase);
        }
      });
    }
  }

  void _handlePurchase(PurchaseDetails purchase) {
    if (purchase.status == PurchaseStatus.purchased) {
      // Aquí puedes desbloquear contenido
      print("Compra completada: ${purchase.productID}");
    } else if (purchase.status == PurchaseStatus.error) {
      print("Error en compra: ${purchase.error}");
    }
  }

  void _buyProduct(ProductDetails productDetails) {
    final PurchaseParam purchaseParam = PurchaseParam(productDetails: productDetails);
    _iap.buyConsumable(purchaseParam: purchaseParam);
  }

  @override
  Widget build(BuildContext context) {
    if (!_available) {
      return Center(child: Text("Compras no disponibles"));
    }

    return ListView.builder(
      itemCount: _products.length,
      itemBuilder: (context, index) {
        final product = _products[index];
        return Card(
          child: ListTile(
            title: Text(product.title),
            subtitle: Text(product.description),
            trailing: TextButton(
              child: Text(product.price),
              onPressed: () => _buyProduct(product),
            ),
          ),
        );
      },
    );
  }
}

Notas importantes

  1. IDs de producto:
    • En Android: definidos en Google Play Console.
    • En iOS: definidos en App Store Connect.
  2. Tipos de compra:
    • buyConsumable: consumibles (ej: monedas, pistas).
    • buyNonConsumable: no consumibles (ej: desbloqueo de features).
  3. Escucha de compras:
    • _iap.purchaseStream escucha actualizaciones de compra, imprescindible para desbloquear contenido.
  4. Testing:
    • Android: usa cuentas de prueba en Play Store.
    • iOS: usa Sandbox testers.

Deja un comentario