Shared Inbox de WhatsApp para nueva PlataformaMás
1msg official logo

Elegir método de pago con botones de WhatsApp API

El escenario envía al cliente una plantilla de WhatsApp personalizada cuando facturación necesita conocer el método de pago.

Descripción del caso de uso

El escenario envía al cliente una plantilla de WhatsApp personalizada cuando facturación necesita conocer el método de pago. El mensaje incluye el nombre del cliente y monto adeudado. Dos botones quick-reply permiten elegir tarjeta o transferencia bancaria; el webhook entrega la elección a tu backend.

Ejemplo de plantilla

Hola, {{1}}! Elige cómo pagarás {{2}}:

Tarjeta
Transferencia bancaria
  • {{1}}
    nombre del cliente
  • {{2}}
    monto del pago
  • “Tarjeta”
    botón — fijo en la plantilla de Meta
    “Transferencia bancaria”
    botón — fijo en la plantilla de Meta
WhatsApp Business API for payment method clarification

Cuándo usarlo

Usa este escenario cuando facturación está lista para cobrar pero aún no sabe cómo pagará el cliente y necesitas esa respuesta antes de generar las instrucciones correctas — y no hay una conversación abierta en WhatsApp para preguntarlo en texto libre. Encaja en flujos de checkout y facturación, facturación B2B donde tarjeta vs transferencia cambia lo que envías después, e integradores que enrutan eventos webhook de quick-reply a facturación o ERP.

Instrucciones de pago correctas al primer intento
El nombre del cliente y el monto adeudado llegan como dos variables del cuerpo, y dos botones quick-reply preguntan tarjeta vs transferencia bancaria; el webhook devuelve el toque como una elección estructurada que facturación puede usar para el siguiente paso.
Sin idas y vueltas por email del método de pago
Una plantilla aprobada abre el chat fuera de la ventana de 24 horas, así facturación puede preguntar cómo pagarán en WhatsApp en lugar de esperar respuestas enterradas en el correo.
Menos seguimiento manual de facturación
Facturación dispara el envío cuando detecta que falta el método de pago en una factura o checkout, así nadie retipea el monto ni persigue al cliente por teléfono.
Respuestas estructuradas listas para ERP
Tarjeta y transferencia bancaria son etiquetas quick-reply fijas en la plantilla de Meta; solo las variables del cuerpo pasan por la API, y el webhook entrante entrega el evento del botón a tu backend para enrutarlo.

Flujo de trabajo

  1. Disparador

    Facturación detecta que falta el método de pago y dispara un evento.

    evento · disparado

  2. Capturar evento

    El sistema obtiene el teléfono del cliente y el monto del pago.

    phone: "+…"

  3. Construir y enviar

    Se construye un mensaje de plantilla personalizado con dos variables en el cuerpo y dos botones quick-reply.

    POST /sendTemplate

  4. Entregado

    El cliente recibe el mensaje de WhatsApp y toca tarjeta o transferencia bancaria.

    entregado

  5. Estado registrado

    El webhook entrega la elección estructurada a facturación para el siguiente paso de pago.

    status: "read"

WhatsApp Business API for payment method clarification

Implementación técnica

Requisitos previos

  1. Clave API de 1MSG · Cómo obtener la clave API
  2. Cuenta de WhatsApp Business · Cómo conectar WABA
  3. Plantilla de WhatsApp · Cómo aprobar una plantilla WABA
  4. Opt-in del cliente · Cómo gestionar el consentimiento
  5. Endpoint de webhook · Cómo configurar webhooks

Ejemplos de código

#!/usr/bin/env bash
set -euo pipefail

# === Configuration (replace "___" placeholders) ===

API_BASE_URL="https://api.1msg.io"        # production 1MSG API base URL
CHANNEL_ID="___"                           # channel ID from 1MSG dashboard
API_TOKEN="___"                            # channel JWT token (Bearer)

TEMPLATE_NAME="___"                        # approved template name
TEMPLATE_NAMESPACE="___"                   # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___"                    # template language code, e.g. "en"



# === Test data ===
TEST_PHONE="___"                 # client phone in international format
TEST_CUSTOMERNAME="___"         # {{1}} customer name
TEST_PAYMENTAMOUNT="___"         # {{2}} payment amount

PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"

for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
            "TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
            "TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "TEST_PHONE=$TEST_PHONE" \
            "TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
            "TEST_PAYMENTAMOUNT=$TEST_PAYMENTAMOUNT"; do
    val="${pair#*=}"
    if [ -z "$val" ] || [ "$val" = "___" ]; then
        echo "Missing configuration value: ${pair%%=*}" >&2
        exit 1
    fi
done

if [ -z "$PHONE_NORM" ]; then
    echo "Error: phone number has no digits after normalization" >&2
    exit 1
fi

URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"

# params carries body ONLY. Button text is fixed in the Meta template — no button param.

# {{1}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} payment amount → ${TEST_PAYMENTAMOUNT}
read -r -d '' PAYLOAD <<JSON || true
{
  "phone": "${PHONE_NORM}",
  "template": "${TEMPLATE_NAME}",
  "namespace": "${TEMPLATE_NAMESPACE}",
  "language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
  "params": [
    {
      "type": "body",
      "parameters": [
        { "type": "text", "text": "${TEST_CUSTOMERNAME}" },
        { "type": "text", "text": "${TEST_PAYMENTAMOUNT}" }
      ]
    }

  ]
}
JSON

RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -d "$PAYLOAD")"

HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"

case "$BODY" in
    *'"sent":true'*) ok=1 ;;
    *) ok=0 ;;
esac

if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
    echo "Message sent to client."
    echo "API response: $BODY"
else
    echo "Send failed. HTTP status: $HTTP_CODE" >&2
    echo "$BODY" >&2
    exit 1
fi

Respuesta y estado de entrega

HTTP 2xx y JSON "sent": true significan que 1MSG aceptó el mensaje para envío — no que ya llegó al teléfono del cliente. Guarda el campo id (tipo wamid.…) para correlacionar los callbacks de entrega.

200 OKRespuesta
{
  "sent": true,
  "message": "Sent to [email protected]",
  "description": "Message has been sent to the provider",
  "id": "wamid.HBgLMzgwNjM5..."
}
  • sent

    Aceptado para envío — aún no en el teléfono del cliente

  • id

    Guárdalo; los callbacks de entrega y hookInfo se basan en él

Estados de entrega y webhooks →

Errores frecuentes

EstadoRespuesta de la APICausaSolución
200Message was not sent: template is not definedFalta namespace, template o language en el cuerpo de la petición.Envía los tres. Toma namespace y el nombre exacto de la plantilla de GET /templates; language es un objeto: {"policy": "deterministic", "code": "es_MX"}.
200template name (…) does not exist in <language>La plantilla está aprobada en otro idioma que el solicitado.Usa el código de idioma exacto con el que se aprobó la plantilla (por ejemplo, es_MX no es lo mismo que es). Revísalo en GET /templates.
200Message was not sent: provide chatId, phone, bsuid, or usernameNingún destinatario que el canal pudiera resolver.Envía un solo destinatario: phone (código de país y número, solo dígitos), chatId (por ejemplo [email protected]) o bsuid.

Todos los códigos de error →

Preguntas comunes

Relacionado

Desarrolla para WhatsApp en horas
sin complicaciones de infraestructura