
Comercio Electrónico con Pagos Blockchain
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)
Proceso de Pago
Flujo seguro para completar transacciones:
- Selección del token de pago (ETH, USDT, USDC, LINK).
- Firma criptográfica de la transacción desde la wallet.
- 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:
- Experiencia de usuario fluida: Desde la exploración de productos hasta la confirmación de pagos en blockchain.
- Herramientas empresariales: Para gestión de inventario, ventas y clientes.
- Arquitectura segura: Con múltiples capas de protección en frontend, backend y blockchain.
- 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!