WhatsApp v1 GetByPhone - Consulta de Clientes por Teléfono
Información del Servicio
Endpoint: /api/whatsapp/v1/getbyphone
Método: POST
Versión: v1
Categoría: Atención y Soporte
Documentación del Servicio
Descripción general
El servicio whatsapp-v1-getbyphone permite consultar los datos básicos de un cliente mediante el número de teléfono utilizado para acceder a los servicios de MAX WhatsApp. Este servicio pertenece a la categoría de Gestión de Clientes Digitales y forma parte del ecosistema de servicios de WhatsApp Business de ETB.
Casos de Uso Principales
- Consulta de información de clientes registrados en el canal digital WhatsApp
- Validación de existencia de registros digitales por número de teléfono
- Obtención de datos básicos del cliente para procesos de autenticación y validación
- Integración con sistemas MAX para gestión de usuarios WhatsApp
Especificación Técnica
Capas involucradas:
- Controlador:
WhatsAppController.GetByPhone_v1()
- Maneja la recepción de la petición HTTP - Lógica de negocio:
WhatsAppBusiness.GetByPhone_v1()
- Procesa la lógica principal del servicio - Acceso a datos:
WhatsAppUtil.Get()
- Consulta la base de datos MongoDB - Auditoría:
AuditUtil
- Registra transacciones y métricas
Flujo de procesamiento:
- Recepción de petición HTTP POST
- Validación de autenticación y autorización
- Conversión de datos de entrada
- Obtención del origen de la petición
- Consulta del registro digital por número de teléfono
- Construcción de respuesta
- Auditoría de transacción
- Retorno de respuesta
Dependencias principales:
WhatsAppUtil
- Utilidades específicas de WhatsAppConfigurationUtil
- Gestión de configuraciones y tipologíasAuditUtil
- Auditoría de transaccionesCRUD_MDM_REGISTRO_DIGITAL
- Acceso a datos de registros digitalesMongoContext
- Conexión a base de datos MongoDB
Consideraciones de Seguridad
- Autenticación mediante atributo
[Authorize]
- Validación de origen de petición
- Auditoría completa de transacciones
- Validación de parámetros de entrada
Parámetros de Entrada (Request)
Headers
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Authorization | string | Sí | Token de autenticación Bearer |
Content-Type | string | Sí | application/json |
Body
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
WSRequestHeader | object | Sí | Cabecera estándar de la petición |
WSRequestBody | object | Sí | Cuerpo de la petición con datos específicos |
WSRequestHeader
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
System | object | Sí | Información del sistema origen |
CorrelationID | string | Sí | Identificador único de correlación |
Timestamp | datetime | Sí | Marca de tiempo de la petición |
WSRequestBody
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Audit | object | No | Información de auditoría |
Phone | string | Sí | Número de teléfono usado en MAX WhatsApp |
Audit
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
User | string | No | Usuario que realiza la petición |
Channel | string | No | Canal de origen |
Application | string | No | Aplicación origen |
Respuesta Esperada (Response)
Headers
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Content-Type | string | Sí | application/json |
Status | string | Sí | Código de estado HTTP |
Body
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
WSResponseHeader | object | Sí | Cabecera estándar de la respuesta |
WSResponseBody | object | Sí | Cuerpo de la respuesta con datos del cliente |
WSResponseHeader
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Service | object | Sí | Información del estado del servicio |
CorrelationID | string | Sí | Identificador de correlación de la petición |
Timestamp | datetime | Sí | Marca de tiempo de la respuesta |
WSResponseBody
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Customer | object | Sí | Información del cliente |
Access | object | Sí | Información del canal de acceso |
Customer
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Document_Type | string | Sí | Tipo de documento de identidad |
Document_Number | string | Sí | Número de documento de identidad |
Names | string | Sí | Nombres del cliente |
Lastnames | string | Sí | Apellidos del cliente |
string | Sí | Correo electrónico del cliente |
Access
Campo | Tipo | Obligatorio | Descripción |
---|---|---|---|
Name | string | Sí | Nombre del canal de registro digital |
Creation_Date | datetime | Sí | Fecha de creación del registro en el canal |
Manejo de Errores
Código | Descripción | Ejemplo |
---|---|---|
ERROR_00 | Excepción técnica general | "La solicitud no fue exitosa. Se ha generado una excepción técnica" |
ERROR_03 | No se pudo validar la petición | "La solicitud no fue exitosa. No fue posible validar la petición" |
ERROR_04 | Objetos no acordes a la petición | "La solicitud no fue exitosa. Fueron enviados objetos no acordes a la petición" |
ERROR_06 | No se encontró información válida | "La solicitud no fue exitosa. No se encontró información válida" |
OK_01 | Procesamiento exitoso | "La solicitud fue exitosa" |
Análisis de Componentes
Modelos y Componentes
Modelos base utilizados:
BaseRequest
- Clase base para todas las peticionesBaseResponse
- Clase base para todas las respuestasBotBaseRequestHeader
- Cabecera estándar de peticiónBotBaseResponseHeader
- Cabecera estándar de respuestaBotBaseResponseService
- Información de estado del servicioBotBaseResponseStatusDetail
- Detalles de estado y errores
Utilidades y servicios comunes:
ConfigurationUtil
- Gestión de configuraciones y tipologíasAuditUtil
- Auditoría de transaccionesWhatsAppUtil
- Operaciones específicas de WhatsAppUtil.FillBaseRequest
- Llenado de información base de la petición
Patrones de diseño implementados:
- Singleton Pattern:
WhatsAppBusiness.GetInstance
,WhatsAppUtil.GetInstance
- Template Method: Flujo de procesamiento estándar con regiones
- Factory Pattern: Creación de objetos de respuesta
- Repository Pattern:
CRUD_MDM_REGISTRO_DIGITAL
para acceso a datos
Componentes reutilizados:
- Modelos de respuesta estándar (
BaseResponseGetByPhoneWhatsApp
) - Utilidades de configuración y auditoría
- Clases de base de datos MongoDB (
MDM_REGISTRO_DIGITAL
)
Referencias Cruzadas
- Servicio SOAP equivalente:
/soap/whatsapp/v1/getbyphone
- Servicio de actualización:
whatsapp-v1-update
- Servicio de consulta por nombre:
whatsapp-v1-getbyname
Ejemplos de Request/Response
Solicitud (Request)
{
"WSRequestHeader": {
"System": {
"name": "MAX",
"correlationID": "LUZ-0.16316496738717456",
"processingServer": ""
},
"Property": []
},
"WSRequestBody": {
"Phone": "3052957123",
"Audit": {
"Canal": "whatsapp",
"Date": "2025-07-12",
"Hour": "17:04:20"
}
}
}
Respuesta Exitosa
{
"WSResponseHeader": {
"System": {
"name": "MAX",
"correlationID": "LUZ-0.16316496738717456",
"processingServer": ""
},
"Service": {
"status": "OK",
"responseDate": "2025-07-12T17:04:21.1627351Z",
"processingServer": null,
"statusDetail": [
{
"errorCode": "OK_01",
"errorDetailCode": "Se consulto el cliente de manera exitosa.",
"errorMessage": "La solicitud LUZ-0.16316496738717456 fue exitosa",
"errorMessageUser": null
}
]
},
"Property": []
},
"WSResponseBody": {
"Access": {
"Creation_Date": "2024-06-17T16:15:40.992Z",
"Name": "WhatsApp"
},
"Customer": {
"Document_Number": "1080277123",
"Document_Type": "CC",
"Email": "pruebas@etb.com",
"Names": "Juan",
"Lastnames": "Morales"
}
}
}
Respuesta de Error
{
"WSResponseHeader": {
"Service": {
"Status": "FAIL",
"StatusDetails": [
{
"Code": "ERROR_06",
"Message": "La solicitud no fue exitosa. No se encontró información válida",
"Description": "La solicitud no fue exitosa. No se encontró información válida"
}
]
},
"CorrelationID": "12345678-1234-1234-1234-123456789012",
"Timestamp": "2024-01-15T10:30:01Z"
},
"WSResponseBody": {
"Customer": {
"Document_Type": null,
"Document_Number": null,
"Names": null,
"Lastnames": null,
"Email": null
},
"Access": {
"Name": null,
"Creation_Date": "0001-01-01T00:00:00Z"
}
}
}
Diagramas Técnicos
3.1 Flujo de Datos
graph TD
A[Cliente MAX WhatsApp] --> B[WhatsAppController]
B --> C[Validación de Autenticación]
C --> D[Creación BaseRequest]
D --> E[WhatsAppBusiness.GetByPhone_v1]
E --> F[Auditoría de Entrada]
F --> G[Conversión de Datos]
G --> H[Validación de Parámetros]
H --> I[Obtención de Origen]
I --> J[Consulta MDM_REGISTRO_DIGITAL]
J --> K{¿Registro encontrado?}
K -->|Sí| L[Construcción de Respuesta]
K -->|No| M[Error ERROR_06]
L --> N[Auditoría de Salida]
M --> N
N --> O[BAM - Save_WhatsApp_Get_Phone]
O --> P[Respuesta al Cliente]
3.2 Arquitectura de Clases
classDiagram
class WhatsAppController {
+GetByPhone_v1(BaseRequestGetByPhoneWhatsApp) BaseResponseGetByPhoneWhatsApp
}
class WhatsAppBusiness {
+GetByPhone_v1(BaseRequest, string) BaseResponseGetByPhoneWhatsApp
}
class WhatsAppUtil {
+Get(string) MDM_REGISTRO_DIGITAL
+Update(MDM_REGISTRO_DIGITAL) bool
}
class CRUD_MDM_REGISTRO_DIGITAL {
+Get(string) MDM_REGISTRO_DIGITAL
+Update(MDM_REGISTRO_DIGITAL) bool
}
class MDM_REGISTRO_DIGITAL {
+string Apellidos
+string Nombres
+string Email
+string Numero_Documento
+string Tipo_Documento
+MDM_REGISTRO_DIGITAL_CANAL Canal_Acceso
}
class GetByPhoneWhatsAppResponse {
+GetByPhoneCustomerResponse Customer
+GetByPhoneAccessResponse Access
}
WhatsAppController --> WhatsAppBusiness
WhatsAppBusiness --> WhatsAppUtil
WhatsAppUtil --> CRUD_MDM_REGISTRO_DIGITAL
CRUD_MDM_REGISTRO_DIGITAL --> MDM_REGISTRO_DIGITAL
WhatsAppBusiness --> GetByPhoneWhatsAppResponse
3.3 Secuencia de Ejecución
sequenceDiagram
participant Client as Cliente MAX
participant Controller as WhatsAppController
participant Business as WhatsAppBusiness
participant Util as WhatsAppUtil
participant DB as MongoDB
participant Audit as AuditUtil
Client->>Controller: POST /api/whatsapp/v1/getbyphone
Controller->>Business: GetByPhone_v1(request)
Business->>Audit: Save_Request_Async(entrada)
Business->>Business: Conversión de datos
Business->>Business: Validación de parámetros
Business->>Business: Obtención de origen
Business->>Util: Get(phone)
Util->>DB: Consulta MDM_REGISTRO_DIGITAL
DB-->>Util: Registro digital
Util-->>Business: MDM_REGISTRO_DIGITAL
Business->>Business: Construcción respuesta
Business->>Audit: Save_Request_Async(salida)
Business->>Audit: Save_WhatsApp_Get_Phone
Business-->>Controller: BaseResponseGetByPhoneWhatsApp
Controller-->>Client: JSON Response
Políticas y Consideraciones
Políticas de Seguridad
Mecanismos de autenticación y autorización:
- Autenticación mediante token Bearer en header Authorization
- Validación de origen de petición mediante
ConfigurationUtil.Get_Origin()
- Verificación de permisos por sistema y canal
Validaciones de seguridad implementadas:
- Validación de parámetros de entrada obligatorios
- Sanitización de datos de entrada
- Validación de formato de número de teléfono
- Control de acceso por IP y origen
Límites de tasa (rate limits):
- No se identifican límites específicos de tasa en el código
- Se recomienda implementar rate limiting por IP/origen
SLAs aplicables:
- Tiempo de respuesta esperado: < 2 segundos
- Disponibilidad: 99.9%
- Tolerancia a fallos: Circuit breaker pattern recomendado
Recomendaciones y Mejores Prácticas
Puntos de mejora específicos en el código:
- Manejo de excepciones:
// Actual - Captura genérica
catch (Exception ex)
{
_BotBaseResponse = new BaseResponseGetByPhoneWhatsApp();
_BotBaseResponse.WSResponseHeader.Service.Status = Constants.Error;
_BotBaseResponse.WSResponseHeader.Service.AddStatusDetailItem(
new BotBaseResponseStatusDetail(Constants.ERROR_00, Constants.ERROR_00_Msg, ex.Message),
_BotBaseRequest.CorrelationID);
}
// Recomendado - Captura específica
catch (MongoException ex)
{
// Manejo específico para errores de base de datos
}
catch (ValidationException ex)
{
// Manejo específico para errores de validación
}
- Validación de entrada mejorada:
// Agregar validación de formato de teléfono
if (!Regex.IsMatch(_Request.Phone, @"^\d{10}$"))
{
continuar = false;
_BotBaseResponse.WSResponseHeader.Service.AddStatusDetailItem(
new BotBaseResponseStatusDetail("ERROR_07", "Formato de teléfono inválido"),
_BotBaseRequest.CorrelationID);
}
- Implementación de caché:
// Agregar caché para consultas frecuentes
public async Task<MDM_REGISTRO_DIGITAL> Get(string Phone)
{
string cacheKey = $"whatsapp_registro_{Phone}";
var cached = UtilCacheHelper.GetInstance.Get<MDM_REGISTRO_DIGITAL>(cacheKey);
if (cached != null) return cached;
var result = await CRUD_MDM_REGISTRO_DIGITAL.GetInstance.Get(Phone);
if (result != null)
{
UtilCacheHelper.GetInstance.Set(cacheKey, result, 300); // 5 minutos
}
return result;
}
Optimizaciones posibles:
- Consultas paralelas: Para servicios que requieran múltiples fuentes de datos
- Paginación: Si se requiere consultar múltiples registros
- Compresión: Implementar gzip para respuestas grandes
- Logging estructurado: Mejorar el logging para monitoreo
Consideraciones de mantenimiento importantes:
- Monitoreo: Implementar métricas de rendimiento y disponibilidad
- Logs: Mejorar el logging para debugging y auditoría
- Documentación: Mantener documentación actualizada de cambios
- Testing: Implementar pruebas unitarias y de integración
Sugerencias de seguridad aplicables:
- Rate Limiting: Implementar límites por IP y usuario
- Validación de entrada: Sanitizar todos los parámetros de entrada
- Encriptación: Encriptar datos sensibles en tránsito y reposo
- Auditoría: Mantener logs de auditoría completos
- Monitoreo de seguridad: Implementar alertas para actividades sospechosas
Notas Adicionales
- El servicio está diseñado para ser escalable y mantener alta disponibilidad
- Se recomienda implementar health checks para monitoreo de salud del servicio
- Considerar implementar versionado de API para futuras actualizaciones
- Mantener compatibilidad con el servicio SOAP equivalente