1msg official logo

OTP de autorización de inicio de sesión (WhatsApp)

Envía un código de autorización de un solo uso mediante una plantilla de autenticación de WhatsApp cuando el usuario debe confirmar el inicio de sesión o el acceso.

Descripción del caso de uso

Envía un código de autorización de un solo uso mediante una plantilla de autenticación de WhatsApp cuando el usuario debe confirmar el inicio de sesión o el acceso. El botón copy-code acelera la entrada en tu formulario de login o autorización.

Ejemplo de plantilla

{{1}} es tu código de verificación. Por tu seguridad, no compartas este código con nadie.

Copiar código
  • {{1}}
    código de verificación de autorización de un solo uso (dígitos)
  • “Copiar código”
    botón — fijo en la plantilla de Meta
WhatsApp Business API for authorization confirmation otp

Cuándo usarlo

Usa este escenario cuando un usuario inicia sesión o debe confirmar autorización antes de acceder a un área protegida, y necesitas un código de un solo uso en cold start antes de que exista sesión en WhatsApp. Encaja en verificación de login, autorización adicional antes de conceder acceso a recursos protegidos, y equipos que implementan portales seguros para desarrolladores, equipos pequeños y agencias.

Autorización conforme en cold-start
Una plantilla de autenticación aprobada abre la conversación sin sesión previa, así el código de autorización llega en el primer contacto en lugar de depender de la ventana de respuesta de 24 horas.
Entrada más rápida en tu formulario de login
El botón copy-code lleva los mismos dígitos que la única variable del cuerpo, así el usuario pega el OTP en tu formulario de inicio de sesión o autorización en lugar de reescribirlo desde el chat.
Autorización donde ya está el teléfono
Cuando el teléfono de la cuenta está registrado en formato internacional, el backend envía el código de un solo uso por WhatsApp para que la verificación llegue a un canal que el usuario ya revisa, no a un SMS filtrado.
Envío exitoso al primer intento
Las plantillas de autenticación exigen el OTP en el cuerpo del mensaje y en el payload del botón copy-code; incluir ambos evita un envío solo con cuerpo que devuelve `sent: false`.

Flujo de trabajo

  1. El cliente actúa

    El usuario inicia sesión o autorización e ingresa su teléfono.

    acción del usuario

  2. Construir y enviar

    El backend genera un código de autorización y envía la plantilla.

    POST /sendTemplate

  3. El usuario copia el

    El usuario copia el código de WhatsApp y lo envía.

    acción del usuario

  4. Entregado

    El backend valida y completa la sesión autorizada.

    entregado

WhatsApp Business API for authorization confirmation otp

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

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_CODE="___"         # {{1}} otp code

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_CODE=$TEST_CODE"; 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 and button blocks.

# {{1}} otp code → ${TEST_CODE}
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_CODE}" }
      ]
    },
    {
      "type": "button",
      "sub_type": "url",
      "index": "0",
      "parameters": [ { "type": "text", "text": "${TEST_CODE}" } ]
    }

  ]
}
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

Verificación OTP
Código de registro en app con WhatsApp API
Envía una plantilla de autenticación de WhatsApp con un código de confirmación de registro de un solo uso en el cuerpo del mensaje y un botón copy-code.
Verificación OTP
Migrar OTP de SMS a WhatsApp API
Entrega un código de verificación de un solo uso mediante una plantilla de autenticación de WhatsApp cuando tu producto cambia la entrega de OTP de SMS a WhatsApp.
Verificación OTP
OTP para confirmar acciones seguras (WhatsApp API)
El escenario envía una plantilla de autenticación de WhatsApp con un código de verificación de un solo uso cuando el usuario debe confirmar una acción segura antes de que se ejecute.
Verificación OTP
Código de acceso a servicios con WhatsApp API
Envía un código de confirmación de acceso de un solo uso mediante una plantilla de autenticación de WhatsApp cuando el usuario debe verificar identidad antes de usar un servicio protegido.
Verificación OTP
OTP de inicio de sesión en nuevo dispositivo (API)
El escenario envía al usuario una plantilla de autenticación de WhatsApp con un código de verificación de un solo uso cuando un intento de login se marca como proveniente de un dispositivo nuevo.
Verificación OTP
Confirmar nuevo inicio de sesión con WhatsApp API
Envía un código de confirmación de inicio de sesión de un solo uso mediante una plantilla de autenticación de WhatsApp cuando tu backend detecta un acceso desde un dispositivo, navegador o ubicación n
Verificación OTP
Autenticación de dos factores (2FA) con WhatsApp API
El escenario envía una plantilla de autenticación de WhatsApp con un código de verificación de un solo uso cuando se requiere autenticación de dos factores tras el login primario.
Verificación OTP
Código de verificación de teléfono por WhatsApp API
Entrega un código de un solo uso vía plantilla de autenticación de WhatsApp cuando el usuario agrega o cambia un número de teléfono.

Desarrolla para WhatsApp en horas
sin complicaciones de infraestructura