---
title: "SDK de PHP para WhatsApp, Instagram y Messenger: los tres canales en 15 líneas"
description: "El SDK oficial de PHP de WAME envía mensajes en WhatsApp, Instagram y Messenger con la misma llamada — solo cambia el provider. Instalación con Composer, envío de texto y archivos, y el parser de webhook que ya viene listo."
url: "https://wame.api.br/blog/sdk-php-whatsapp-instagram-messenger"
language: "pt-BR"
og:type: "article"
published_time: "2026-09-10"
modified_time: "2026-09-10"
author: "Raphael Serafim"
keywords: "sdk php whatsapp, api whatsapp php, librería whatsapp php, enviar whatsapp php, whatsapp laravel, composer whatsapp api"
reading_time: "9 min de lectura"
---

# SDK de PHP para WhatsApp, Instagram y Messenger: los tres canales en 15 líneas

> El SDK oficial de PHP de WAME envía mensajes en WhatsApp, Instagram y Messenger con la misma llamada — solo cambia el provider. Instalación con Composer, envío de texto y archivos, y el parser de webhook que ya viene listo.

**PHP mueve buena parte de los sistemas de gestión hechos en América Latina.** ERP, sistema de clínica, control de taller, portal inmobiliario — mucho de lo que funciona y factura está escrito en PHP. Y el cliente de esos sistemas quiere WhatsApp adentro.

Esta guía va desde cero hasta recibir mensajes, con los tres canales.

## Instalación

```bash
composer require raphaelvserafim/client-php-api-wa-me
```

```php
<?php
require 'vendor/autoload.php';

use Api\Wame\Wame;

$wa = new Wame([
    'server' => 'https://server.api-wa.me',
    'key'    => 'YOUR_INSTANCE_KEY',
]);
```

La key sale del panel al crear la instancia. Guárdala en el `.env` como cualquier credencial — nunca en el código versionado.

## El primer mensaje

```php
$to = "525512345678";   // internacional, solo dígitos

$result = $wa->message->sendText($to, "Tu pedido #1042 salió para entrega 🚚");

if ($result) {
    $data = json_decode($result);
    echo "¡Enviado! ID: " . $data->data->key->id;
} else {
    echo "Falló el envío.";
}
```

Esas son las 15 líneas del título, `composer require` incluido.

Guarda el `key->id` que devuelve: es el que aparece en el webhook de estado de entrega, y es por él que unes "envié" con "se entregó".

## Los tres canales, la misma llamada

Aquí está la diferencia que suele decidir la elección del proveedor. El provider puede valer para todo el cliente:

```php
use Api\Wame\Provider;

$wa = new Wame([
    'server'   => 'https://server.api-wa.me',
    'key'      => 'YOUR_INSTANCE_KEY',
    'provider' => Provider::INSTAGRAM,
]);

$wa->message->sendText('IG_USER_ID', '¡Hola! Vi que comentaste en la publicación.');
```

O por mensaje:

```php
$wa->message->sendText('525512345678', 'Hola', Provider::WHATSAPP);
$wa->message->sendText('IG_USER_ID',   'Hola', Provider::INSTAGRAM);
$wa->message->sendText('PSID',         'Hola', Provider::MESSENGER);
```

Mismo método, misma firma, mismo manejo de errores. No son tres integraciones: es [una instancia cubriendo los tres canales](/blog/api-instagram-messenger-misma-api-whatsapp).

## Más allá del texto

```php
// Imagen por URL pública
$wa->message->sendImage($to, 'https://ejemplo.com/factura.jpg', 'Tu factura');

// Documento
$wa->message->sendDocument($to, 'https://ejemplo.com/recibo.pdf', 'recibo-octubre.pdf');

// Audio
$wa->message->sendAudio($to, 'https://ejemplo.com/audio.mp3');
```

Para botones y menús de lista, [cómo enviar mensajes por la API](/blog/como-enviar-mensajes-whatsapp-api) tiene los formatos completos.

## Recibir: configurar el webhook

```php
$wa->instance->updateWebhook([
    'allowWebhook'   => true,
    'allowNumber'    => 'all',
    'webhookFormat'  => 'meta',
    'webhookMessage' => 'https://tusistema.com/webhook/wame',
]);
```

El `webhookFormat => 'meta'` importa: es lo que hace que los eventos lleguen en el sobre estándar de la Cloud API, el mismo para los tres canales.

## Recibir: el parser incluido

Sin SDK tendrías que navegar el JSON anidado a mano y escribir las guardas que le faltan a la primera versión de todo el mundo. El SDK ya lo hace:

