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
- Inicio de la transacción: El usuario inicia el proceso en el Sistema Integrador.
- Generación del enlace de pago: El Sistema Integrador genera un enlace de pago único y lo proporciona al usuario.
- Acceso a la página de pago: El usuario accede a la página de pago a través del enlace proporcionado.
- Ingreso de datos de pago: El usuario ingresa sus datos de pago en la página.
- Procesamiento del pago: Los datos se envían al Procesador de Pagos para su procesamiento.
- 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.
- Si el pago es exitoso:
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:hotelpara hoteles omerchantpara 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:
-
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.
- URL base:
-
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.
- URL base:
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 | Sí |
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) | Sí |
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") | Sí |
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") | Sí |
quantity |
number | Cantidad del elemento | Sí |
price |
number | Precio unitario del elemento | Sí |
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:
- Reducir fraudes: La validación AVS compara la dirección proporcionada con la registrada en el banco emisor.
- Mejorar tasas de aprobación: Proporcionar una dirección correcta aumenta la probabilidad de que la transacción sea aprobada.
- 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:
-
Total vs. Subtotal, Taxes, y Discounts:
- Si se proporciona el parámetro
total, los parámetrossubtotal,taxes, ydiscountsserán ignorados. - Si no se proporciona
total, se calculará automáticamente sumandosubtotalytaxes, y restandodiscounts. - Es recomendable proporcionar o bien
total, o bien el conjunto desubtotal,taxes, ydiscounts.
- Si se proporciona el parámetro
-
Valores por defecto:
- Todos los parámetros numéricos (
guests,rooms,total,subtotal,taxes,discounts) tienen 0 como valor por defecto. - El parámetro
currencytiene "MXN" como valor por defecto. - El parámetro
languagetiene "es" como valor por defecto.
- Todos los parámetros numéricos (
-
URLs de éxito y fallo:
- Si no se proporcionan
url_successourl_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.
- Si no se proporcionan
-
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 camporeference.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 campobooking_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
- Crear un objeto JSON con los parámetros requeridos.
- Convertir el objeto JSON a una cadena.
- Codificar la cadena JSON en Base64.
- Codificar el resultado Base64 para URL (reemplazando caracteres no seguros).
- 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:
-
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.
-
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.
-
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 alreferenceIdproporcionado en los parámetros del enlace de pago.booking_number: Corresponde albooking_numberproporcionado en los parámetros del enlace de pago.amount: Monto total de la transacción.currency: Moneda de la transacción.checkinycheckout: 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:
trueofalse(booleano) - Strings (checkin, checkout, currency, etc.) - Ejemplo:
"2024-07-15"(string) - Objetos (installments_config) - Como objeto JSON con sus propiedades tipadas correctamente
- Valores numéricos (guests, rooms, total, etc.) - Ejemplo:
- Formatos de fechas:
- Entrada (parámetros): Las fechas
checkinycheckoutdeben 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")
- Entrada (parámetros): Las fechas
- 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.