Integrar Link de Pago

El sistema permite generar enlaces de pago personalizados para hoteles y comercios que incluyen información específica de la transacción. Estos enlaces pueden ser utilizados para redirigir a los usuarios a una página de pago preconfigurada.

Diagrama de flujo del proceso de pago

El siguiente diagrama ilustra el flujo completo del proceso de pago, desde la generación del enlace hasta la confirmación de la reserva:

<Image align="center" className="border" border={true} src="https://mermaid.ink/svg/pako:eNqNlE1u2zAQha8y4CoBUnSvRYAgLWoDUiCo0E6bCTWS2VCkQlJp0yCH6bKLrnoEX6xD_diJbRj1yiY_vpn3OOaLkLYmkQhPjwMZSZ8Utg67ygB_UAbroAT0UPoBnbLTeo8uKKl6NAGyIm5nNpI1QUGe3BP6YzDNI5gq8xC5HFsLHyHf_mqVwWXl-FQ-nsqdleSxnmpE8kSBVSRXNpCuzLRbfri-zooE1oYZBDf1Nu1lBW-meQJfyJBDIKNRUpTvd42MTJnE8r11UllzmitnqRspiTcQNEK_d7YH03wSzAbygYs21nWDjsGeFlyblptmEQzWn5DKmflsnrZ_FoTz4NJTWp0iE2Y6X-g5SSA9asGFVwaUCRyBlGr713AVDcN025fzGOgw3Rf9UFxkltzJxkbvbFCNkgjb35HZE4vjgmrlVBvDKYs0Wjkkl8tKNbUI7wI8KbraWf9O9xtrH-BCWtMo1-FiZLR4uT833mdM4dYaP-iAcJOvp8xqCqg1-dG-tPfu0GVs7e0cnDsw1okHbueG4Bka9qLVz3E23g0iaT__HRoWVPXZeCPyX-kegGfCPSB3vWdo6Ns4KCMR0aPWTS2uREfsUNX8iLzE5UqEDXVUiYS_1tQgB12JyrwyikOwX5-NFElwA10JZ4d2IxIu4PnX0PMQLy_QbpWt8duSTc_U-Fq9_gOEeoY0" />

Explicación del diagrama

  1. Inicio de la transacción: El usuario inicia el proceso en el Sistema Integrador.
  2. Generación del enlace de pago: El Sistema Integrador genera un enlace de pago único y lo proporciona al usuario.
  3. Acceso a la página de pago: El usuario accede a la página de pago a través del enlace proporcionado.
  4. Ingreso de datos de pago: El usuario ingresa sus datos de pago en la página.
  5. Procesamiento del pago: Los datos se envían al Procesador de Pagos para su procesamiento.
  6. Resultado del pago:
    • Si el pago es exitoso:
      a. El usuario es redirigido a la URL de éxito. b. Se envía un webhook al integrador para confirmar el pago. c. El Sistema Integrador consulta la API del Procesador de Pagos para verificar los detalles del cobro. d. El Sistema Integrador confirma y finaliza la transacción.
    • Si el pago falla:
      a. El usuario es redirigido a la URL de fallo. b. El Sistema Integrador maneja el fallo de la transacción.

Este flujo asegura que el pago se procese de manera segura y que la transacción se confirme solo después de una verificación completa del pago.

Estructura del enlace

El enlace de pago tiene la siguiente estructura base:

https://{dominio}/{tipo_entidad}/{slug}?params={parametros_codificados}

Donde:

  • {dominio} es el dominio del servicio de pago (ver la sección "Entornos" a continuación).
  • {tipo_entidad} es el tipo de entidad: hotel para hoteles o merchant para comercios.
  • {slug} es el identificador único del hotel o comercio.
  • {parametros_codificados} son los parámetros de la transacción codificados en Base64.

Entornos

El sistema proporciona dos entornos para la generación y procesamiento de enlaces de pago:

  1. Entorno de Producción

    • URL base: https://link.hotelpay.net
    • Este es el entorno para transacciones reales y debe ser utilizado en sistemas en producción.
  2. Entorno Staging (Pruebas)

    • URL base: https://link-staging.hotelpay.net
    • Este entorno es para pruebas y desarrollo. Utilícelo para probar su integración sin procesar pagos reales.

Asegúrese de usar el entorno apropiado según sus necesidades de desarrollo o producción.

