Comercio Electrónico con Pagos Blockchain

Comercio Electrónico con Pagos Blockchain

DESTACADO
📅

Visión general

He desarrollado esta plataforma de comercio electrónico con pagos blockchain, que he llamado EasyCryptoBuy, como uno más de mis proyectos de mi Máster en Desarrollo Full Stack y Blockchain, donde he aplicado los conocimientos adquiridos en ambas disciplinas para crear una solución funcional, segura y escalable.

El objetivo principal ha sido demostrar cómo la tecnología blockchain puede integrarse de manera eficiente en un entorno de comercio electrónico tradicional, ofreciendo ventajas clave como:

  • Transparencia en las transacciones (registros inmutables en la blockchain)
  • Reducción de intermediarios (pagos directos entre comprador y vendedor)
  • Seguridad mejorada (autenticación mediante firma criptográfica)
  • Flexibilidad en métodos de pago (soporte para ETH, USDT, USDC y otros tokens ERC-20)

Tecnologías Principales

  • Frontend: React, TypeScript, Chakra UI, Wagmi, Viem
  • Backend: Django REST Framework, PostgreSQL, Web3.py
  • Blockchain: Smart Contracts en Solidity (Ethereum), listeners de eventos
  • Seguridad: JWT, firma criptográfica, rate limiting

Arquitectura Técnica

Configuración Clave del Backend

El backend utiliza Django REST Framework con una configuración optimizada para seguridad y rendimiento:

  • CORS restringido solo a dominios autorizados
  • Autenticación JWT con tokens de corta y larga duración
  • Rate limiting para protección contra ataques

Ejemplo de configuración:

# Configuración de seguridad y conexiones
CORS_ALLOWED_ORIGINS = [
    # Url's permitidas
    "http://localhost:5173", # localhost para las pruebas en local
    "http://127.0.0.1:5173", # localhost para las pruebas en local
    "https://sepolia.drpc.org"
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=15),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=7),
}

Integración Blockchain

En el frontend, la configuración de Wagmi permite operar tanto en red principal como en testnet (Sepolia), e integrarse con diversas wallets como MetaMask.

export const config = createConfig({
  chains: [mainnet, sepolia],
  connectors: [metaMask()], // Se puede integrar con múltiples wallets
  transports: {
    [mainnet.id]: http(),
    [sepolia.id]: http('https://ethereum-sepolia-rpc.publicnode.com')
  }
});

Ventajas:

  • Soporte simultáneo para mainnet y testnet (Sepolia).
  • Conexión flexible a diferentes proveedores RPC
  • Soporte para múltiples wallets.

Parte Cliente: Experiencia de Usuario

EasyCryptoBuy ofrece una interfaz moderna e intuitiva que permite a los usuarios explorar productos, gestionar su carrito y realizar pagos seguros en blockchain.

Dashboard del Cliente

El dashboard ofrece una visión completa del estado de la cuenta:

Características clave:

  • Estado de conexión de la wallet en tiempo real
  • Acceso rápido a las principales funcionalidades
  • Visualización de transacciones recientes
  • Gestión de perfil y datos personales
<DashboardLayout>
  <WalletStatusCard 
    address={walletAddress}
    isConnected={isConnected}
    isRegistered={isRegistered}
  />
  <ProductCatalogPreview 
    onNavigate={() => navigate('/products')}
  />
  <PaymentQuickAccess 
    onNavigate={() => navigate('/payment')}
  />
  <RecentTransactions 
    transactions={recentTransactions}
    onViewDetail={(tx) => navigate(`/transactions/${tx.id}`)}
  />
  <UserProfileSection 
    profile={userProfile}
    onEdit={() => navigate('/profile')}
  />
</DashboardLayout>

📸 Captura del Dashboard del cliente


Catálogo de Productos

Interfaz intuitiva para explorar y seleccionar productos:

  • Exploración de productos con imágenes y descripciones.
  • Añadir productos al carrito con control de stock en tiempo real.
  • Filtrado y búsqueda de productos (integración pendiente)
<ProductGrid>
  {products.map(product => (
    <ProductCard
      key={product.id}
      product={product}
      onAddToCart={() => addToCart(product)}
      stock={product.stock}
    />
  ))}
