Move MD files and add an AGENTS.md

This commit is contained in:
2026-05-04 22:01:27 +02:00
parent 53b4e89347
commit a02617f8d2
4 changed files with 61 additions and 0 deletions
+82
View File
@@ -0,0 +1,82 @@
# Configuración de PayPal
## Pasos para configurar PayPal en el proyecto
### 1. Crear una cuenta de PayPal Developer
- Ve a https://developer.paypal.com/
- Crea una cuenta o inicia sesión con tu cuenta de PayPal
### 2. Acceder al Sandbox
- En el dashboard de PayPal Developer, ve a "Sandbox"
- Aquí encontrarás credenciales de prueba
### 3. Obtener las credenciales
- En la sección "Accounts" del Sandbox, encontrarás:
- **Business Account** (vendedor)
- **Personal Account** (comprador de prueba)
- Para cada cuenta, haz clic en "Show" junto a "API Signature" o "API Certificate"
- También puedes usar las credenciales REST API
### 4. Obtener Client ID y Client Secret (REST API)
- En el dashboard, ve a **"Apps & Credentials"**
- Selecciona **Sandbox** (arriba a la derecha)
- Ve a la pestaña **"REST API apps"**
- Haz clic en el app por defecto o crea uno nuevo
- Verás:
- **Client ID** (tu PAYPAL_CLIENT_ID)
- **Secret** (tu PAYPAL_CLIENT_SECRET)
### 5. Actualizar settings.py
Edita el archivo `proyecto/settings.py` y reemplaza:
```python
PAYPAL_CLIENT_ID = 'YOUR_PAYPAL_CLIENT_ID'
PAYPAL_CLIENT_SECRET = 'YOUR_PAYPAL_CLIENT_SECRET'
PAYPAL_MODE = 'sandbox' # Cambiar a 'live' en producción
```
Con tus valores reales del Sandbox.
### 6. Instalar el SDK de PayPal
```bash
pip install paypalrestsdk
```
### 7. Usar cuentas de prueba para transacciones
En Sandbox puedes usar las cuentas de prueba:
- **Email de vendedor**: El que aparece en el Business Account
- **Email de comprador**: El que aparece en el Personal Account
Ambas cuentas tienen saldo de prueba disponible.
## Pasar a Producción
Para usar PayPal en producción:
1. Cambia `PAYPAL_MODE = 'live'` en settings.py
2. Reemplaza `PAYPAL_CLIENT_ID` y `PAYPAL_CLIENT_SECRET` con las credenciales reales (no de Sandbox)
3. Obten tus credenciales reales en https://www.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-api-signature
## Métodos de Pago Disponibles
Actualmente el proyecto soporta:
- **Stripe** 💳
- **PayPal** 🅿️
Ambos métodos están disponibles en la página de checkout.
## Notas de Seguridad
- NUNCA commits las credenciales reales en git
- Usa variables de entorno en producción
- Mantén tus claves secretas privadas
- El modo Sandbox es solo para pruebas
## Testear PayPal
1. Ve a la página de Checkout
2. Haz clic en "Pagar con PayPal"
3. Se abrirá PayPal Sandbox
4. Usa las credenciales de la cuenta de prueba (Personal Account)
5. Completa el pago simulado
6. Serás redirigido a la página de éxito
+99
View File
@@ -0,0 +1,99 @@
# Solución de Problemas - PayPal
## Si ves "Error al procesar el pago con PayPal"
### Paso 1: Abre la Consola del Navegador
1. Presiona **F12** o **Cmd+Option+I** (Mac)
2. Ve a la pestaña **Console**
### Paso 2: Busca el mensaje de error
Cuando hagas clic en "Pagar con PayPal", deberías ver en la consola:
- `CSRF Token encontrado: Sí`
- `Response status: 200`
- `Response data: {"redirect": "https://www.sandbox.paypal.com/..."}`
- `Redirigiendo a: https://www.sandbox.paypal.com/...`
### Paso 3: Interpreta los errores
#### Error: "CSRF Token encontrado: No"
**Solución:**
- El formulario no tiene token CSRF
- Asegúrate de que `{% csrf_token %}` esté en el template checkout.html
- Recarga la página (Ctrl+Shift+R)
#### Error: "Response status: 403"
**Causa:** Error de CSRF token o permisos
**Solución:**
- Verifica que estés logueado
- Limpia cookies: Settings > Clear browsing data > Cookies
- Recarga la página
#### Error: "Response status: 500"
**Causa:** Error en el servidor
**Solución:**
- Ve a la terminal donde corre Django
- Busca el mensaje de error (stack trace en rojo)
- Verifica que `PAYPAL_CLIENT_ID` y `PAYPAL_CLIENT_SECRET` estén correctos en settings.py
#### Error: "Error inesperado al procesar el pago"
**Solución:**
- Mira en la consola qué dice exactamente
- Copia el error completo
- Revisa los logs de Django en la terminal
### Paso 4: Verifica el Backend
En la terminal donde corre Django, deberías ver:
```
[00/Month/2026 12:00:00] "POST /tienda/paypal/create-payment/ HTTP/1.1" 200 123
```
Si ves un error (4xx o 5xx), el problema está en el servidor.
### Paso 5: Test Manual
Ejecuta en la terminal:
```bash
cd /home/daniel/projects/proyecto/proyecto2/proyecto
.venv/bin/python test_paypal.py
```
Si todo está bien, deberías ver:
```
✓ paypalrestsdk importado correctamente
✓ Configuración de PayPal aplicada
✓ Pago creado exitosamente
```
## Checklist de Configuración
- [ ] `pip install paypalrestsdk` (verificar con: `.venv/bin/pip list | grep paypal`)
- [ ] `PAYPAL_CLIENT_ID` en settings.py (no vacío)
- [ ] `PAYPAL_CLIENT_SECRET` en settings.py (no vacío)
- [ ] `PAYPAL_MODE = 'sandbox'` en settings.py
- [ ] `{% csrf_token %}` en checkout.html
- [ ] El usuario está autenticado (login requerido)
- [ ] El carrito tiene items
## Credenciales de Prueba
Si necesitas nuevas credenciales:
1. Ve a https://sandbox.paypal.com/
2. Login con tu cuenta
3. Ve a Dashboard > Apps & Credentials
4. Copia Client ID y Secret
5. Actualiza en settings.py
6. Recarga la página
## Logs Útiles
Para ver más detalles, edita `/tienda/views.py` y busca la función `create_paypal_payment`:
- Ya tiene `print()` para loguear errores
- Verás los mensajes en la terminal de Django
## Contacto con PayPal
Si todo lo anterior no funciona:
- El problema puede ser con las credenciales de PayPal
- Verifica que sean del **SANDBOX** (no production)
- Intenta regenerar las credenciales en paypal.com
+214
View File
@@ -0,0 +1,214 @@
# Redis Setup - Configuración de Redis para Sesiones
## Configuración Implementada
Este proyecto utiliza Redis para almacenar las sesiones de usuario, mejorando el rendimiento y la escalabilidad.
### Paquetes Instalados
- **django-redis 5.4.0**: Backend de caché Redis para Django
- **redis 5.2.1**: Cliente Python para Redis
### Configuración en settings.py
```python
# Redis Configuration
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# Session Configuration - Use Redis for session storage
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
```
### Uso en el Proyecto
El proyecto utiliza Redis para:
1. **Sesiones de usuario**: Todas las sesiones se almacenan en Redis (base de datos 1)
2. **Cacheo de productos**: Los productos visitados se cachean por 5 minutos
- Primera visita: Se carga desde la base de datos y se cachea
- Siguientes visitas: Se sirve desde caché (mucho más rápido)
- Después de 5 minutos: Se recarga desde la BD y se vuelve a cachear
- Al editar/borrar un producto: Se invalida automáticamente su caché
## Instalación de Redis
### Linux (Ubuntu/Debian)
```bash
sudo apt update
sudo apt install redis-server
sudo systemctl start redis-server
sudo systemctl enable redis-server
```
### Linux (Arch Linux)
```bash
sudo pacman -S redis
sudo systemctl start valkey
sudo systemctl enable valkey
# En Arch, Redis se llama Valkey (fork de Redis)
# Comando CLI: valkey-cli en lugar de redis-cli
```
### macOS
```bash
brew install redis
brew services start redis
```
### Windows
Descargar desde: https://github.com/microsoftarchive/redis/releases
## Verificar que Redis está Funcionando
```bash
# Verificar estado del servicio
sudo systemctl status redis-server
# Conectarse a Redis CLI
redis-cli
# En Redis CLI, probar conexión:
ping
# Debería responder: PONG
# Ver todas las claves almacenadas
keys *
# Salir de Redis CLI
exit
```
## Probar la Configuración
```bash
# Conectarse a Redis y ver sesiones y productos cacheados
valkey-cli # o redis-cli según tu sistema
SELECT 1 # Usa la base de datos 1 (definida en LOCATION)
KEYS * # Ver todas las claves almacenadas
# Ver productos cacheados
KEYS *product*
# Ver sesiones
KEYS *session*
# Ver el contenido de una clave específica
GET <key_name>
# Ver el TTL (tiempo restante) de una clave
TTL <key_name>
```
### Ejemplo de Claves en Redis
- Productos: `:1:product_<id>` (ej: `:1:product_7`)
- Sesiones: `:1:django.contrib.sessions.cache<session_id>`
- Cache general: `:1:test_key`
## Configuración de Producción
Para producción, considera:
1. **Configurar contraseña en Redis**:
```bash
# En /etc/redis/redis.conf
requirepass tu_contraseña_segura
```
2. **Actualizar settings.py**:
```python
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://:tu_contraseña_segura@127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
```
3. **Persistencia de datos**: Redis guarda snapshots automáticamente, pero puedes configurar:
```bash
# En /etc/redis/redis.conf
save 900 1 # Guardar cada 15 min si hay al menos 1 cambio
save 300 10 # Guardar cada 5 min si hay al menos 10 cambios
save 60 10000 # Guardar cada 1 min si hay al menos 10000 cambios
```
## Ventajas de Redis para Sesiones
1. **Rendimiento**: Redis es extremadamente rápido (en memoria)
2. **Escalabilidad**: Permite múltiples servidores compartiendo sesiones
3. **Expiración automática**: Las sesiones expiran automáticamente
4. **Persistencia**: Opcionalmente puede persistir datos en disco
## Ventajas del Cacheo de Productos
1. **Velocidad**: ~15x más rápido cargar desde caché vs base de datos
2. **Reducción de carga**: Menos queries a la base de datos
3. **Mejor UX**: Páginas de producto cargan instantáneamente
4. **Auto-invalidación**: El caché se limpia automáticamente al editar/borrar productos
### Flujo de Cacheo de Productos
```
Usuario visita producto
¿Está en caché? → NO → Cargar de BD → Cachear por 5 min → Mostrar
¿Pasaron 5 min? → SÍ → Cargar de BD → Cachear por 5 min → Mostrar
NO
Servir desde caché → Mostrar
```
## Monitoreo
```bash
# Ver estadísticas en tiempo real
redis-cli --stat
# Monitor de comandos en tiempo real
redis-cli monitor
# Ver información del servidor
redis-cli INFO
```
## Limpieza de Sesiones
Las sesiones en Redis expiran automáticamente según `SESSION_COOKIE_AGE` de Django (por defecto 2 semanas).
Para limpiar manualmente todas las sesiones:
```bash
redis-cli
SELECT 1
FLUSHDB
```
## Troubleshooting
### Error: "Connection refused"
- Verificar que Redis está corriendo: `sudo systemctl status redis-server`
- Iniciar Redis: `sudo systemctl start redis-server`
### Sesiones no se guardan
- Verificar conexión a Redis: `redis-cli ping`
- Revisar logs: `sudo journalctl -u redis-server -n 50`
### Alto uso de memoria
- Ver uso de memoria: `redis-cli INFO memory`
- Configurar límite: En redis.conf agregar `maxmemory 256mb`
- Política de desalojo: `maxmemory-policy allkeys-lru`