Parámetros del enlace de pago

Los siguientes parámetros pueden ser incluidos en el enlace:

Parámetros principales

Parámetro Tipo Descripción Requerido
referenceId string Identificador de referencia de la transacción
booking_number string Número de reserva (solo para hoteles) No
checkin string Fecha de entrada (formato: YYYY-MM-DD) (solo para hoteles) Condicional*
checkout string Fecha de salida (formato: YYYY-MM-DD) (solo para hoteles) Condicional*
guests number Número de huéspedes (solo para hoteles) Condicional*
rooms number Número de habitaciones (solo para hoteles) Condicional*
total number Monto total de la transacción (calculado si no se ingresa)
subtotal number Subtotal de la transacción (ignorado si se proporciona total) No
taxes number Impuestos aplicables (ignorado si se proporciona total) No
discounts number Descuentos aplicados (ignorado si se proporciona total) No
currency string Código de moneda (ej. "MXN")
language string Idioma de la interfaz. Idiomas soportados: 'es' (Español), 'en' (Inglés), 'fr' (Francés), 'pt' (Portugués) No
url_success string URL de redirección en caso de pago exitoso No
url_failure string URL de redirección en caso de fallo en el pago No

Datos del cliente

Los siguientes parámetros permiten pre-llenar la información del cliente:

Parámetro Tipo Descripción Requerido
first_name string Nombre del cliente No
last_name string Apellido del cliente No
email string Correo electrónico del cliente No
phone string Teléfono del cliente No

Conversión de moneda

Si se requiere mostrar el monto en una moneda diferente a la de procesamiento:

Parámetro Tipo Descripción Requerido
source_currency string Código de moneda de origen (ej. "USD") No
source_amount number Monto en la moneda de origen No
fx_rate number Tipo de cambio aplicado para la conversión No*

* Requerido si se especifica source_currency diferente a currency

Elementos de la transacción (Items)

Para incluir elementos detallados de la transacción:

Parámetro Tipo Descripción Requerido
items array Array de objetos que representan los elementos de la transacción No

Cada objeto en el array items debe tener la siguiente estructura:

Campo Tipo Descripción Requerido
description string Descripción del elemento (ej. "Habitación Deluxe", "Producto ABC")
quantity number Cantidad del elemento
price number Precio unitario del elemento

Ejemplo de uso de items para hotel:

{
  "items": [
    {
      "description": "Habitación Deluxe",
      "quantity": 2,
      "price": 1500.00
    },
    {
      "description": "Desayuno buffet",
      "quantity": 2,
      "price": 350.00
    }
  ]
}

Ejemplo de uso de items para comercio:

{
  "items": [
    {
      "description": "Producto Premium",
      "quantity": 1,
      "price": 2500.00
    },
    {
      "description": "Servicio de instalación",
      "quantity": 1,
      "price": 500.00
    }
  ]
}

Nota: Cuando se proporcionan items, se mostrarán en el resumen de la transacción en la página de pago, permitiendo al cliente ver el desglose detallado de los elementos que está pagando.

Parámetros adicionales

Parámetro Tipo Descripción Requerido
disable_inputs boolean Si es true, los campos precargados no serán editables No
disable_invoice boolean Si es true, oculta completamente la opción de solicitar factura No
concept string Concepto adicional para categorización de la transacción No
description_mode string Modo de descripción personalizada No
custom_description string Descripción personalizada para la transacción No

* Los parámetros checkin, checkout, guests y rooms son requeridos únicamente para enlaces de tipo hotel. Para enlaces de tipo merchant, estos parámetros son opcionales y normalmente se omiten.

Configuración de plazos (Installments)

Si se requiere sobrescribir la configuración de plazos del merchant para un link específico:

Parámetro Tipo Descripción Requerido
installments_config object Objeto con la configuración de plazos personalizada No

El objeto installments_config puede contener los siguientes campos:

Campo Tipo Descripción Requerido*
installments_active boolean Habilita/deshabilita los meses sin intereses (MSI) No
minimum_amount_terms number Monto mínimo para aplicar MSI Sí**
msi_payment_terms string Plazos MSI disponibles (ej: "3,6,9,12") Sí**
allow_deferred_payments boolean Habilita/deshabilita pagos diferidos No
minimum_amount_deferred number Monto mínimo para pagos diferidos Sí***
deferred_payment_terms string Plazos diferidos disponibles (ej: "1,2,3") Sí***