</ProductGrid>

📸 Captura del catálogo de productos (las imágenes del catálogo son aleatorias)


Carrito de Compras

Sistema completo de gestión del carrito:

  • Persistencia entre sesiones
  • Cálculo automático de totales
  • Posibilidad de vaciar el carrito o eliminar productos
@api_view(["POST"])
@permission_classes([AllowAny])
def save_cart(request):
    wallet = request.data.get("wallet")
    if not wallet:
        return Response({"error": "Wallet address is required"}, status=400)

    try:
        profile = UserProfile.objects.get(wallet_address=wallet)
        cart, _ = Cart.objects.get_or_create(user=profile, is_active=True)
        serializer = CartSerializer(cart, data=request.data, partial=False)
        if serializer.is_valid():
            serializer.save(user=profile)
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
    except UserProfile.DoesNotExist:
        return Response({"error": "User not found"}, status=404)

📸 Captura del carrito


Proceso de Pago

Flujo seguro para completar transacciones:

  1. Selección del token de pago (ETH, USDT, USDC, LINK).
  2. Firma criptográfica de la transacción desde la wallet.
  3. Confirmación on-chain y actualización inmediata en el sistema.

Smart contract de ejemplo:

// Smart Contract para pagos
contract PaymentProcessor {
    mapping(uint256 => bool) public usedNonces;
    
    event PaymentReceived(
        address indexed buyer,
        uint256 amount,
        uint256 transactionId
    );

    function processPayment(
        uint256 transactionId,
        uint256 nonce
    ) external payable {
        require(!usedNonces[nonce], "Nonce already used");
        usedNonces[nonce] = true;
        
        emit PaymentReceived(msg.sender, msg.value, transactionId);
    }
}

📸 Captura del formulario de pago
📸 Captura del proceso de pago


Parte Administrativa: Gestión Empresarial

Herramientas completas para gestión de productos, ventas y clientes.

Dashboard Analítico

Panel para monitorizar el rendimiento del negocio en tiempo real:

  • Ingresos totales
  • Usuarios activos
  • Valor de inventario
  • Gráfica de transacciones por período
  • Productos más vendidos
  • Últimas transacciones
@api_view(["GET"])
@permission_classes([IsAdminUser])
def company_dashboard(request):
    # KPIs principales
    total_revenue = Transaction.objects.filter(
        status='confirmed'
    ).aggregate(total=Sum('amount_usd'))['total'] or 0
    
    active_users = UserProfile.objects.filter(
        transactions__status='confirmed',
        transactions__created_at__gte=timezone.now() - timedelta(days=30)
    ).distinct().count()

    return Response({
        'total_revenue': float(total_revenue),
        'active_users': active_users,
        # ... más métricas
    })

📸 Captura del Dashboard de la parte de administración


Gestión de Productos

CRUD completo para el catálogo:

  • Creación, edición y eliminación de productos
  • Control de inventario
  • Categorización y organización (integración pendiente)
<ProductAdminTable
  products={products}
  onEdit={handleEditProduct}
  onDelete={handleDeleteProduct}
  onCreate={handleCreateProduct}
/>

📸 Captura del listado de productos
📸 Captura de la edición de un producto


Gestión de Ventas

Sistema completo de seguimiento de pedidos:

  • Filtrado avanzado por cliente/fecha
  • Actualización de estados de envío
  • Vista detallada de cada transacción
  • Generación de facturas en PDF
@api_view(['PATCH'])
@permission_classes([IsAdminUser])
def update_order_item_status(request, order_item_id):
    order_item = get_object_or_404(OrderItem, id=order_item_id)
    new_status = request.data.get('status')

    if new_status not in dict(OrderItem.STATUS_CHOICES):
        return Response({'error': 'Estado inválido'}, status=400)

    order_item.status = new_status
    order_item.save()
    return Response({'message': 'Estado actualizado'})

📸 Captura del listado de ventas
📸 Captura del detalle de venta


Gestión de Clientes

Herramientas para administración de usuarios cliente:

  • Historial completo de compras
  • Métricas de actividad
  • Datos de contacto
  • Transacciones pendientes/confirmadas