```php
<?php
require 'vendor/autoload.php';

use Api\Wame\Wame;

// Responde 200 ANTES de procesar. Un webhook que tarda se reenvía,
// y el cliente recibe la misma respuesta dos o tres veces.
http_response_code(200);
header('Content-Type: application/json');
echo '{"ok":true}';

if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();   // devuelve al cliente y sigue procesando
}

$payload = json_decode(file_get_contents('php://input'), true);
$msg = Wame::parseMeta($payload);

// Los estados de entrega también caen aquí. Sin esta guarda,
// el sistema termina respondiéndose a sí mismo.
if (!$msg || $msg['type'] !== 'text') {
    exit;
}

registrarEnSistema([
    'canal'     => $msg['provider'],   // whatsapp | instagram | messenger
    'de'        => $msg['from'],
    'texto'     => $msg['text'],
    'messageId' => $msg['id'],
]);
```

El `fastcgi_finish_request()` es el detalle que separa a quien ya se golpeó de quien se va a golpear: en PHP-FPM devuelve la respuesta HTTP y sigue ejecutando en segundo plano. Sin eso, el webhook queda abierto durante todo el procesamiento y la plataforma reenvía por timeout.

## En Laravel

Nada especial — es un paquete Composer:

```php
// config/wame.php
return [
    'server' => env('WAME_SERVER', 'https://server.api-wa.me'),
    'key'    => env('WAME_KEY'),
];

// AppServiceProvider::register()
$this->app->singleton(Wame::class, fn () => new Wame([
    'server' => config('wame.server'),
    'key'    => config('wame.key'),
]));
```

Y el webhook como una ruta normal, con el procesamiento en un Job para responder rápido:

```php
Route::post('/webhook/wame/{secreto}', function (Request $req, string $secreto) {
    abort_unless(hash_equals(config('wame.webhook_secret'), $secreto), 404);

    ProcesarMensajeWame::dispatch($req->all());
    return response()->json(['ok' => true]);   // 200 ya; el Job procesa después
});
```

El secreto en la ruta es la protección mínima: sin él, cualquiera que descubra la URL puede publicar eventos falsos.

## Cuando el SDK no es el camino

Si tu sistema es PHP heredado sin Composer, o solo necesitas un envío puntual, la API REST resuelve con `curl` puro:

```php
$ch = curl_init("https://server.wame.api.br/TU_KEY/message/text");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode(['to' => $to, 'text' => '¡Hola!']),
]);
$res = curl_exec($ch);
```

La misma API por detrás. El SDK ahorra el boilerplate y el parser; no es obligatorio.

## Conclusión

Poner WhatsApp en un sistema PHP es `composer require` más 15 líneas. Lo que antes era un proyecto —app en Meta, verificación de negocio, tres integraciones para tres canales— [ya no está en el camino](/blog/whatsapp-business-api-oficial-que-es).

Si trabajas en Node, el [SDK de JavaScript y TypeScript](/blog/sdk-javascript-typescript-whatsapp) cubre el mismo terreno con tipado completo.

La referencia completa está en [docs/sdk/php](/docs/sdk/php).

## Perguntas frequentes

### ¿Cómo instalo el SDK de PHP de WAME?

Con Composer: composer require raphaelvserafim/client-php-api-wa-me. Después basta con instanciar la clase Wame indicando el servidor y la key de la instancia. No depende de ninguna extensión exótica y funciona en cualquier PHP moderno, con o sin framework.

### ¿El SDK de PHP funciona con Laravel?

Sí. Es un paquete Composer común, sin service provider obligatorio. Puedes instanciarlo donde lo necesites o registrarlo como singleton en el contenedor, guardando la key en el config y el .env como cualquier otra credencial.

### ¿Puedo enviar a Instagram y Messenger con el mismo SDK?

Sí, y con el mismo método. El provider se define una vez al crear el cliente, valiendo para todas las llamadas, o se pasa por mensaje como último argumento. El código de envío es idéntico en los tres canales.

### ¿Cómo recibo mensajes en PHP?

Configura el webhook de la instancia con webhookFormat en 'meta' y apúntalo a un endpoint tuyo. El SDK trae el parser parseMeta(), que lee el sobre de la Cloud API y devuelve los campos ya extraídos, sin navegar el JSON anidado a mano.

### ¿Necesito un servidor propio?

Para enviar, no: cualquier script PHP con acceso a internet basta, incluso un hosting compartido. Para recibir mensajes sí necesitas una URL pública con HTTPS, porque el webhook es una petición que llega desde afuera hasta tu código.
