feat(domain): configurar soporte oficial para dominio drip-zone.online en Traefik, Bold y App Android

This commit is contained in:
AI Bot 2026-09-05 15:35:37 -05:00
parent 182b2600c0
commit 6657525815
5 changed files with 45 additions and 27 deletions

View File

@ -21,10 +21,24 @@ import java.util.concurrent.TimeUnit
object ApiClient {
private const val TAG = "DripApiClient"
private const val PRIMARY_URL = "https://dripzone.almeira.com.co/api/products"
private const val FALLBACK_URL = "https://news.almeira.com.co/api/products"
private const val CACHE_KEY_PRODUCTS = "cached_products_json"
fun getBaseUrl(): String {
return try {
val addr = java.net.InetAddress.getByName("drip-zone.online")
if (addr != null && !addr.hostAddress.isNullOrBlank()) {
"https://drip-zone.online"
} else {
"https://dripzone.almeira.com.co"
}
} catch (e: Exception) {
"https://dripzone.almeira.com.co"
}
}
private fun getPrimaryProductsUrl(): String = "${getBaseUrl()}/api/products"
private const val FALLBACK_URL = "https://news.almeira.com.co/api/products"
private val gson = Gson()
// OkHttpClient enforcing TLS 1.3 and TLS 1.2 modern cipher suites
@ -48,7 +62,7 @@ object ApiClient {
suspend fun getProducts(context: Context, forceRefresh: Boolean = false): List<Product> =
withContext(Dispatchers.IO) {
// 1. Try primary URL
val primaryResult = fetchFromUrl(PRIMARY_URL)
val primaryResult = fetchFromUrl(getPrimaryProductsUrl())
if (primaryResult != null && primaryResult.isNotEmpty()) {
saveCache(context, primaryResult)
return@withContext primaryResult
@ -208,7 +222,7 @@ object ApiClient {
val requestBody = jsonPayload.toRequestBody(mediaType)
val request = Request.Builder()
.url("https://dripzone.almeira.com.co/api/auth/send-otp")
.url("${getBaseUrl()}/api/auth/send-otp")
.post(requestBody)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
@ -256,7 +270,7 @@ object ApiClient {
val requestBody = jsonPayload.toRequestBody(mediaType)
val request = Request.Builder()
.url("https://dripzone.almeira.com.co/api/auth/verify-otp")
.url("${getBaseUrl()}/api/auth/verify-otp")
.post(requestBody)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
@ -289,7 +303,7 @@ object ApiClient {
val requestBody = jsonPayload.toRequestBody(mediaType)
val request = Request.Builder()
.url("https://dripzone.almeira.com.co/api/orders")
.url("${getBaseUrl()}/api/orders")
.post(requestBody)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
@ -324,7 +338,7 @@ object ApiClient {
val requestBody = jsonPayload.toRequestBody(mediaType)
val request = Request.Builder()
.url("https://dripzone.almeira.com.co/api/custom-requests")
.url("${getBaseUrl()}/api/custom-requests")
.post(requestBody)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
@ -370,7 +384,7 @@ object ApiClient {
val requestBody = jsonPayload.toRequestBody(mediaType)
val request = Request.Builder()
.url("https://dripzone.almeira.com.co/api/bold/create-payment")
.url("${getBaseUrl()}/api/bold/create-payment")
.post(requestBody)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
@ -403,7 +417,7 @@ object ApiClient {
withContext(Dispatchers.IO) {
try {
val request = Request.Builder()
.url("https://dripzone.almeira.com.co/api/bold/status?linkId=$linkId&orderId=$orderId")
.url("${getBaseUrl()}/api/bold/status?linkId=$linkId&orderId=$orderId")
.get()
.header("Accept", "application/json")
.build()

View File

@ -12,6 +12,7 @@
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">almeira.com.co</domain>
<domain includeSubdomains="true">dripzone.almeira.com.co</domain>
<domain includeSubdomains="true">drip-zone.online</domain>
<domain includeSubdomains="true">news.almeira.com.co</domain>
<domain includeSubdomains="true">cloud.appwrite.io</domain>
<domain includeSubdomains="true">wa.me</domain>

View File

@ -35,11 +35,11 @@ services:
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
- "traefik.http.routers.dripzone-http.entryPoints=http"
- "traefik.http.routers.dripzone-http.middlewares=redirect-to-https"
- "traefik.http.routers.dripzone-http.rule=Host(`dripzone.almeira.com.co`) && PathPrefix(`/`)"
- "traefik.http.routers.dripzone-http.rule=Host(`drip-zone.online`) || Host(`www.drip-zone.online`) || Host(`dripzone.almeira.com.co`)"
- "traefik.http.routers.dripzone-http.service=dripzone-svc"
- "traefik.http.routers.dripzone-https.entryPoints=https"
- "traefik.http.routers.dripzone-https.middlewares=gzip"
- "traefik.http.routers.dripzone-https.rule=Host(`dripzone.almeira.com.co`) && PathPrefix(`/`)"
- "traefik.http.routers.dripzone-https.rule=Host(`drip-zone.online`) || Host(`www.drip-zone.online`) || Host(`dripzone.almeira.com.co`)"
- "traefik.http.routers.dripzone-https.service=dripzone-svc"
- "traefik.http.routers.dripzone-https.tls=true"
- "traefik.http.routers.dripzone-https.tls.certresolver=letsencrypt"

View File

@ -21,7 +21,7 @@ export async function POST(request: Request) {
amount: Number(amount),
description,
payerEmail,
redirectionUrl: redirectionUrl || `https://dripzone.almeira.com.co/checkout?orderId=${orderId}`,
redirectionUrl: redirectionUrl || `https://drip-zone.online/checkout?orderId=${orderId}`,
type,
});

View File

@ -84,7 +84,7 @@ def main():
print(" [OK] Archivos sincronizados en VPS.")
print("[3/5] Reconstruyendo y reiniciando contenedor en VPS (docker compose build)...")
cmd_build = f"cd {REMOTE_BASE} && docker compose -f docker-compose.prod.yml up -d --build"
cmd_build = f"cd {REMOTE_BASE} && echo {PASSWORD} | sudo -S docker compose -f docker-compose.prod.yml build && echo {PASSWORD} | sudo -S docker compose -f docker-compose.prod.yml up -d"
stdin, stdout, stderr = ssh.exec_command(cmd_build)
out = stdout.read().decode('utf-8', errors='replace')
err = stderr.read().decode('utf-8', errors='replace')
@ -115,20 +115,23 @@ def main():
print("[5/5] Enviando notificación detallada y archivo APK al WhatsApp de Carlos (+57 316 745 5877)...")
message_text = (
"🚀 *DripZone v1.5 - Pasarela de Pagos Bold & QR Bre-B Integrados*\n\n"
"Hola Carlos, se ha completado e implementado en producción la integración integral de la pasarela oficial *Bold*:\n\n"
"💳 *1. Cobro de Separación con QR Bre-B y Pasarela Bold:*\n"
"• Al registrar el primer pedido, la plataforma genera automáticamente una orden de cobro en Bold por *$10.000 COP*.\n"
"• Tanto en la Web como en la App Nativa se renderiza en vivo el *Código QR Bre-B*, permitiendo escanear y pagar al instante desde Bancolombia, Nequi, Daviplata, Dale o cualquier app bancaria interoperable.\n"
"• Incluye botón directo para pagar con tarjeta de crédito/débito o PSE en el checkout alojado seguro de Bold.\n\n"
"⚡ *2. Acreditación Automática en Tiempo Real:*\n"
"• El sistema cuenta con sondeo continuo (polling de 3 segundos) y Webhook (`/api/webhook/bold`) para capturar la aprobación del pago inmediatamente.\n"
"• En cuanto el cliente paga, la pantalla confirma el abono en verde al instante, la orden pasa a estado `deposit_received`, se resta automáticamente el saldo a pagar contraentrega y se te envía notificación inmediata con los datos del pago.\n\n"
"🔑 *3. Modo de Pruebas Activo (Sandbox):*\n"
"• La pasarela está operando actualmente con las llaves de prueba de la API (`GatyXH...` / `BAFlCP...`) para validar el ciclo completo con transacciones simuladas sin costo.\n"
"• Las llaves de producción ya quedaron preconfiguradas en el servidor y listas para encender en cuanto des la orden.\n\n"
"📲 *4. App Nativa Android v1.5 Sincronizada:*\n"
"• Nuevo APK compilado con el módulo de lectura de QR Bre-B, botón a Bold y confirmación reactiva en vivo.\n\n"
"🚀 *DripZone v1.5 - Dominio drip-zone.online & Pasarela Bold Bre-B*\n\n"
"Hola Carlos, se ha implementado en producción la configuración completa:\n\n"
"🌐 *1. Dominio Oficial drip-zone.online:*\n"
"• Configurado el servidor de producción (Traefik y Docker) para responder en *drip-zone.online*, *www.drip-zone.online* y el alias de respaldo `dripzone.almeira.com.co`.\n"
"• Certificados SSL automáticos (Let's Encrypt) habilitados.\n"
"• *Paso restante en tu registrador:* Asegúrate de apuntar los registros A de `drip-zone.online` y `www.drip-zone.online` a la IP del VPS: `161.97.93.156`.\n\n"
"💳 *2. Cobro de Separación con QR Bre-B y Pasarela Bold:*\n"
"• Al registrar el pedido, se genera la orden de cobro en Bold por *$10.000 COP*.\n"
"• En la Web y en la App Nativa se renderiza en tiempo real el *Código QR Bre-B*, permitiendo escanear y pagar al instante desde Bancolombia, Nequi, Daviplata o cualquier banco.\n"
"• Incluye botón directo al checkout seguro de Bold para tarjetas de crédito/débito o PSE.\n\n"
"⚡ *3. Acreditación Automática en Tiempo Real:*\n"
"• Detección inmediata en vivo con Webhook (`/api/webhook/bold`) y sondeo reactivo.\n"
"• Cuando el cliente paga, la orden pasa a `deposit_received`, se descuenta el anticipo del saldo contraentrega y se te envía notificación inmediata con los datos del pago.\n\n"
"🔑 *4. Modo Sandbox Activo para Pruebas:*\n"
"• Operando con las llaves de prueba de la API (`GatyXH...` / `BAFlCP...`) para pruebas sin costo. Las llaves de producción ya están listas para activarse.\n\n"
"📲 *5. App Nativa Android v1.5:*\n"
"• Compilada con soporte dinámico para `drip-zone.online` y QR Bre-B.\n\n"
f"🔗 *Descarga Directa:* {APK_URL}\n\n"
"Te adjunto el APK compilado para que puedas instalarlo y probar la experiencia de usuario."
)