Que es este sistema
Sistema de venta automatizada de Excels con licencia para boliviaimpuestos.com. El cliente paga via Yape Bolivia, el sistema detecta el pago automaticamente y genera un Excel personalizado con los datos del comprador.
Dominio: https://e.lexova.work/licenciasexcel/
Arquitectura del sistema
[Cliente web] [Celular con Yape]
| |
| 1. Ve producto | 2. Paga via QR Yape
| escanea QR |
v v
index.php App Yape (BCP Bolivia)
| |
| 3. Polling | Notificacion de pago
| cada 2s v
v YapeListener (APK)
check.php <--- BD <--- |
^ | 4. POST monto,
| | remitente
+------------ pago.php (registra pago)
|
| 5. Pago detectado!
v
activar.php
|
| 6. Marca pago como usado
| 7. Genera Excel personalizado (Python)
| 8. Crea licencia con token
| 9. Sync Google Sheet
v
descargar.php?token=xxx (max 3 descargas)
Infraestructura
| Componente | Ubicacion | Detalle |
| Servidor produccion |
Droplet 3 |
root@165.227.81.34 (droplet-3-lexova-cosas) |
| Ruta web |
Droplet 3 |
/var/www/e.lexova.work/licenciasexcel/ |
| Base de datos |
Droplet 3 |
MySQL licencias_excel, usuario licencias |
| Codigo fuente APK |
WSL local |
/home/beto/YapeListener/ |
| Servidor anterior |
Droplet 2 |
root@146.190.65.66 — migrado, ya no tiene estos archivos |
| Dominio anterior |
— |
e.taxlawbolivia.com (ya no activo para licencias) |
Zona horaria: El servidor esta en UTC. Las fechas se convierten a Bolivia (UTC-4) en PHP via date_default_timezone_set('America/La_Paz') en config.php.
Archivos PHP del servidor
Archivos principales
| Archivo | Funcion |
config.php |
Config BD, password admin, timezone. Todas las paginas lo incluyen. |
admin.php |
ADMIN Panel de administracion: productos, licencias, pagos, config Google Sheet |
index.php |
PUBLICO Pagina de compra del producto. Muestra QR, formulario de datos, polling de pago |
check.php |
API GET Verifica si hay pago disponible (monto >= precio, no usado, <30 min) |
activar.php |
API POST Marca pago como usado, genera Excel personalizado, crea licencia, sync Google |
pago.php |
API POST Recibe notificaciones de pago desde la APK YapeListener |
api_pagos.php |
API GET Lista todos los pagos registrados (requiere token) |
descargar.php |
PUBLICO Descarga Excel comprado via token hex (max 3 descargas) |
generar_vbs.php |
INTERNO Genera script VBS para proteger Excel (uso de Roberto) |
Scripts Python
| Archivo | Funcion |
scripts/generar_demo.py |
Genera Excel demo (solo lectura) desde el original. Usa openpyxl con data_only=True |
scripts/generar_completo.py |
Genera Excel personalizado con nombre, NIT y celular del comprador |
Estructura de directorios
├── admin.php, index.php, config.php, ...
├── qr/
├── scripts/
│ ├── generar_demo.py
│ └── generar_completo.py
├── descargas/
│ ├── originals/
│ ├── demos/
│ └── compras/
├── YapeListener.apk
└── YapeListenerV2.apk
Base de datos MySQL
Base de datos: licencias_excel
Tabla: productos
| Campo | Tipo | Descripcion |
| id | int | ID autoincremental |
| nombre | varchar | Nombre visible del producto |
| slug | varchar | Identificador unico (ej: Control_CF_IVA) |
| precio | decimal | Precio en Bs |
| qr_imagen | varchar | Nombre del archivo QR en /qr/ |
| activo | tinyint | 1=activo, 0=inactivo |
| archivo_subido | tinyint | 1=tiene Excel original subido |
Tabla: licencias
| Campo | Tipo | Descripcion |
| id | int | ID autoincremental |
| producto | varchar | Slug del producto |
| celular | varchar | Celular del comprador |
| nombre | varchar | Nombre del comprador |
| nit | varchar | NIT del comprador |
| contrasena | varchar | (legacy, vacio en metodo excel) |
| metodo | varchar | "excel" o "password" |
| token_descarga | varchar | Token hex de 32 chars para descargar |
| descargado | int | Contador de descargas (max 3) |
| activo | tinyint | 1=activa, 0=revocada |
| fecha_activacion | datetime | Fecha de creacion (UTC en BD) |
Tabla: pagos_recibidos
| Campo | Tipo | Descripcion |
| id | int | ID autoincremental |
| app_origen | varchar | Siempre "yape" |
| monto | decimal | Monto en Bs |
| mensaje | text | Texto completo de la notificacion |
| remitente | varchar | Nombre del remitente |
| usado | tinyint | 0=disponible, 1=ya asignado a una licencia |
| fecha_recibido | datetime | Timestamp del pago (UTC en BD) |
Panel Admin (admin.php)
Acceso: admin.php con password
Pestanas
| Pestana | Funcion |
| Licencias |
Lista de licencias emitidas. Revocar/reactivar. Ver nombre, NIT, celular, metodo, descargas, estado |
| Pagos |
Pagos recibidos via YapeListener. Auto-refresh cada 5s. Estado: usado/disponible |
| Productos |
CRUD productos. Subir Excel original (.xlsx), genera demo automaticamente. Editar precio, QR |
| Config |
URL de Google Apps Script para sync de facturacion |
Flujo para agregar un nuevo producto
- Ir a Productos > "Agregar nuevo producto" (nombre, slug, precio, imagen QR)
- Click en "Editar" en el producto creado
- Subir el Excel Original (.xlsx) en la seccion "Subir Excel Original"
- El sistema genera automaticamente el demo protegido via
generar_demo.py
- El producto aparece en
index.php?producto=SLUG
Flujo de compra (detallado)
- Cliente abre
index.php?producto=Control_CF_IVA
- Ve info del producto, precio y QR de Yape
- Puede descargar el demo gratis (Excel protegido, solo lectura)
- Escanea el QR y paga via Yape en su celular
- YapeListener (APK en otro celular) detecta la notificacion de pago
- APK envia POST a
pago.php con monto, remitente y mensaje
pago.php guarda el pago en pagos_recibidos (usado=0)
- La pagina del cliente hace polling a
check.php cada 2 segundos
check.php busca un pago disponible (monto >= precio, no usado, <30 min)
- Cuando detecta pago, el cliente llena formulario (nombre, NIT, celular)
- POST a
activar.php que:
- Marca el pago como
usado=1
- Ejecuta
generar_completo.py para crear Excel personalizado
- Crea licencia con token de descarga
- Sync a Google Sheet (opcional)
- Cliente recibe link de descarga:
descargar.php?token=abc123...
- Puede descargar max 3 veces
App Android - YapeListener
Para documentacion detallada de la APK: Ver documentacion YapeListener
Resumen
| Dato | Valor |
| Codigo fuente | /home/beto/YapeListener/ (WSL) |
| Package | com.boliviaimpuestos.yapelistener |
| Lenguaje | Java |
| Gradle | AGP 8.5.1, compileSdk 35 |
| Endpoint | https://e.lexova.work/licenciasexcel/pago.php |
| App Yape detectada | com.bcp.bo.wallet |
Clases principales
| Clase | Funcion |
MainActivity | UI: config URL/token, permisos, inicio/parada, log |
YapeNotificationListener | PRIMARIO NotificationListenerService + foreground |
YapeAccessibilityService | FALLBACK Para Android 15+ (notifs censuradas) |
SendPaymentWorker | WorkManager: envio HTTP con reintentos |
BootReceiver | Reinicio automatico al encender |
KeepAliveService | Watchdog cada 3 min |
Compilar la APK
cd /home/beto/YapeListener
./gradlew assembleRelease
app/build/outputs/apk/release/app-release-unsigned.apk
Notas importantes
- La ventana de validacion de pago es de 30 minutos (check.php y activar.php)
- Cada licencia permite max 3 descargas del Excel
- Los Excels personalizados se guardan en
descargas/compras/ nombrados por token hex
- Google Sheet sync es opcional, se configura en la pestana Config del admin
- Las fechas se guardan en UTC en la BD y se muestran en hora Bolivia (UTC-4)
pago.php tambien envia cada pago al Google Sheet configurado
Duplicados: La APK tiene proteccion contra duplicados (ventana de 5 seg + mismo monto). Si dos personas pagan el mismo monto al mismo tiempo, el sistema podria asignar el pago a la primera que complete el formulario.