Índice
Fundamentos
Conectar y enviar
Producción
Escala, Coste y Preguntas Frecuentes
Guía de la API de WhatsApp en PHP
API de WhatsApp con PHPLa Guía de Integración Completa
Llamadas con Guzzle y cURL para conectar una cuenta de WhatsApp, enviar y recibir mensajes, administrar grupos y ejecutar todo esto dentro de un Laravel aplicación, sin registrar una aplicación de Meta Business. Esta es la API de WhatsApp en PHP de extremo a extremo: conexión, webhooks, SaaS multiinquilino y el costo real por mensaje.
Sin verificación de Meta Business
Guzzle y cURL, sin SDKs abandonados
usar GuzzleHttp\Client;
$client = new Cliente([
'base_uri' => 'https://api1.unipile.com:13111',
'headers' => ['X-API-KEY' => $apiKey],
]);
// Proveedor WHATSAPP: sin aplicación Meta, sin WABA
$res = $client->Correo electrónico:('/api/v1/accounts', [
'json' => ['provider' => 'WHATSAPP'],
]);201 Creado, account_id devuelto
Mismo patrón para
Definición
¿Qué es la API de WhatsApp en PHP?
En API de WhatsApp en PHP es la práctica de llamar a una API REST de WhatsApp desde un entorno de ejecución de PHP, PHP-FPM, un script CLI o un trabajador de colas, utilizando un cliente HTTP como Guzzle o cURL. No existe una API de WhatsApp creada específicamente para PHP: Meta y los proveedores de API exponen JSON plano sobre HTTPS, y PHP es simplemente el lenguaje que realiza la solicitud, de la misma manera que lo haría con cualquier otra API web.
En la práctica, una integración de la API de WhatsApp con PHP es una llamada HTTP normal: un método, una URL, un cuerpo JSON o multipart, y un
X-API-KEY header. Nada aquí depende de una función exclusiva de PHP ni de un endpoint exclusivo de PHP. Lo que cambia entre Cloud API, un Proveedor de Soluciones Empresariales (BSP) y una cuenta vinculada no es el idioma, sino quién es el propietario del número de WhatsApp y si la verificación de Meta Business se encuentra entre usted y su primer mensaje. Para ver el desglose completo de ese ecosistema, consulte la Guía de integración de la API de WhatsApp.JSON simple a través de HTTPS
Cada llamada es un ciclo de solicitud/respuesta que Guzzle o cURL ya saben cómo realizar.
La autenticación es una cabecera estática
En
X-API-KEY valor, sin baile de OAuth, ni bucle de actualización de tokens que escribir.Independiente del motor de ejecución
Funciona igual en PHP-FPM, un comando de consola de Symfony o un trabajo de cola de Laravel.
Decisión
¿Qué API de WhatsApp debes usar desde PHP?
Hay tres formas de llamar a WhatsApp desde un backend de PHP: API en la nube de Meta directamente, a Proveedor de soluciones empresariales reventa de acceso al mismo, o un cuenta vinculada a través de una API unificada como Unipile. Las tres devuelven JSON que tu código PHP procesa de la misma manera; lo que cambia es el tiempo de configuración, si la verificación de Meta Business se interpone antes de tu primer mensaje, y si obtienes un historial de conversación existente یا empiezas desde cero.
Criterios
API en la nube (directa)
BSP
Cuenta vinculada
Verificación comercial de Meta
Requerido
Requerido
No es necesario
Tiempo hasta el primer mensaje
Días a algunas semanas
Incorporación más rápida, mismos requisitos subyacentes
Actas
Número de teléfono
Nuevo número registrado en una WABA
Nuevo número proporcionado por el BSP
El propio número de WhatsApp del usuario
Acceso a las conversaciones existentes
No, empieza vacío
No, empieza vacío
Sí, historial completo
Mejor ajuste
Un número de empresa que transmite a muchos clientes
Lo mismo, con una capa de incorporación gestionada
Un producto en el que cada usuario vincula la cuenta de WhatsApp que ya tiene
Si tu aplicación PHP es un producto SaaS donde cada cliente conecta su propio WhatsApp, una cuenta vinculada elimina por completo el paso de verificación de Meta. Si estás haciendo difusiones desde un solo número de empresa, la API de Cloud o un BSP son el punto de partida correcto en su lugar.
Construir con una cuenta vinculada Configurar
¿Qué necesitas antes de escribir cualquier código PHP?
Necesitas PHP 8.1 o más reciente, Compositor, la Guzzle Cliente HTTP y una clave de API de Unipile. Actualmente no existe un SDK de PHP mantenido activamente para Unipile, por lo que todos los ejemplos de esta guía se comunican con
/api/v1 API REST directamente.PHP 8.1+
Las propiedades tipadas y los argumentos con nombre permiten que el código del cliente sea conciso.
Compositor
Gestor de dependencias estándar, necesario para incluir Guzzle.
Guzzle 7
Cliente HTTP para peticiones JSON y multipart, con un sistema alternativo (fallback) de cURL.
Clave de API de Unipile
Enviado como
X-API-KEY en cada solicitud, generada desde tu panel.composer require guzzlehttp/guzzle:^7.0¿Hay un SDK de PHP? No uno que debas instalar.
Un paquete comunitario,
unipile/unipile-php-sdk, existe en Packagist, pero figura como abandonado: sin commits desde el 17 de octubre de 2023, 5 estrellas en GitHub, y apunta a una URL base de API antigua. No ejecutar composer require unipile/unipile-php-sdk. El SDK de Node.js (unipile-node-sdk) se mantiene oficialmente y está actualizado, pero para PHP, Guzzle directamente contra la REST API es el camino confiable, y es lo que usa cada ejemplo a continuación. Ver La documentación de Guzzle para las opciones de cliente utilizadas aquí.Implementación
¿Cómo se conecta una cuenta de WhatsApp desde PHP?
Conectar una cuenta de WhatsApp desde PHP toma uno
POST solicitud con el proveedor establecido en WHATSAPP, luego una acción del usuario: el usuario final escanea el código QR devuelto desde WhatsApp > Dispositivos vinculados, o escribe un código de emparejamiento en su teléfono si solicitó uno en su lugar. Sin aplicación de desarrollador de Meta, sin WABA, sin paso de verificación.1
Solicitar un punto de control, código QR por defecto
Llamar al endpoint de cuentas solo con
provider set. Unipile devuelve un account_id más una carga útil de punto de control creada para el flujo QR.$response = $client->Correo electrónico:('/api/v1/accounts', [
'json' => ['provider' => 'WHATSAPP'],
]);
$payload = json_decode($response->obtenerCuerpo()->obtenerContenido(), true);
$accountId = $payload['id_cuenta'];
// $payload también transporta el punto de control que se va a renderizar en el
el código QR para escanear desde WhatsApp > Vinculados
// dispositivos. var_dump($payload) vuelve a comprobarlo con tu propia clave
// para ver la forma exacta antes de conectar el frontend.2
O solicita un código de emparejamiento en su lugar
Pasar
vinculación_de_número_de_teléfono en dígitos E.164, sin signo más, cuando escanear un código QR no es práctico, por ejemplo, un agente de soporte incorporando a un cliente por teléfono.$response = $client->Correo electrónico:('/api/v1/accounts', [
'json' => [
'provider' => 'WHATSAPP',
'pairing_phone_number' => '33612345678',
],
]);
$payload = json_decode($response->obtenerCuerpo()->obtenerContenido(), true);
$accountId = $payload['id_cuenta'];
// El punto de control aquí es el código que tu interfaz de usuario muestra al usuario
// para escribir en WhatsApp > Dispositivos vinculados > Vincular con
// número de teléfono en su lugar.3
Consultar periódicamente hasta que la cuenta esté completamente vinculada
La cuenta permanece en
CONECTAR estado hasta que se escanee el código QR o se introduzca el código de emparejamiento. Comprobar sources[0].status a cuenta.$response = $client->consiga(""/api/v1/accounts/{$accountId}"");
$account = json_decode($response->obtenerCuerpo()->obtenerContenido(), true);
$status = $account['fuentes'][0]['estado'] ?? null;
si ($status === OK) {
// Se puede enviar, recibir y ver la lista de chats de forma segura en $accountId
}Las consultas en bucle funcionan pero desperdician solicitudes. Si tu aplicación PHP ya tiene un punto de conexión de webhook, registra uno con
estado de la cuenta" en su lugar y reacciona en el momento en que el estado cambie a OK. La configuración del propio webhook se detalla más adelante para los mensajes entrantes; el mismo endpoint acepta eventos de estado de la cuenta.Flujo principal
¿Cómo se envía un mensaje de WhatsApp con PHP y Guzzle?
Enviar un mensaje desde PHP es uno
POST al endpoint de mensajes del chat con un text campo en un cuerpo multipart. La llamada devuelve un id_de_mensaje en cuanto WhatsApp lo acepte.$response = $client->Correo electrónico:(""/api/v1/chats/{$chatId}/messages"", [
'multipart' => [
['nombre' => texto, 'contenido' => '¡Hola! Tu pedido ha sido enviado.'],
],
]);
$result = json_decode($response->obtenerCuerpo()->obtenerContenido(), true);
$messageId = $result['id_mensaje'];Lo mismo
multiparte el arreglo también lleva archivos adjuntos, a mensaje_voz archivo, o un id_de_cita para responder a un mensaje específico, Guzzle los adjunta como campos multiparte adicionales junto a text. Para un desglose completo de cada tipo de mensaje que admite la API de WhatsApp, incluidas las plantillas y la ventana de servicio de 24 horas, consulte nuestra guía dedicada.Flujo principal
¿Cómo se inicia una nueva conversación desde PHP?
Iniciar una conversación que aún no existe significa llamar al punto de conexión de chats con
account_id y un attendees_ids matriz en lugar de una existente chat_id. Unipile crea el chat y, si incluyes un text campo, envía el primer mensaje en la misma llamada.$response = $client->Correo electrónico:('/api/v1/chats', [
'multipart' => [
['nombre' => 'id_cuenta', 'contenido' => [$accountId],
['nombre' => 'attendees_ids[]', 'contenido' => '33612345678@s.whatsapp.net'],
['nombre' => texto, 'contenido' => 'Hola, soy el servicio de soporte de Acme.'],
],
]);
$result = json_decode($response->obtenerCuerpo()->obtenerContenido(), true);
$chatId = $result['chat_id'];El destinatario se identifica mediante
{phone_number}@s.whatsapp.net, dígitos internacionales, sin signo más al principio, sin espacios. Almacenar el devuelto chat_id junto a ese registro de usuario: cada mensaje posterior al primero pasa por el endpoint de mensajes de la sección anterior, no por este.Flujo principal
¿Cómo se recuperan los chats y mensajes en PHP?
La mayoría de los tutoriales de la API de WhatsApp se quedan en el envío. Un backend en PHP normalmente también necesita listar las conversaciones existentes de un usuario, paginar a través de su historial y ver quién está en un chat. Tres puntos finales lo cubren:
GET /api/v1/chats, GET /api/v1/chats/{chat_id}/messagesy GET /api/v1/chats/{chat_id}/attendees, todas paginadas con un cursor.Listar todos los chats de WhatsApp en una cuenta
$response = $client->consiga('/api/v1/chats', [
'query' => [
''account_id' => $accountId,
'tipo_de_cuenta' => 'WHATSAPP',
'limit' => 50,
],
]);
$data = json_decode($response->obtenerCuerpo()->obtenerContenido(), true);
$chats = $data['artículos'];
$nextCursor = $data['cursor'];Examinar el historial de un chat
$cursor = null;
$all = [];
hacer {
$res = $client->consiga(""/api/v1/chats/{$chatId}/messages"", [
'query' => array_filter(['cursor' => $cursor, 'límite' => 100]),
]);
$page = json_decode($res->obtenerCuerpo()->obtenerContenido(), true);
$all = array_merge($all, $page['artículos']);
$cursor = $page['cursor'];
} mientras ($cursor !== null);Cada extremo de lista sigue el mismo contrato de cursor: pasa el de la respuesta anterior
cursor retrocede, detente cuando vuelva null. Para ver quién está realmente en una conversación, llame GET /api/v1/chats/{chat_id}/attendeesdevuelve el de cada participante id, proveedor_id y el nombre para mostrar, que es lo que necesitas antes de poder llamar agregarParticipante o eliminarParticipante en un grupo más adelante en esta guía.Producción
¿Cómo se reciben los mensajes de WhatsApp con un webhook de PHP?
Un webhook de WhatsApp en PHP es un punto final HTTPS público al que Unipile llama con una carga útil JSON en eventos como
mensaje_recibido. Tu script lee el cuerpo sin procesar, confirma que la llamada es genuina, responde rápidamente y delega el trabajo real a una cola. Sondeo GET /api/v1/chats funciona para nuevos mensajes en una demostración, pero no para un producto con más de un puñado de usuarios.1. Registrar el webhook, con un secreto compartido en un encabezado personalizado
$client->Correo electrónico:('/api/v1/webhooks', [
'json' => [
'origen' => 'mensajería',
'request_url' => 'https://example.com/webhooks/whatsapp',
'eventos' => ['mensaje_recibido'],
'headers' => [
['clave' => 'X-Webhook-Secret', 'valor' => [$webhookSecret],
],
],
]);2. Verificar, responder y luego procesar
$rawBody = file_get_contents('php://entrada');
$provided = $_SERVER['HTTP_X_WEBHOOK_SECRET'] ?? '';
si (!hash_equals($expectedSecret, $provided)) {
código_de_respuesta_http(401);
salir;
}
código_de_respuesta_http(200);
si (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
$payload = json_decode($rawBody, true);
si (($payload['evento'] ?? null) === 'mensaje_recibido') {
// insertar la carga útil $ en una tabla de cola o en una lista de Redis,
// nunca proceses un webhook en línea
poner_en_cola_mensaje_de_whatsapp($payload);
}Unipile no firma el cuerpo del webhook con un secreto HMAC que tú recalculas, el endpoint create-webhook expone
cabeceras matriz en su lugar. Adjunte su propio secreto como una cabecera personalizada cuando registre el webhook, luego verifíquelo con hash_equals(), una comparación de cadenas segura frente a temporización, antes de confiar en la carga útil. Cada campo en $payload, account_id, tipo_de_cuenta, evento, chat_id, id_de_mensaje, message y remitente.id_proveedor_asistente, coincide con los documentos JSON de Unipile para el webhook de mensajería.Producción
¿Cómo se integra la API de WhatsApp en una aplicación de Laravel?
Laravel reemplaza tres cosas de los ejemplos de PHP puro anteriores: el
Http una fachada en lugar de un cliente Guzzle hecho a mano, un trabajo en cola en lugar de procesamiento en línea, y una ruta más un controlador en lugar de análisis php://input a mano. Las llamadas de WhatsApp que aparecen a continuación son idénticas a todos los ejemplos que ya hay en esta guía.1. ConfiguraciónUna entrada en services.php, valores desde .env
return [
// ...servicios existentes
'unipile' => [
'base_uri' => env('UNIPILE_BASE_URI', 'https://api1.unipile.com:13111'),
'api_key' => env('UNIPILE_API_KEY'),
'secreto_de_webhook' => env('UNIPILE_WEBHOOK_SECRET'),
],
];2. Una clase de servicio delgada sobre la fachada Http
espacio de nombres App\Services;
usar Illuminate\Support\Facades\Http;
clase ServicioDeWhatsapp
{
protegido función client()
{
return Http::baseUrl(configuración('services.unipile.base_uri'))
->conCabeceras(['X-API-KEY' => configuración('servicios.unipile.api_key')]);
}
público función sendMessage(cadena $chatId, cadena $text): matriz
{
return $esto->client()
->comoMultipartes()
->Correo electrónico:(""/api/v1/chats/{$chatId}/messages"", [
['nombre' => texto, 'contenido' => $text],
])
->json();
}
}3. Controlador de rutas y webhooks
Route::Correo electrónico:('/webhooks/whatsapp', [WhatsappWebhookController::clase, 'mango']);public function handle(Request $request)
{
$provided = $request->header('X-Webhook-Secret', '');
if (!hash_equals(config('services.unipile.webhook_secret'), $provided)) {
abort(401);
}
if ($request->input('event') === 'message_received') {
ProcessWhatsappMessage::dispatch($request->all());
}
return response()->json(['status' => 'received']);
}4. Un trabajo en cola, para que la ruta del webhook se mantenga rápida
clase ProcesarMensajeDeWhatsapp implementa ShouldQueue
{
usar Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
público función __construct(público matriz $payload) {}
público función mango(): vacío
{
// buscar el inquilino mediante $this->payload['account_id'],
// almacenar el mensaje, notificar al usuario correcto
}
}La ruta nunca toca Guzzle directamente, pasa a través de
Constrúyelo en Laravel ServicioDeWhatsapp, lo que hace que las llamadas de WhatsApp se puedan simular en las pruebas de la misma manera que cualquier otra integración HTTP de Laravel. Ver Documentación del cliente HTTP de Laravel para falsificar estas solicitudes en tu conjunto de pruebas.Producción
¿Cómo se administran los grupos de WhatsApp desde PHP?
Gestionar un grupo de WhatsApp desde PHP es un único
PATCH llamada al endpoint de chat con un acción campo agregarParticipante, eliminarParticipanteo obtenerEnlaceDeInvitacion. La propia función de grupos de la Cloud API de Meta limita un grupo a 8 participantes y no expone ningún extremo para agregar a alguien directamente, solo un enlace de invitación para compartir.Agregar un participante
$client->parche(""/api/v1/chats/{$groupChatId}"", [
'json' => [
'acción' => 'agregarParticipante',
'value' => '33612345678@s.whatsapp.net',
],
]);Obtener el enlace de invitación
$res = $client->parche(""/api/v1/chats/{$groupChatId}"", [
'json' => ['action' => 'obtenerEnlaceDeInvitación'],
]);
$link = json_decode($res->obtenerCuerpo()->obtenerContenido(), true)['enlace_de_invitación'];eliminarParticipante adopta la misma forma que agregarParticipante, con el id de WhatsApp del participante en valor. Esta es la única acción que la propia API de Grupos de Meta no expone en absoluto, añadir a alguien ocurre únicamente a través del enlace de invitación por su parte. Para conocer cada límite, el tope de 10.000 grupos por número y lo que aún no es compatible, consulte el API de grupos de WhatsApp referencia.Escala
¿Cómo manejas muchas cuentas de usuario desde una sola aplicación PHP?
Un producto SaaS en PHP no tiene una cuenta de WhatsApp, tiene una por cliente. Hay un solo Unipile
X-API-KEY para toda su aplicación, pero un distinto account_id por cada usuario final que vincule su WhatsApp. El patrón es almacenar eso account_id junto a la fila de tu propio inquilino, y pásalo explícitamente en cada llamada que de otro modo podría cruzar cuentas.// Dentro del controlador del webhook: encuentra a qué inquilino pertenece
// el mensaje pertenece a antes de hacer nada con él.
$stmt = $pdo->preparar('SELECT id FROM tenants WHERE unipile_account_id = ?');
$stmt->ejecutar([$payload['id_cuenta']]);
$tenantId = $stmt->recuperarColumna();
si ($tenantId === falso) {
// cuenta_id desconocida, rechazar en lugar de adivinar el inquilino
código_de_respuesta_http(404);
salir;
}
// Salida: pasar account_id para que un chat_id obsoleto o reutilizado pueda
// nunca envíes a través del número de WhatsApp del inquilino equivocado.
$client->Correo electrónico:(""/api/v1/chats/{$chatId}/messages"", [
'multipart' => [
['nombre' => texto, 'contenido' => $text],
['nombre' => 'id_cuenta', 'contenido' => [$expectedAccountId],
],
]);Lo opcional
account_id el campo en el endpoint de mensajes existe específicamente para evitar el envío en un chat fuera de esa cuenta, trátalo como obligatorio en una base de código multiinquilino aunque la API no lo requiera. Cifra el almacenamiento account_id valores en reposo como cualquier otra credencial de cliente: no son secretos por sí solos, pero son la clave de unión entre su tabla de usuarios y las conversaciones reales de WhatsApp de alguien.Trampas
¿Cuáles son los errores más comunes específicos de PHP?
La mayoría de los errores de la API de WhatsApp en una base de código PHP provienen del propio PHP, no de la API. Estos cinco aparecen repetidamente en integraciones en producción.
Truncar un mensaje con substr() en lugar de mb_substr()
de PHP
subcadena() cuenta bytes, no caracteres. Un emoji es una secuencia UTF-8 de varios bytes, córtalo por la mitad y enviarás un carácter roto o un JSON inválido. Utiliza siempre las funciones multibyte en el texto de WhatsApp generado por el usuario.$safe = mb_substr($text, 0, 4096, 'UTF-8');Error cURL 60 en Windows y XAMPP
"Problema con el certificado SSL: no se puede obtener el certificado del emisor local. Las compilaciones de PHP para Windows y XAMPP a menudo se distribuyen sin un paquete de CA actual configurado en php.ini, por lo que las llamadas HTTPS de Guzzle fallan aunque el código sea correcto.
curl.cainfo = "C:\php\extras\cacert.pem"
openssl.cafile = "C:\php\extras\cacert.pem"max_execution_time está matando el webhook antes de que responda
Un valor predeterminado de 30 segundos es más que suficiente hasta que el gestor realiza una llamada saliente lenta antes de responder. Si Unipile no recibe una respuesta rápida, lo reintenta, y un gestor lento empieza a procesar el mismo mensaje dos veces. Responda primero, trabaje después, como se muestra en la sección de webhooks anterior.
Sin retroceso en respuestas 429 o 5xx
Un ajuste apretado
mientras El bucle que se reintenta inmediatamente en caso de fallo convierte un límite de velocidad en una interrupción autoinfligida. Espera, y aumenta el tiempo de espera en cada fallo consecutivo.para ($attempt = 1; $attempt <= 5; $attempt++) {
intentar {
return $client->Correo electrónico:($uri, $options);
} captura (ConnectException | ServerException $e) {
suspender((2 ** $attempt) * 100_000); // 0,2s, 0,4s, 0,8s...
}
}Registrar la respuesta sin procesar y llamarlo depuración
Si construyes un cuerpo JSON a mano en lugar de dejar que Guzzle
json opción manejarlo, agregar JSON_UNESCAPED_UNICODE a json_encode(). Sin él, los emojis y los nombres con acentos aparecen escapados \u secuencias en tus registros, que es JSON técnicamente válido pero ilegible cuando estás intentando depurar una conversación real.Coste
¿Cuánto cuesta enviar mensajes de WhatsApp desde PHP?
Nada en el código PHP cambia el precio. Meta cobra por mensaje desde el 1 de julio de 2025, no por conversación. Lo único que controla tu código es el tiempo: una respuesta de formato libre solo puede enviarse dentro de la ventana de servicio de 24 horas después del mensaje de un usuario y, desde el 1 de octubre de 2026, solo es gratuita para los primeros 1.000 mensajes de servicio por número cada mes.
Plantillas de utilidades y autenticación se facturan en cada entrega desde el 1 de octubre de 2026, dentro o fuera de la ventana de servicio.
Plantillas de marketing se facturan independientemente de la ventana.
Las tarifas por mensaje varían según el país de destino y la categoría del mensaje, no según la biblioteca de cliente con la que los envíes.
Marca con una marca de tiempo cada mensaje entrante que reciba tu webhook de PHP y mantén un valor de "ventana abierta hasta" por conversación, esa es la única entrada que realmente necesita tu lógica de facturación. Para el actual precios de WhatsApp por mensaje por país y categoría, vea el desglose completo de precios.
API de WhatsApp con PHP - Preguntas frecuentes
Respuestas directas sobre la conexión, el envío, Laravel y el SDK de PHP abandonado.
Cree un cliente Guzzle apuntando a la API REST de Unipile, llame
POST /api/v1/accounts con proveedor WHATSAPP para obtener un código QR o código de emparejamiento, haga que el usuario lo complete en su teléfono, luego use el mismo cliente para GET, POST y PATCH llamadas para enviar mensajes, listar chats y administrar grupos. No hay ningún endpoint específico de PHP, cada llamada es una petición HTTP normal con un X-API-KEY encabezado. El conectar una cuenta de WhatsApp la sección anterior explica el código exacto.Sí. Uno
POST a /api/v1/chats/{chat_id}/mensajes with a text campo en un cuerpo multipart envía el mensaje y devuelve un id_de_mensaje, vea el enviar sección arriba para ver la llamada exacta de Guzzle.Solo si utilizas directamente la API en la nube de Meta o un Proveedor de Soluciones Empresariales construido sobre ella. Conectar una cuenta de WhatsApp a través de Unipile vincula el número de WhatsApp existente del usuario mediante un código QR o un código de emparejamiento y no requiere ninguna verificación de Meta Business.
No hay ninguno mantenido activamente. Un paquete de la comunidad,
unipile/unipile-php-sdk, está en Packagist pero marcado abandonado, sin confirmaciones desde el 17 de octubre de 2023 y con 5 estrellas en GitHub. Todos los ejemplos de esta guía llaman directamente a la API REST a través de Guzzle, que es también lo que el SDK abandonado hacía internamente.No puedes recibir webhooks sin una URL HTTPS públicamente accesible, así es como funcionan las devoluciones de llamada HTTP. Durante el desarrollo local, crea un túnel para un puerto local con un servicio como ngrok y apunta el webhook hacia
URL_solicitud en la dirección HTTPS del túnel. Consultando el punto de acceso de mensajes es el recurso alternativo cuando un punto de conexión público realmente no es posible, a costa de latencia y solicitudes adicionales.Sí, nada de eso es específico de ningún framework. El Sección de Laravel lo anterior envuelve las llamadas equivalentes a Guzzle en el
Http fachada, un trabajo en cola, y una ruta y controlador de webhook, cuál es la forma idiomática de estructurarlo en una base de código de Laravel.Sí, esa es la estructura habitual de SaaS. Una clave de API de Unipile cubre toda la aplicación, mientras que cada usuario final obtiene la suya propia.
account_id después de conectar su WhatsApp. Almacene ese ID junto con su registro de inquilino y transítalo en llamadas salientes para evitar envíos entre inquilinos, consulte el sección multiinquilino arriba.PATCH /api/v1/chats/{chat_id} con {"action": "addParticipant", "value": "@s.whatsapp.net"}. La propia función de grupos de la Cloud API de Meta no tiene un punto de enlace equivalente, solo un enlace de invitación, lo cual es una de las diferencias más claras entre desarrollar directamente en Meta y hacerlo a través de Unipile. Los detalles en el sección de grupos arriba.Casi siempre porque una cadena fue truncada con
subcadena() en vez de mb_substr(). Las funciones de cadena nativas de PHP cuentan bytes, y un emoji es una secuencia UTF-8 de varios bytes; si se corta por la mitad, se convierte en un carácter no válido o corrompe por completo la carga útil JSON.Guzzle es suficiente, es un cliente HTTP construido sobre la extensión cURL de PHP, no un reemplazo para ella. Cada solicitud en esta guía utiliza Guzzle; un crudo
curl_init() call funciona de forma idéntica si un proyecto no puede añadir la dependencia, los cuerpos JSON y multipart son iguales en ambos casos.Lo mismo que enviarlo de cualquier otra forma. Meta cobra por mensaje desde el 1 de julio de 2025, según la categoría y el país del destinatario, no según la biblioteca de cliente utilizada para llamar a la API. Véase el sección de costos por encima y el guía de precios completa para consultar las tarifas actuales.
Sí, no va a desaparecer, determina cuándo se puede enviar una respuesta de formato libre en lugar de una plantilla facturada. Una respuesta dentro de la ventana de 24 horas posterior al último mensaje de un usuario cuenta dentro de los 1.000 mensajes de servicio gratuitos por número cada mes, el código PHP que ignora la ventana simplemente paga por plantillas que no necesitaba.
¿Todavía tienes preguntas sobre cómo construir esto en PHP? Nuestro equipo está aquí para ayudar.
Guía de la API de WhatsApp en PHP
¿Listo para integrar la API de WhatsApp en tu aplicación de PHP?
Cada endpoint de esta guía, connect, send, receive, groups, se ejecuta en la misma cuenta de Unipile que puedes crear ahora mismo. Sin verificación de Meta Business, sin SDK abandonado, simplemente
Guzzle y una API REST que tu aplicación de PHP ya sabe cómo llamar.¿Automatizar en lugar de integrar en una aplicación existente? Leer la misma integración en Python.