Inicio Rápido
Envía tu primer mensaje de WhatsApp en menos de 5 minutos.
Prerequisitos
Asegúrate de haber completado la instalación del paquete.
1. Configurar Credenciales
Obtén tus credenciales de la consola de Meta for Developers:
# .env
WHATSAPP_API_URL=https://graph.facebook.com
WHATSAPP_API_VERSION=v21.0
WHATSAPP_VERIFY_TOKEN=tu-token-de-verificacion
2. Registrar un Número de WhatsApp
- Registra una cuenta de negocios en WhatsApp Business API.
Registra y sincroniza cuentas empresariales de WhatsApp con sus números de teléfono asociados.- Se hace la peticion a la API de whatsapp, se obtienen los datos de la cuenta y se almacenan en la base de datos. Este metodo obtiene los datos de la cuenta, los telefonos de whatsapp asociados a la cuenta y el perfil de cada numero de telefono.
- Se usa para Obtener los datos desde la API y alojarlos en la base de datos.
⚠️Observations:
- Requiere un token de acceso válido con los permisos
whatsapp_business_management.- El
business_iddebe ser el ID numérico de tu cuenta empresarial de WhatsApp.
use ScriptDevelop\WhatsappManager\Facades\Whatsapp;
// Al registrar una cuenta, automáticamente se suscriben los webhooks configurados
$account = Whatsapp::account()->register([
'api_token' => '***********************',
'business_id' => '1243432234423'
]);
// Durante el registro también se:
// - Registran automáticamente todos los números de teléfono asociados
// - Suscriben los webhooks configurados por defecto
// - Configuran los perfiles de negocio
3. Enviar tu Primer Mensaje
Mensaje de Texto Simple
use ScriptDevelop\WhatsappManager\Facades\Whatsapp;
use ScriptDevelop\WhatsappManager\Models\WhatsappBusinessAccount;
$account = WhatsappBusinessAccount::first();
$phone = $account->phoneNumbers->first();
$response = Whatsapp::message()->sendTextMessage(
$phone->phone_number_id, // ID del número de teléfono
'57', // Código de país
'3237121901', // Número de teléfono
'Hola, este es un mensaje de prueba.' // Contenido del mensaje
);
Mensaje con Imagen
Enviar mensajes con Imágenes
⚠️ Advertencia: Asegúrate de que la imagen que envíes cumpla con los requisitos de WhatsApp:
- Formato soportado: JPEG, PNG
- Tamaño máximo recomendado: 5 MB
- Dimensiones recomendadas: al menos 640x640 px
Si la imagen no cumple con estos requisitos, el envío puede fallar.
use ScriptDevelop\WhatsappManager\Facades\Whatsapp;
use ScriptDevelop\WhatsappManager\Models\WhatsappBusinessAccount;
$account = WhatsappBusinessAccount::first();
$phone = $account->phoneNumbers->first();
$filePath = storage_path('app/public/laravel-whatsapp-manager.png');
$file = new \SplFileInfo($filePath);
$message = Whatsapp::message()->sendImageMessage(
$phone->phone_number_id, // ID del número de teléfono
'57', // Código de país
'3237121901', // Número de teléfono
$file // Archivo de imagen.
);
Mensaje con Botones
Enviar mensajes con botones interactivos:
use ScriptDevelop\WhatsappManager\Facades\Whatsapp;
use ScriptDevelop\WhatsappManager\Models\WhatsappBusinessAccount;
$account = WhatsappBusinessAccount::first();
$phone = $account->phoneNumbers->first();
//EJEMPLO 1
$buttonResponse = Whatsapp::sendButtonMessage($phone->phone_number_id)
->to('57', '31371235638')
->withBody('¿Confirmas tu cita para mañana a las 3 PM?')
->addButton('confirmar', '✅ Confirmar')
->addButton('reagendar', '🔄 Reagendar')
->withFooter('Por favor selecciona una opción')
->send();
//EJEMPLO 2
$buttonResponse = Whatsapp::sendButtonMessage($phone->phone_number_id)
->to('57', '31371235638')
->withBody('¿Cómo calificarías nuestro servicio?')
->addButton('excelente', '⭐️⭐️⭐️⭐️⭐️ Excelente')
->addButton('bueno', '⭐️⭐️⭐️⭐️ Bueno')
->addButton('regular', '⭐️⭐️⭐️ Regular')
->withFooter('Tu opinión nos ayuda a mejorar')
->send();
//EJEMPLO 3
// Obtener ID de un mensaje anterior (debes tener uno real)
$contextMessage = \ScriptDevelop\WhatsappManager\Models\Message::first();
$contextId = $contextMessage->wa_id;
$buttonResponse = Whatsapp::sendButtonMessage($phone->phone_number_id)
->to('57', '31371235638')
->withBody('Selecciona el tipo de soporte que necesitas:')
->addButton('soporte-tecnico', '🛠️ Soporte Técnico')
->addButton('facturacion', '🧾 Facturación')
->addButton('quejas', '📣 Quejas y Reclamos')
->withFooter('Horario de atención: L-V 8am-6pm')
->inReplyTo($contextId) // Aquí especificas el mensaje al que respondes
->send();
// EJEMPLOS CON HEADER texto
$buttonResponse = Whatsapp::sendButtonMessage($phone->phone_number_id)
->to('57', '313714R3534')
->withHeader('Catálogo Digital')
->withBody('¿Confirmas tu cita para mañana a las 3 PM?')
->addButton('confirmar', '✅ Confirmar')
->addButton('reagendar', '🔄 Reagendar')
->withFooter('Por favor selecciona una opción')
->send();
// EJEMPLOS CON HEADER imagen
$file = new \SplFileInfo(storage_path('app/public/laravel-whatsapp-manager.png'));
$buttonResponse = Whatsapp::sendButtonMessage($phone->phone_number_id)
->to('57', '313714R3534')
->withHeader($file)
->withBody('¿Confirmas tu cita para mañana a las 3 PM?')
->addButton('confirmar', '✅ Confirmar')
->addButton('reagendar', '🔄 Reagendar')
->withFooter('Por favor selecciona una opción')
->send();
4. Recibir Mensajes
Configurar el Webhook
Primero, configura tu webhook en Meta for Developers siguiendo la guía de instalación.
Escuchar Eventos
Crea un listener para mensajes entrantes:
// app/Listeners/HandleIncomingMessage.php
namespace App\Listeners;
use ScriptDevelop\WhatsappManager\Events\TextMessageReceived;
use Illuminate\Contracts\Queue\ShouldQueue;
class HandleIncomingMessage implements ShouldQueue
{
public function handle(TextMessageReceived $event)
{
$message = $event->message;
$contact = $event->contact;
logger()->info("Mensaje de {$contact->name}: {$message->body}");
// Tu lógica aquí
// Por ejemplo, responder automáticamente:
Whatsapp::sendTextMessage(
phoneId: $message->whatsapp_phone_id,
to: $contact->whatsapp_id,
message: "¡Hola {$contact->name}! Recibimos tu mensaje: '{$message->body}'"
);
}
}
Registra el listener en app/Providers/EventServiceProvider.php:
use ScriptDevelop\WhatsappManager\Events\TextMessageReceived;
use App\Listeners\HandleIncomingMessage;
protected $listen = [
TextMessageReceived::class => [
HandleIncomingMessage::class,
],
];
5. Trabajar con Plantillas
Las plantillas son mensajes pre-aprobados por WhatsApp que puedes enviar a cualquier usuario:
// Enviar plantilla
use ScriptDevelop\WhatsappManager\Facades\Whatsapp;
use ScriptDevelop\WhatsappManager\Models\WhatsappBusinessAccount;
$account = WhatsappBusinessAccount::first();
$phone = $account->phoneNumbers->first();
// Enviar plantilla 1: plantilla sin botones o sin necesidad de proporcionar parámetros para botones
$message = Whatsapp::template()
->sendTemplateMessage($phone)
->to('57', '3137555908')
->usingTemplate('order_confirmation_4')
->addBody(['12345'])
->send();
Ejemplos Completos
Sistema de Respuestas con Listas
use ScriptDevelop\WhatsappManager\Facades\Whatsapp;
use ScriptDevelop\WhatsappManager\Models\WhatsappBusinessAccount;
$account = WhatsappBusinessAccount::first();
$phone = $account->phoneNumbers->first();
// EJEMLPO 1 - SIN ENCADENAR
$listBuilder = Whatsapp::sendListMessage($phone->phone_number_id)
->to('57', '31371235638')
->withButtonText('Ver Productos')
->withBody('Nuestros productos destacados:')
->withHeader('Catálogo Digital')
->withFooter('Desliza para ver más opciones');
$listBuilder->startSection('Laptops')
->addRow('laptop-pro', 'MacBook Pro', '16" - 32GB RAM - 1TB SSD')
->addRow('laptop-air', 'MacBook Air', '13" - M2 Chip - 8GB RAM')
->endSection();
$listBuilder->startSection('Smartphones')
->addRow('iphone-15', 'iPhone 15 Pro', 'Cámara 48MP - 5G')
->addRow('samsung-s23', 'Samsung S23', 'Pantalla AMOLED 120Hz')
->endSection();
$response = $listBuilder->send();
// EJEMLPO 2 - ENCADENADO
$listBuilder = Whatsapp::sendListMessage($phone->phone_number_id)
->to('57', '31371235638')
->withButtonText('Ver Servicios')
->withBody('Selecciona el servicio que deseas agendar:')
->withFooter('Desliza para ver todas las opciones')
->startSection('Cortes de Cabello')
->addRow('corte-mujer', 'Corte Mujer', 'Estilo profesional')
->addRow('corte-hombre', 'Corte Hombre', 'Técnicas modernas')
->addRow('corte-niños', 'Corte Niños', 'Diseños infantiles')
->endSection()
->startSection('Tratamientos')
->addRow('keratina', 'Keratina', 'Tratamiento reparador')
->addRow('coloracion', 'Coloración', 'Tintes profesionales')
->addRow('mascarilla', 'Mascarilla', 'Hidratación profunda')
->endSection();
$response = $listBuilder->send();
// EJEMLPO 3 - respuesta a mensajes o reply
// Obtener ID de un mensaje anterior (debes tener uno real)
$contextMessage = \ScriptDevelop\WhatsappManager\Models\Message::first();
$contextId = $contextMessage->wa_id;
$listBuilder = Whatsapp::sendListMessage($phone->phone_number_id)
->to('57', '31371235638')
->withButtonText('Seleccionar Servicio')
->withBody('Para el tipo de cita que mencionaste, tenemos estas opciones:')
->inReplyTo($contextId); // Aquí especificas el mensaje al que respondes
$listBuilder->startSection('Consultas')
->addRow('consulta-general', 'Consulta General', '30 min - $50.000')
->addRow('consulta-especial', 'Consulta Especializada', '60 min - $90.000')
->endSection();
$listBuilder->startSection('Tratamientos')
->addRow('tratamiento-basico', 'Tratamiento Básico', 'Sesión individual')
->addRow('tratamiento-premium', 'Tratamiento Premium', 'Incluye seguimiento')
->endSection();
$response = $listBuilder->send();
// EJEMPLO CON HEADER texto
$listBuilder = Whatsapp::sendListMessage($phone->phone_number_id)
->to('57', '313714R3534')
->withButtonText('Ver Productos')
->withHeader('Catálogo Digital') // HEADER DE TECTO
->withBody('Nuestros productos destacados:')
->withFooter('Desliza para ver más opciones')
->startSection('Laptops')
->addRow('laptop-pro', 'MacBook Pro', '16" - 32GB RAM - 1TB SSD')
->addRow('laptop-air', 'MacBook Air', '13" - M2 Chip - 8GB RAM')
->endSection()
->startSection('Smartphones')
->addRow('iphone-15', 'iPhone 15 Pro', 'Cámara 48MP - 5G')
->addRow('samsung-s23', 'Samsung S23', 'Pantalla AMOLED 120Hz')
->endSection()
->send();
Verificar el Estado del Mensaje
Todos los mensajes enviados se guardan en la base de datos:
use ScriptDevelop\WhatsappManager\Models\WhatsappMessage;
$message = WhatsappMessage::where('wa_id', 'wamid.xxxxx')->first();
echo "Estado: {$message->status}\n";
echo "Enviado a: {$message->message_to}\n";
echo "Tipo: {$message->message_type}\n";
Logs y Debugging
Todos los eventos se registran en storage/logs/whatsapp.log:
# Ver logs en tiempo real
tail -f storage/logs/whatsapp.log
Próximos Pasos
¡Felicitaciones! Ya enviaste tu primer mensaje. Ahora puedes:
- Explorar todos los tipos de mensajes
- Configurar eventos en tiempo real
- Trabajar con plantillas
- Personalizar el webhook
Solución de Problemas
Error: "Invalid Phone Number"
Asegúrate de incluir el código de país sin el signo +:
// ❌ Incorrecto
to: '+5491234567890'
// ✅ Correcto
to: '5491234567890'
Error: "Invalid Access Token"
Verifica que el token esté activo y tenga los permisos necesarios en Meta for Developers.
No recibo mensajes
- Verifica que el webhook esté configurado correctamente
- Revisa los logs:
storage/logs/whatsapp.log - Confirma que los eventos estén suscritos en Meta
¿Necesitas más ayuda? Abre un issue en GitHub.