Saltar al contenido
WbizTool

Envía mensajes de WhatsApp con PHP

Envía textos, imágenes y archivos de WhatsApp desde tu sitio o app en PHP, desde tu propio número vinculado a WbizTool como WhatsApp Web. Solo necesitas la extensión cURL de PHP y un POST a un endpoint documentado.

Prueba gratuita: 50 mensajes en cualquier periodo de 30 días, sin tarjeta.

Cómo funciona

  1. Obtén tu clave API y vincula tu número

    Regístrate y vincula tu número de WhatsApp en la página Números de WhatsApp con un código QR o un código de vinculación, igual que WhatsApp Web. En Configuración → Claves API, crea una clave y copia tu Client ID (la guía de claves API de abajo muestra dónde). El ID que aparece en la tarjeta del número (por ejemplo, ID 678) es tu whatsapp_client.

  2. Prepara la petición

    Pon client_id, api_key, whatsapp_client, el número de teléfono y msg en un array. Envíalo como JSON con la extensión cURL de PHP, o con cualquier cliente HTTP que ya uses, con los mismos campos.

  3. Envía el mensaje

    Haz un POST a https://wbiztool.com/api/v1/send_msg/. Una respuesta con "status": 1 y un msg_id significa que el mensaje está en cola en tu número.

  4. Comprueba que salió

    Pasa una URL de webhook para que te avisen cuando el mensaje se envíe o falle, o consulta el endpoint de estado del mensaje con el msg_id.

Ejemplos de código en PHP

Enviar un texto
<?php
$payload = [
    'client_id'       => 12345,
    'api_key'         => 'YOUR_API_KEY',
    'whatsapp_client' => 678,
    'msg_type'        => 0,
    'country_code'    => '91',
    'phone'           => '9876543210',
    'msg'             => 'Hi Aman, your order #4821 has shipped and will arrive on Thursday.',
];

$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode($payload),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if (($result['status'] ?? 0) === 1) {
    echo 'Queued with msg_id ' . $result['msg_id'];
} else {
    echo 'Failed: ' . ($result['message'] ?? 'no response');
}
Respuesta
{"status": 1, "message": "Created", "msg_id": 9817263}
Enviar una imagen desde una URL
<?php
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode([
        'client_id'       => 12345,
        'api_key'         => 'YOUR_API_KEY',
        'whatsapp_client' => 678,
        'msg_type'        => 1,
        'country_code'    => '91',
        'phone'           => '9876543210',
        'img_url'         => 'https://example.com/offers/diwali-sale.jpg',
        'msg'             => 'Our Diwali sale starts today 🎉',
    ]),
    CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
curl_close($ch);
Enviar un PDF (subida de archivo)
<?php
$ch = curl_init('https://wbiztool.com/api/v1/send_msg/');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    // An array body (not json_encode) makes cURL send multipart/form-data.
    CURLOPT_POSTFIELDS     => [
        'client_id'       => 12345,
        'api_key'         => 'YOUR_API_KEY',
        'whatsapp_client' => 678,
        'msg_type'        => 2,
        'country_code'    => '91',
        'phone'           => '9876543210',
        'msg'             => 'Your invoice for order #4821 is attached.',
        'file_name'       => 'invoice-4821.pdf',
        'file'            => new CURLFile('/path/to/invoice-4821.pdf', 'application/pdf', 'invoice-4821.pdf'),
    ],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 120,
]);
echo curl_exec($ch);
curl_close($ch);
Programar un mensaje
<?php
$payload = [
    'client_id'       => 12345,
    'api_key'         => 'YOUR_API_KEY',
    'whatsapp_client' => 678,
    'msg_type'        => 0,
    'country_code'    => '91',
    'phone'           => '9876543210',
    'msg'             => 'Hi Aman, a reminder that your appointment is today at 11:30 AM.',
    'date'            => '24/12/2026',
    'time'            => '09:00',
    'timezone'        => 'Asia/Kolkata',
];

$ch = curl_init('https://wbiztool.com/api/v1/schedule_msg/');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode($payload),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if (($result['status'] ?? 0) === 1) {
    echo 'Scheduled with msg_id ' . $result['msg_id'];
} else {
    echo 'Failed: ' . ($result['message'] ?? 'no message in response');
}
Consultar el estado del mensaje
<?php
$msgId = 9817263;
$payload = [
    'client_id' => 12345,
    'api_key'   => 'YOUR_API_KEY',
];