* Dentro del objeto installments_config ** Requerido si installments_active es true *** Requerido si allow_deferred_payments es true

Nota: La configuración de plazos solo se aplicará si el merchant tiene habilitada esta funcionalidad. Los valores proporcionados sobrescribirán la configuración predeterminada del merchant para este link específico.

Dirección de facturación para validación AVS

La página de pago solicita la dirección de facturación del titular de la tarjeta para realizar validación AVS (Address Verification System). Esta información es importante para:

  1. Reducir fraudes: La validación AVS compara la dirección proporcionada con la registrada en el banco emisor.
  2. Mejorar tasas de aprobación: Proporcionar una dirección correcta aumenta la probabilidad de que la transacción sea aprobada.
  3. Cumplimiento PCI: Es parte de las mejores prácticas de seguridad para procesamiento de pagos.

Los campos requeridos para la dirección de facturación son:

Campo Descripción
country Código ISO del país (ej. "MX", "US")
state Estado o provincia
city Ciudad
zip Código postal
address Dirección (calle, número, etc.)

Notas importantes sobre los parámetros:

  1. Total vs. Subtotal, Taxes, y Discounts:

    • Si se proporciona el parámetro total, los parámetros subtotal, taxes, y discounts serán ignorados.
    • Si no se proporciona total, se calculará automáticamente sumando subtotal y taxes, y restando discounts.
    • Es recomendable proporcionar o bien total, o bien el conjunto de subtotal, taxes, y discounts.
  2. Valores por defecto:

    • Todos los parámetros numéricos (guests, rooms, total, subtotal, taxes, discounts) tienen 0 como valor por defecto.
    • El parámetro currency tiene "MXN" como valor por defecto.
    • El parámetro language tiene "es" como valor por defecto.
  3. URLs de éxito y fallo:

    • Si no se proporcionan url_success o url_failure, el link de pago no realizará redirecciones después del proceso de pago.
    • En su lugar, mostrará un mensaje de pago exitoso o fallido directamente en la página de pago.
  4. referenceId y booking_number:

    • referenceId: Este parámetro se utiliza para proporcionar un identificador único de la transacción. Este valor se devolverá en el webhook como el campo reference.
    • booking_number: Este parámetro se utiliza para proporcionar el número de reserva (solo aplica para hoteles). Este valor se devolverá en el webhook como el campo booking_number.
    • Estos parámetros son opcionales pero altamente recomendados para facilitar el seguimiento y la reconciliación de las transacciones.

Proceso de generación del enlace

  1. Crear un objeto JSON con los parámetros requeridos.
  2. Convertir el objeto JSON a una cadena.
  3. Codificar la cadena JSON en Base64.
  4. Codificar el resultado Base64 para URL (reemplazando caracteres no seguros).
  5. Construir la URL final con el tipo de entidad, slug y los parámetros codificados.

Ejemplo de implementación

import json
import base64
import urllib.parse

def generate_payment_link(slug, transaction_data, entity_type="hotel"):
    # 1. Crear diccionario con los parámetros
    params = {
        "total": transaction_data["total"],
        "currency": transaction_data["currency"],
        "language": transaction_data["language"],
        "url_success": transaction_data["url_success"],
        "url_failure": transaction_data["url_failure"]
    }
    
    # Para hoteles, agregar parámetros específicos
    if entity_type == "hotel":
        params.update({
            "checkin": transaction_data["checkin"],
            "checkout": transaction_data["checkout"],
            "guests": transaction_data["guests"],
            "rooms": transaction_data["rooms"]
        })
        if "subtotal" in transaction_data:
            params["subtotal"] = transaction_data["subtotal"]
        if "taxes" in transaction_data:
            params["taxes"] = transaction_data["taxes"]
        if "discounts" in transaction_data:
            params["discounts"] = transaction_data["discounts"]
    
    # Agregar items si están disponibles
    if "items" in transaction_data and transaction_data["items"]:
        params["items"] = transaction_data["items"]

    # 2 y 3. Convertir a JSON y codificar en Base64
    params_json = json.dumps(params)
    params_base64 = base64.b64encode(params_json.encode('utf-8')).decode('utf-8')

    # 4. Codificar para URL
    params_encoded = urllib.parse.quote(params_base64)

    # 5. Construir la URL final
    base_url = "https://link.hotelpay.net"
    payment_link = f"{base_url}/{entity_type}/{slug}?params={params_encoded}"

    return payment_link

