API de WhatsApp con PHP
Con la extensión cURL que trae cualquier hosting PHP. Al final, la versión con Laravel.
Requisitos
- PHP 7.4 o superior con la extensión curl
- Tu API key y tu número conectado
- Un servidor con HTTPS para el webhook
Enviar un mensaje
Guarda tu API key en una variable de entorno y no en el código.
<?php
$datos = [
'api_key' => getenv('WSP_API_KEY'),
'sender' => '51999888777', // tu número conectado
'number' => '51987654321', // destino con código de país
'message' => 'Hola Ana, tu pedido #1024 ya salió a reparto.',
];
$ch = curl_init('https://api.kontacto.pro/send-message');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($datos),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$cuerpo = curl_exec($ch);
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$respuesta = json_decode((string) $cuerpo, true);
if ($http === 200 && !empty($respuesta['status'])) {
echo "Enviado\n";
} else {
echo 'No se envió: ' . ($respuesta['msg'] ?? 'sin respuesta del servidor') . "\n";
}
Enviar un PDF
El archivo debe estar en una URL pública con enlace directo.
<?php
$datos = [
'api_key' => getenv('WSP_API_KEY'),
'sender' => '51999888777',
'number' => '51987654321',
'media_type' => 'pdf',
'caption' => 'F001-2045.pdf', // en documentos, es el nombre del archivo
'url' => 'https://tusistema.com/comprobantes/F001-2045.pdf',
];
$ch = curl_init('https://api.kontacto.pro/send-media');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($datos),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$respuesta = json_decode((string) curl_exec($ch), true);
curl_close($ch);
Recibir mensajes con un webhook
Pon la URL de este archivo en el panel (Webhooks). Si respondes un JSON con text, ese mensaje le llega al cliente.
<?php
// webhook.php
$entrada = json_decode(file_get_contents('php://input'), true) ?: [];
$texto = $entrada['message'] ?? ''; // en minúsculas y sin tildes
$numero = $entrada['from'] ?? '';
$id = $entrada['id'] ?? ''; // guárdalo para no responder dos veces
header('Content-Type: application/json');
if (strpos($texto, 'horario') !== false) {
echo json_encode([
'text' => 'Hola {name}, atendemos de lunes a sábado de 9:00 a 19:00.',
'quoted' => true,
]);
exit;
}
// Respuesta vacía: no se envía nada automático.
Con Laravel
El cliente HTTP de Laravel arma el JSON y lee la respuesta.
use Illuminate\Support\Facades\Http;
$respuesta = Http::timeout(30)->post('https://api.kontacto.pro/send-message', [
'api_key' => config('services.wsp.key'),
'sender' => '51999888777',
'number' => '51987654321',
'message' => 'Hola desde Laravel',
]);
if (! $respuesta->json('status')) {
report(new RuntimeException($respuesta->json('msg', 'Error de WhatsApp')));
}
Todos los endpoints, parámetros y errores están en la documentación de la API.
¿Funciona en un hosting compartido?
Sí. Solo necesitas PHP con la extensión curl, que viene activada en casi todos los hosting.
¿Puedo usar Guzzle?
Sí. Envía el mismo cuerpo con $client->post('https://api.kontacto.pro/send-message', ['json' => $datos]).
Envía tu primer mensaje hoy
Escríbenos por WhatsApp, conectamos tu número con un QR y te damos tu API key para que pruebes desde tu sistema.