Move MD files and add an AGENTS.md
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
↓
|
||||
SÍ
|
||||
↓
|
||||
¿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`
|
||||
Reference in New Issue
Block a user