# Ejemplo de uso para hotel
hotel_slug = "hotel-test"
hotel_data = {
    "checkin": "2024-07-15",
    "checkout": "2024-07-20",
    "guests": 2,
    "rooms": 1,
    "subtotal": 1000,
    "taxes": 150,
    "discounts": 50,
    "total": 1100,
    "currency": "MXN",
    "language": "es",
    "url_success": "https://mihotel.com/reserva-exitosa",
    "url_failure": "https://mihotel.com/reserva-fallida",
    "items": [
        {
            "description": "Habitación Deluxe",
            "quantity": 1,
            "price": 850.00
        },
        {
            "description": "Desayuno buffet",
            "quantity": 2,
            "price": 125.00
        }
    ]
}

payment_link = generate_payment_link(hotel_slug, hotel_data, "hotel")
print(payment_link)

# Ejemplo de uso para comercio
merchant_slug = "mi-tienda"
merchant_data = {
    "total": 2500,
    "currency": "MXN",
    "language": "es",
    "url_success": "https://mitienda.com/pago-exitoso",
    "url_failure": "https://mitienda.com/pago-fallido",
    "items": [
        {
            "description": "Producto Premium",
            "quantity": 1,
            "price": 2000.00
        },
        {
            "description": "Envío express",
            "quantity": 1,
            "price": 500.00
        }
    ]
}

merchant_payment_link = generate_payment_link(merchant_slug, merchant_data, "merchant")
print(merchant_payment_link)
print(payment_link)
function generatePaymentLink(slug, transactionData, entityType = "hotel") {
  // 1. Crear objeto JSON
  const params = {
    total: transactionData.total,
    currency: transactionData.currency,
    language: transactionData.language,
    url_success: transactionData.url_success,
    url_failure: transactionData.url_failure
  };

  // Para hoteles, agregar parámetros específicos
  if (entityType === "hotel") {
    params.checkin = transactionData.checkin;
    params.checkout = transactionData.checkout;
    params.guests = transactionData.guests;
    params.rooms = transactionData.rooms;
    if (transactionData.subtotal !== undefined) params.subtotal = transactionData.subtotal;
    if (transactionData.taxes !== undefined) params.taxes = transactionData.taxes;
    if (transactionData.discounts !== undefined) params.discounts = transactionData.discounts;
  }

  // Agregar items si están disponibles
  if (transactionData.items && transactionData.items.length > 0) {
    params.items = transactionData.items;
  }

  // 2 y 3. Convertir a JSON y codificar en Base64
  const paramsBase64 = btoa(JSON.stringify(params));

  // 4. Codificar para URL
  const paramsEncoded = encodeURIComponent(paramsBase64);

  // 5. Construir la URL final
  const baseUrl = "https://link.hotelpay.net";
  const paymentLink = `${baseUrl}/${entityType}/${slug}?params=${paramsEncoded}`;

  return paymentLink;
}

// Ejemplo de uso para hotel
const hotelSlug = "hotel-test";
const hotelData = {
  checkin: "2024-07-15",
  checkout: "2024-07-20",
  guests: 2,
  rooms: 1,
  subtotal: 1000,
  taxes: 150,
  discounts: 50,
  total: 1100,
  currency: "MXN",
  language: "es",
  url_success: "https://mihotel.com/reserva-exitosa",
  url_failure: "https://mihotel.com/reserva-fallida",
  items: [
    {
      description: "Habitación Deluxe",
      quantity: 1,
      price: 850.00
    },
    {
      description: "Desayuno buffet",
      quantity: 2,
      price: 125.00
    }
  ]
};

const hotelPaymentLink = generatePaymentLink(hotelSlug, hotelData, "hotel");
console.log(hotelPaymentLink);

// Ejemplo de uso para comercio
const merchantSlug = "mi-tienda";
const merchantData = {
  total: 2500,
  currency: "MXN",
  language: "es",
  url_success: "https://mitienda.com/pago-exitoso",
  url_failure: "https://mitienda.com/pago-fallido",
  items: [
    {
      description: "Producto Premium",
      quantity: 1,
      price: 2000.00
    },
    {
      description: "Envío express",
      quantity: 1,
      price: 500.00
    }
  ]
};