$ch = curl_init("https://wbiztool.com/api/v1/message/status/{$msgId}/");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode($payload),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if (($result['message'] ?? '') === 'Unknown message id') {
    echo 'No message with this ID in your workspace';
} elseif (!isset($result['status_text'])) {
    echo 'Request failed: ' . ($result['message'] ?? 'no message in response');
} elseif ($result['status'] === 1) {
    echo 'Sent';
} elseif ($result['status'] === 2) {
    echo 'Failed: ' . $result['error'];
} else {
    echo 'Status: ' . $result['status_text'];
}
Recibir el webhook de estado
<?php
// webhook.php – WbizTool posts form fields, so they arrive in $_POST.
$msgId  = $_POST['msg_id'] ?? '';
$status = $_POST['status'] ?? ''; // SENT, FAILED, CANCELLED or EXPIRED
error_log("WbizTool message $msgId: $status");
http_response_code(200);

Lo que puedes hacer

  • Sin librerías que instalar

    Los ejemplos solo usan la extensión cURL de PHP. La API acepta JSON, campos de formulario, o multipart form data cuando subes un archivo.

  • Textos, imágenes y archivos

    Pon msg_type en 0 para texto, 1 para una imagen o 2 para un archivo. Indica una img_url o file_url pública, o sube el archivo con CURLFile.

  • Programa para más tarde

    Haz un POST a /api/v1/schedule_msg/ con date (dd/mm/aaaa), time (HH:MM) y una timezone como Asia/Kolkata o America/New_York.

  • Webhooks para cada estado

    Pasa webhook y tu script recibe un POST codificado como formulario: lee $_POST['msg_id'] y $_POST['status'] (SENT, FAILED, CANCELLED o EXPIRED).

  • ¿Usas WordPress? Usa el plugin

    El plugin de WbizTool para WordPress envía mensajes de WhatsApp para pedidos de WooCommerce, reservas de WP Amelia y formularios de Contact Form 7, sin código.

Conviene saber

  • "status": 1 significa que el mensaje está en cola, no que se entregó. Sent es el estado final de éxito; la API no informa si el mensaje se entregó o se leyó.
  • Los errores al enviar un mensaje llegan con HTTP 400 (429 en el límite diario); los errores al programar un mensaje suelen llegar con HTTP 200 y "status": 0, así que decodifica siempre el cuerpo y comprueba status.
  • Para subir un archivo, pasa un array a CURLOPT_POSTFIELDS, no json_encode, para que cURL envíe multipart/form-data con el archivo en un campo llamado file.
  • Guarda la clave API en tu servidor, por ejemplo en una variable de entorno. Cualquiera que la tenga puede enviar desde tus números, así que nunca la pongas en JavaScript del navegador, en una app móvil ni en código que publiques.
  • La prueba gratuita incluye 50 mensajes en cualquier periodo de 30 días y 1 número, sin tarjeta. Los planes de pago empiezan en $25 al mes en EE. UU. (tu precio aparece en Precios) y envían mensajes ilimitados con uso justo: hasta 1.000 al día por número.
  • Los mensajes salen desde tu propio número de WhatsApp, así que se aplican las reglas de WhatsApp: escribe a personas que esperan saber de ti.

Preguntas frecuentes

¿Hay un SDK de PHP?
No hay un paquete oficial de PHP, y no lo necesitas: cada llamada es un solo POST con la extensión cURL, como se muestra arriba. Cualquier cliente HTTP de PHP funciona con la misma URL y los mismos campos.
¿Cómo envío una factura en PDF desde PHP?
Usa msg_type 2. Indica una file_url pública, o sube el archivo con new CURLFile(...) en un campo llamado file. Indica file_name con su extensión, como invoice-4821.pdf.
¿Cómo sé si el mensaje se envió?
Una respuesta con "status": 1 y un msg_id significa que está en cola. Pasa una URL de webhook para recibir un POST con SENT, FAILED, CANCELLED o EXPIRED, o llama al endpoint de estado del mensaje con el msg_id. Sent es el estado final: la API no informa si se entregó o se leyó.
¿En qué formato envío el número de teléfono?
Envía el número con su código de país (919876543210), o sin él (9876543210) junto con country_code (91). Los espacios, el +, los guiones y los paréntesis se quitan por ti, así que +91 98765-43210 también funciona.
¿Necesito la API de WhatsApp Business o la aprobación de Meta?
No. WbizTool envía desde tu propio número de WhatsApp o WhatsApp Business, vinculado como WhatsApp Web. No hay aprobación de Meta ni plantillas de mensajes que aprobar.
¿Se paga por mensaje?
No. La prueba gratuita incluye 50 mensajes en cualquier periodo de 30 días. Los planes de pago envían mensajes ilimitados con uso justo, hasta 1.000 al día por número: Lite $25, Standard $59 y Advanced $149 al mes en EE. UU.; la página de Precios muestra el precio de tu país.

Lee las guías

Relacionado

Envía hoy tu primer mensaje automatizado de WhatsApp

Crea una cuenta, escanea el código QR y envía un mensaje en menos de cinco minutos.

Empieza gratis

Planes de pago desde $25 al mes en EE. UU. Precios