<ClientManagement 
  clients={clients}
  onViewDetails={viewClientDetails}
  stats={clientStats}
/>

📸 Captura de la administración de clientes
📸 Captura del detalle de cliente


Seguridad Integral

Autenticación y Autorización

Ejemplo de código:

@ratelimit(key='user', rate='5/m')
@api_view(['GET'])
def get_wallet_nonce(request, wallet_address):
    nonce = str(uuid.uuid4())
    cache.set(f"wallet_nonce_{wallet_address}", nonce, timeout=300)
    return Response({'nonce': nonce})

Protecciones:

  • Firma criptográfica para verificación de identidad
  • Nonces de un solo uso con expiración
  • Rate limiting para evitar ataques de fuerza bruta
  • JWT con tokens refresh para mantener sesiones seguras

📸 Captura de la petición de firma


Protección de Transacciones

Ejemplo de código:

def verify_transaction(tx_hash):
    receipt = w3.eth.get_transaction_receipt(tx_hash)
    if receipt.status == 1:
        tx = Transaction.objects.get(transaction_hash=tx_hash)
        tx.status = 'confirmed'
        tx.save()
        return True
    return False

Mecanismos:

  • Validación de saldos y gas fees
  • Timeout para transacciones pendientes
  • Verificación de eventos on-chain
  • Hash únicos para cada transacción

Seguridad en Frontend

Ejemplo de código:

const PaymentForm = () => {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: yupResolver(validationSchema)
  });

  return (
    <form onSubmit={handleSubmit(processPayment)}>
      <Input
        {...register('amount')}
        error={errors.amount?.message}
      />
      <Button type="submit">Confirmar Pago</Button>
    </form>
  );
}

Medidas:

  • Validación de formularios estricta
  • Sanitización de inputs
  • Protección contra XSS
  • Políticas CORS estrictas

Procesos Automatizados

Listener de Blockchain

Ejemplo de código:

def handle_event(event):
    tx_hash = event['transactionHash'].hex()
    tx = Transaction.objects.get(transaction_hash=tx_hash)
    tx.status = 'confirmed'
    tx.save()
    process_order_items(tx)

event_filter = contract.events.PaymentReceived.createFilter(fromBlock='latest')
while True:
    for event in event_filter.get_new_entries():
        handle_event(event)
    time.sleep(10)

Funcionalidad:

  • Monitorea en tiempo real los eventos del smart contract
  • Actualización automática de estados de las transacciones

Mantenimiento del Sistema

Ejemplo de código:

@periodic_task(run_every=crontab(hour=3, minute=30))
def cleanup_abandoned_carts():
    week_ago = timezone.now() - timedelta(weeks=1)
    abandoned_carts = Cart.objects.filter(
        updated_at__lt=week_ago,
        is_active=True
    )
    abandoned_carts.delete()

Tareas programadas:

  • Limpieza periódica de carritos abandonados
  • Actualización de estados
  • Backup de datos críticos

Conclusión

Como desarrollador blockchain, he diseñado esta plataforma no solo como un marketplace básico funcional, sino como una base sólida que proporciona:

  1. Experiencia de usuario fluida: Desde la exploración de productos hasta la confirmación de pagos en blockchain.
  2. Herramientas empresariales: Para gestión de inventario, ventas y clientes.
  3. Arquitectura segura: Con múltiples capas de protección en frontend, backend y blockchain.
  4. Sistema escalable: Preparado para alto volumen de transacciones y futuras expansiones.

El proyecto demuestra mi capacidad para:

  • Integrar tecnologías blockchain en aplicaciones comerciales reales
  • Diseñar interfaces intuitivas y responsivas
  • Implementar medidas de seguridad robustas
  • Desarrollar sistemas backend eficientes y escalables

Impacto comercial:

  • Reduce costos de transacción
  • Atrae a usuarios de criptomonedas
  • Proporciona transparencia mediante blockchain
  • Optimiza procesos administrativos

¿Interesado en una solución similar para tu negocio?
¡Estoy disponible para adaptar este proyecto o desarrollar una plataforma a medida con las funcionalidades que necesites!

Logotipo Footer - Jaterli
© 2026 Jaime TL
Desarrollado con Astro y con amor ❤️