const merchantPaymentLink = generatePaymentLink(merchantSlug, merchantData, "merchant");
console.log(merchantPaymentLink);

Ejemplo con configuración de plazos

// Ejemplo con configuración de plazos personalizada
const reservationDataWithInstallments = {
  checkin: "2024-07-15",
  checkout: "2024-07-20",
  guests: 2,
  rooms: 1,
  total: 5000,
  currency: "MXN",
  language: "es",
  url_success: "https://mihotel.com/reserva-exitosa",
  url_failure: "https://mihotel.com/reserva-fallida",
  // Configuración de plazos personalizada
  installments_config: {
    installments_active: true,
    minimum_amount_terms: 300,
    msi_payment_terms: "3,6,9,12,18",
    allow_deferred_payments: true,
    minimum_amount_deferred: 100,
    deferred_payment_terms: "1,2,3"
  }
};

const paymentLinkWithInstallments = generatePaymentLink(hotelSlug, reservationDataWithInstallments, "hotel");

Proceso de confirmación del pago

Es importante destacar que el sistema integrador no debe confirmar el pago basándose únicamente en la redirección del usuario a la URL de éxito. El proceso correcto de confirmación del pago es el siguiente:

  1. Redirección del usuario: Cuando el pago es exitoso, el usuario es redirigido a la URL de éxito proporcionada. Esta redirección es principalmente para la experiencia del usuario y no debe considerarse como una confirmación definitiva del pago.

  2. Recepción del webhook: El sistema de pago enviará un webhook al integrador (si está configurado) con la confirmación del pago. Este webhook contiene información detallada y confiable sobre el estado del pago.

  3. Confirmación de la transacción: Solo después de recibir el webhook el sistema integrador debe confirmar y finalizar la transacción.

Manejo de fallos

En caso de que el pago falle, el usuario será redirigido a la URL de fallo. El sistema integrador debe estar preparado para manejar esta situación, posiblemente ofreciendo al usuario la opción de intentar el pago nuevamente o cancelar la transacción.

Consideraciones de seguridad

  • No confíe únicamente en la redirección a la URL de éxito para confirmar un pago.
  • Implemente la verificación del webhook.
  • Asegúrese de que todas las comunicaciones se realicen a través de conexiones seguras (HTTPS).
  • Valide la autenticidad de los webhooks recibidos para prevenir fraudes.

Webhooks

Cuando se configura, el sistema enviará un webhook con información detallada sobre la transacción una vez que se complete el pago. Esta información es crucial para actualizar el estado de la transacción en su sistema.

Configuración de pruebas

Para propósitos de prueba y desarrollo, se recomienda utilizar el servicio webhook.site. Este servicio proporciona una URL única a la que se pueden enviar los webhooks, permitiéndole ver y analizar las respuestas en tiempo real.

Estructura de la respuesta del webhook

A continuación se muestra un ejemplo de la respuesta del webhook, con datos sensibles enmascarados:

{
  "uuid": "7f53a881-91f0-4088-9bca-08ee7960b1a0",
  "reference": "5aa72cdf-f98b-4391-b6af-45f615e9524f",
  "booking_number": null,
  "amount": 1000,
  "fee": 0,
  "currency": "MXN",
  "checkin": "05/07/2024",
  "checkout": "06/07/2024",
  "description": "Transacción de pago",
  "customer_info": {
    "first_name": "Alex",
    "last_name": "G*****",
    "email": "pr****@re*****.com",
    "ip": "177.***.***.***",
    "phone": "33********",
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
    "browser_info": {
      "language": "en-US",
      "color_depth": "1",
      "java_enabled": true,
      "screen_width": 564,
      "accept_header": "*/*",
      "screen_height": 200,
      "java_script_enabled": true
    }
  },
  "items": [
    {
      "price": 1000,
      "quantity": 1,
      "description": "Producto o servicio"
    }
  ],
  "payment_mode": "single",
  "order_status": "inactive",
  "payment_status": "paid",
  "created_at": "01/07/2024 21:16:38",
  "merchant": {
    "name": "Merchant Test",
    "slug": "merchant-test",
    "logo": "<img src=\"https://hotelpay-merchants.s3.us-east-2.amazonaws.com/logos/66673da2078ae\" alt=\"\" height=\"120\">",
    "billing_email": null,
    "reservation_email": "pa***@re*****.com",
    "reservation_email_bcc": null,
    "bg_color": "#d16363",
    "text_color": "#ba6a6a",
    "address": "Tiburon, -, -, Guadalajara, Jalisco, CP 32400",
    "address_phone": null,
    "contact_info": "<p>Llámanos al</p>",
    "pictures": []
  },
  "transactions": [
    {
      "priority": "primary",
      "kind": "card",
      "amount": 1000,
      "card_address": {
        "address": "Av ******** 1995",
        "city": "Guadalajara",
        "country": "México",
        "country_code": "MX",
        "zip": "123456",
        "address2": null,
        "state": "Jalisco"
      },
      "card": {
        "bin": "400000",
        "type": "credit",
        "brand": "visa",
        "bank_name": "Intl Hdqtrs-Center Owned",
        "last_4_digits": "0051",
        "country_code": "US",
        "url_brand": "https://testing.hotelpay.net/storage/img/brands/flats/visa.svg"
      },
      "card_info": {
        "holder_name": "Alex",
        "expiration": "12/2030"
      },
      "installment": "1",
      "monthly": "$1,000.00 MXN",
      "status": "capture",
      "descriptor": "HOTELPAY"
    }
  ],
  "transaction_template": [
    {
      "BRAND": "visa",
      "CARD_ICON": "https://testing.hotelpay.net/storage/img/brands/flats/visa.svg",
      "TYPE": "credit",
      "LAST_4_DIGITS": "0051",
      "HOLDER_NAME": "Alex",
      "MERCHANT_DESCRIPTOR": "HOTELPAY",
      "INSTALLMENT": "1",
      "MONTHLY": "$1,000.00 MXN"
    }
  ],
  "holder_name_diff": true,
  "payment_adds": {
    "date": "01/07/2024 21:16",
    "amount": "$1,000.00 MXN"
  }
}

Campos importantes

  • uuid: Identificador único de la transacción.
  • reference: Corresponde al referenceId proporcionado en los parámetros del enlace de pago.
  • booking_number: Corresponde al booking_number proporcionado en los parámetros del enlace de pago.
  • amount: Monto total de la transacción.
  • currency: Moneda de la transacción.
  • checkin y checkout: Fechas de entrada y salida.
  • payment_status: Estado del pago (en este caso, "paid").
  • transactions: Detalles de la transacción, incluyendo información de la tarjeta utilizada.

Notas adicionales

  • Los parámetros deben ser pasados con sus tipos nativos de JSON:
    • Valores numéricos (guests, rooms, total, etc.) - Ejemplo: 2 (número)
    • Valores booleanos (disable_inputs) - Ejemplo: true o false (booleano)
    • Strings (checkin, checkout, currency, etc.) - Ejemplo: "2024-07-15" (string)
    • Objetos (installments_config) - Como objeto JSON con sus propiedades tipadas correctamente
  • Formatos de fechas:
    • Entrada (parámetros): Las fechas checkin y checkout deben estar en formato "YYYY-MM-DD" (ej: "2024-07-15")
    • Salida (webhooks): Las fechas se devuelven en formato "DD/MM/YYYY" (ej: "15/07/2024")
  • El código de moneda debe ser un string válido (por ejemplo, "MXN" para pesos mexicanos).
  • Las URL de éxito y fallo deben ser URLs válidas y completas, incluyendo el protocolo (http:// o https://).
  • Es responsabilidad del desarrollador asegurar que los cálculos de subtotal, impuestos, descuentos y total sean correctos antes de generar el enlace.

Seguridad

  • No incluya información sensible adicional en los parámetros, ya que estos pueden ser decodificados.
  • Considere implementar medidas de seguridad adicionales, como firmas digitales o tokens de un solo uso, para prevenir la manipulación de los enlaces.
  • Asegúrese de que las URL de éxito y fallo (url_success y url_failure) sean URLs válidas y seguras dentro de su dominio.

Soporte:

Si tiene dudas sobre la configuración o el funcionamiento del webhook, puede solicitar apoyo al equipo de soporte de Hotelpay a través del correo electrónico soporte@hotelpay.com.

Esperamos que esta información te sea útil.