COPILOT – RESPUESTAS FINALES (ARTECH SOLUTIONS) Tema: WhatsApp Business API – WABA y Plantillas Fecha: ahora --------------------------------------------- RESUMEN DE SITUACIÓN - Ya PODEMOS listar plantillas con éxito por API. - Evidencia (respuesta real de Graph API v18.0 /{WABA_ID}/message_templates): incluye IDs, name, language, category, status=APPROVED y paging. Eso demuestra que el token usado tiene permisos suficientes para gestión de WhatsApp en ese WABA. - Por tanto, el bloqueo inicial de permisos fue superado. IDs CONFIRMADOS - WABA_ID: 799342059122741 - PHONE_NUMBER_ID: 817854531405693 - DISPLAY_PHONE_NUMBER: +593981802659 --------------------------------------------- PREGUNTAS DE COPILOT – RESPUESTAS RATIFICADAS 1) ¿Cómo obtener el WABA_ID correcto desde el PHONE_NUMBER_ID? - No existe un “reverse lookup” oficial directo de phone_number_id → waba_id. - Procedimiento soportado: A) Listar los WABA del Business y luego sus teléfonos para ubicar el phone_number_id. GET https://graph.facebook.com/v18.0/{BUSINESS_ID}/owned_whatsapp_business_accounts?fields=id,name GET https://graph.facebook.com/v18.0/{WABA_ID}/phone_numbers?fields=id,display_phone_number B) Alternativa por interfaz: en Meta Business Settings → Cuentas → Cuentas de WhatsApp, seleccionar la cuenta y leer el “Identificador” (ese es el WABA_ID). - En nuestro caso: WABA_ID = 799342059122741 (visto en la UI) y confirmado por API, donde aparece PHONE_NUMBER_ID = 817854531405693 dentro de /{WABA_ID}/phone_numbers. 2) ¿Qué scopes necesita mi token para acceder a message_templates? - Imprescindibles: • whatsapp_business_management • business_management - Para envío de mensajes se usa además: • whatsapp_business_messaging - Estado actual: al obtener correctamente /{WABA_ID}/message_templates, el token que usamos tiene los permisos y el asset asignado adecuadamente. 3) ¿Cuál es el endpoint correcto para listar plantillas? ¿Hay alternativa? - Oficial: GET https://graph.facebook.com/v18.0/{WABA_ID}/message_templates Params recomendados: fields=id,name,language,category,status,quality_score,last_updated_time&limit=100 - Detalle de una plantilla (para componentes/variables): GET https://graph.facebook.com/v18.0/{TEMPLATE_ID} ?fields=name,language,category,status,components,quality_score,last_updated_time - No existe un endpoint alternativo por phone_number_id; siempre se usa el WABA_ID. 4) ¿Hay forma de obtener el WABA_ID sin permisos de business_management? - Por API: NO (se requiere business_management para consultar activos del negocio). - Alternativa: obtener el WABA_ID por la WEB (Business Settings), y luego usarlo en llamadas API con un token que sí tenga whatsapp_business_management (y normalmente también business_management). --------------------------------------------- POR QUÉ COPILOT REPORTÓ “TOKEN SIN PERMISOS” ANTES - Al inicio, el token carecía de scopes y/o de asignación de asset (WABA) al sujeto del token (usuario del sistema o usuario humano). Por eso devolvía “missing permissions” al consultar /me/businesses o /{WABA_ID}/message_templates. - Después de asignar correctamente el WABA al usuario (y/o usar un token con scopes adecuados) y regenerar el token, la llamada a /{WABA_ID}/message_templates funcionó. - La evidencia de éxito es el JSON obtenido con las plantillas (status APPROVED, etc.). --------------------------------------------- VALIDACIONES QUE YA HICIMOS (POSTMAN) A) Verificar teléfonos del WABA GET https://graph.facebook.com/v18.0/799342059122741/phone_numbers fields=id,display_phone_number,verified_name,status → Devolvió: { "data": [ { "id": "817854531405693", "display_phone_number": "+593981802659", "verified_name": "Artech Solution 2659", "status": "CONNECTED" } ] } B) Listar plantillas del WABA GET https://graph.facebook.com/v18.0/799342059122741/message_templates fields=id,name,language,category,status,quality_score,last_updated_time limit=100 → Devolvió (extracto): - bienvenida_cuenta_activa (es) – category=UTILITY – status=APPROVED - mensaje_prueba (es) – category=MARKETING – status=APPROVED - hello_world (en_US) – category=UTILITY – status=APPROVED --------------------------------------------- CÓMO DEBE IMPLEMENTAR COPILOT (RESUMEN TÉCNICO) ENV FB_GRAPH_VERSION=v18.0 WABA_ID=799342059122741 PHONE_NUMBER_ID=817854531405693 FB_TOKEN= FLUJO 1) GET /{WABA_ID}/phone_numbers para comprobar pertenencia del PHONE_NUMBER_ID. 2) GET /{WABA_ID}/message_templates (con paginación) para sincronizar plantillas. 3) Guardar por plantilla: id, name, language, category, status, quality_score.score, quality_score.date, last_updated_time. 4) (Opcional) GET /{TEMPLATE_ID}?fields=components para mapear variables. 5) Before-send: bloquear si status != APPROVED. TABLA (MySQL) CREATE TABLE IF NOT EXISTS waba_templates ( id VARCHAR(32) PRIMARY KEY, name VARCHAR(255) NOT NULL, language VARCHAR(32) NOT NULL, category VARCHAR(32) NOT NULL, status VARCHAR(32) NOT NULL, quality_score VARCHAR(16) NULL, quality_date BIGINT NULL, last_updated_time DATETIME NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; NOTAS OPERATIVAS - Paginación: seguir paging.next hasta agotar. - Refresco: cada 10–15 min si hay cambios; para uso normal, 1 vez/hora. - Errores: si vuelve “missing permissions”, revisar que el token NO haya expirado y que mantenga los scopes y la asignación del WABA al sujeto del token. - Zona horaria: last_updated_time viene UTC (ISO-8601). quality_score.date viene epoch. FIN