Servicio de Notificación Inmediata

ClickBank ofrece un Servicio de Notificación Instantánea que lo notifica de las transacciones dentro del sistema ClickBank para su cuenta. Le envía datos casi en tiempo real de los siguientes eventos:

  • Venta. La venta de un producto estándar o la inicial de uno recurrente.
  • Refacturación. La refacturación de un producto recurrente.
  • Reembolso. El reembolso de un producto estándar o recurrente.
  • Contracargo. El contracargo de un producto estándar o recurrente.
  • Cancelación de refacturación. La cancelación de un producto recurrente.
  • Anulación de cancelación de refacturación. La reversión de la cancelación de un producto recurrente, que haya realizado un representante de servicio de atención al cliente de ClickBank.
  • Transacciones de prueba. Las transacciones de prueba de los tipos antes mencionados, o la prueba de la función Notificación Instantánea que usted haya iniciado.

El servicio intenta publicar información mediante una PUBLICACIÓN DE FORMULARIO HTML a una URL especificada por usted. Cada publicación contiene un grupo de parámetros de URL relevantes a la transacción. La notificación está cifrada. Para habilitar el procesamiento, debe descifrarla utilizando la clave secreta y el vector de inicialización.

NOTA: este servicio está diseñado para el uso de programadores experimentados. Si no tiene experiencia en programación, necesitará la ayuda de un desarrollador antes de decidir habilitar las notificaciones instantáneas.

Este artículo incluye los siguientes temas:

Información general

Cuando se lo haya habilitado, el Servicio de Notificación Instantánea se activa cada vez que se cree una transacción o que se realice una acción respecto de una transacción en su cuenta de ClickBank. El flujo primario implica los siguientes pasos:

  1. Se produce una acción en el sistema ClickBank (como venta o refacturación).
  2. ClickBank cifra una notificación utilizando su clave secreta y un vector de inicialización.
  3. ClickBank publica los parámetros de FORMULARIO HTML en la URL que usted haya especificado.
    Su URL debería utilizar los protocolos seguridad de la capa de transporte (TLS) o capa de conexión segura (SSL).
  4. ClickBank utiliza un monitoreo del código de respuesta para verificar que se haya recibido la notificación.
  5. La aplicación que usted haya creado descifra el mensaje (con una clave secreta y el vector de inicialización) y procesa los parámetros de publicación.

Es simple configurar el servicio en su cuenta de ClickBank. Sin embargo, también es necesario que cree una aplicación que procese los parámetros de URL de la notificación instantánea, una tarea más técnica. Para aprovechar al máximo este servicio, su aplicación, por lo menos, debe descifrar el mensaje y procesar los parámetros descritos en la sección Parámetros de este documento.

Si no entiende estos pasos, le recomendamos que solicite los servicios de un desarrollador que pueda ayudarlo. Si implementa las notificaciones instantáneas de forma incorrecta, podemos inhabilitar o eliminar la función de su cuenta.

Versión actual

La función Notificación Instantánea se encuentra en la versión 6.0.

Entre las nuevas características de esa versión, cabe destacar las siguientes:

  • Notificaciones cifradas.
  • Parámetros que indican cuál fue el tipo de pedido que se incluyó en la compra (por ejemplo, una venta adicional o un adicional del pedido).
  • Parámetros de cantidad.
  • Parámetros variables específicos del vendedor.

Formato de la notificación

Esta sección describe el formato de la notificación instantánea enviada.

Estructura básica

Las notificaciones instantáneas se crean en el formato JSON. Se cifran antes del envío.

Esta es la estructura básica de una notificación instantánea;

{"notification": "<ENCRYPTED_NOTIFICATION>", "iv": "<INITIALIZATION_VECTOR>"}

Cifrado

ClickBank utiliza el algoritmo de cifrado CBC-AES-256 para proteger la carga (payload) de la notificación. Esto ayuda a evitar que la información del cliente se transmita en texto sin cifrar y permite que el destinatario sepa que el mensaje se originó en ClickBank, sin alteraciones durante la entrega. La notificación se cifra utilizando una clave secreta, de hasta 16 caracteres, y un vector de inicialización.

Encontrará varios ejemplos de cómo descifrar la notificación en la sección Ejemplos de código, pero debe familiarizarse con el algoritmo de cifrado AES-256 para entender mejor su funcionamiento.

El mensaje JSON inicial contiene una representación de cadenas de la notificación cifrada y el vector de inicialización que puede utilizar en paralelo con su clave secreta de ClickBank para descifrar la notificación.

Parámetros

Esta sección describe los parámetros utilizados en una notificación.

Cuando se envía una notificación, esta incluye todos los parámetros. Si un parámetro está vacío, la cadena de notificación instantánea contiene la etiqueta sin ningún valor. Este el motivo por el cual la cantidad de caracteres de algunos parámetros incluyen el cero, ya que pueden no incluir ningún valor.

Parámetros del encabezado

Parámetro

Descripción

Caracteres/formato

Destinatario

transactionTime

Hora de transacción en formato RFC-3339

25

Todos

receipt

Id. de recibo de ClickBank

8-21

Todos

transactionType

Tipo de transacción

4-15. Consulte Tipos de transacción

Todos

vendor

Nombre de usuario del vendedor

5-10

Todos

affiliate

Nombre de usuario del afiliado

5-10

Todos

role

Su papel en la transacción

6-9. VENDOR, AFFILIATE, or JV_VENDOR

Todos

totalAccountAmount

Total en USD que recibió por la transacción

Valor numérico con precisión de 2 decimales

Todos

paymentMethod

Método de pago utilizado por el cliente

3-4. Consulte Métodos de pago

Todos

totalOrderAmount

Total del cargo cobrado al cliente

Valor numérico con precisión de 2 decimales

Todos

totalTaxAmount

Total que pagó el cliente por impuestos

Valor numérico con precisión de 2 decimales

Vendedor

totalShippingAmount 

Total que pagó el cliente por el envío

Valor numérico con precisión de 2 decimales

Vendedor

currency

Moneda en la que pagó el cliente

3

Vendedor

orderLanguage

Idioma utilizado en el formulario de pedido

2. DE, EN, ES, FR, IT, or PT

Vendedor

trackingCodes

Todos los códigos de seguimiento enviados al formulario de pedido.

0-24 por cada uno

Vendedor, afiliado

Parámetros del producto

Parámetro

Descripción

Caracteres/formato

Destinatario

itemNo

SKU del producto pedido

1-10

Todos

productTitle

Nombre del producto

0-255

Todos

shippable

Si el producto era un producto físico

4-5. true o false

Todos

recurring

Si el producto estaba basado en una suscripción

4-5. true o false

Todos

accountAmount

Monto que recibió por esta línea de artículo

Valor numérico con precisión de 2 decimales 

Todos

quantity

Cantidad de artículos comprados

Valor numérico

Todos

downloadUrl

URL de descarga del producto para el cliente

0-255

Vendedor

lineItemType

El tipo de pedido de la línea de artículo fue parte de

4-8. ORIGINAL, CART, BUMP, TOKEN, or UPSELL

Todos

Parámetros de envío del cliente

Parámetro

Descripción

Caracteres

Destinatario

firstName

Nombre del cliente

0-255

Vendedor

lastName

Apellido del cliente

0-255

Vendedor

fullName

Nombre y apellido del cliente

0-255

Vendedor

phoneNumber

Número de teléfono del cliente

0-255

Vendedor

email

Dirección de correo electrónico del cliente

0-255

Vendedor

address1

Domicilio del cliente, línea 1

0-255

Vendedor

address2

Domicilio del cliente, línea 2

0-255

Vendedor

city

Ciudad del cliente

0-255

Vendedor

county

Condado del cliente

0-255

Vendedor

state

Estado del cliente

0-255

Vendedor

postalCode

Código postal del cliente

0-255

Vendedor

country

País del cliente

0-255

Vendedor

Parámetros de facturación del cliente

Parámetro

Descripción

Caracteres

Destinatario

firstName

Nombre del cliente

0-255

Vendedor

lastName

Apellido del cliente

0-255

Vendedor

fullName

Nombre y apellido del cliente

0-255

Vendedor

phoneNumber

Número de teléfono del cliente

0-255

Vendedor

email

Dirección de correo electrónico del cliente

0-255

Vendedor

state

Estado del cliente

0-255

Todos

postalCode

Código postal del cliente

0-255

Todos

country

País del cliente

0-255

Todos

Parámetros de la venta adicional

Parámetro

Descripción

Caracteres

Destinatario

upsellOriginalReceipt

Número de recibo que inició el flujo de venta adicional

8-21

Todos

upsellFlowId

Id. del flujo de venta adicional

Entero

Vendedor

upsellSession

Id. de sesión para la venta adicional

0-16

Vendedor

upsellPath

Ruta de acceso de venta adicional

0-12

Vendedor

Parámetros de Pytch

NOTA: la función de Pytch es obsoleta, pero los parámetros se mantienen con fines de compatibilidad hacia atrás.

Parámetro

Descripción

Caracteres/formato

Destinatario

hopfeedClickId

Nombre de id. del clic de Hopfeed 

Cadena 

Todos

hopfeedApplicationId

Id. de la aplicación

Valor numérico 

Todos

hopfeedCreativeId

Id. creativo 

Valor numérico 

Todos

hopfeedApplicationPayout

Pago de la aplicación 

Valor numérico con precisión de 2 decimales 

Todos

hopfeedVendorPayout

Pago al vendedor 

Valor numérico con precisión de 2 decimales 

Todos

Parámetros técnicos

Parámetro

Descripción

Formato

Destinatario

version

La versión de Notificación Instantánea.

Numérico doble

Todos

attemptCount

La cantidad de veces que ClickBank intentó enviar esta notificación antes de recibir un mensaje de envío correcto o fallido con demasiados intentos

Entero

Todos

Parámetros del vendedor

Si el vendedor suministró variables adicionales al enlace de pago, también se muestran en la notificación como parámetros v1, v2, etc.

Tipos de transacción

Hay numerosos valores que usted puede recibir en el parámetro Tipo de transacción. Estos valores se detallan debajo con una breve descripción de su propósito.

NOTA: las notificaciones por las transacciones de prueba solo se envían al vendedor.

Tipo

Descripción

SALE

La compra de un producto estándar o la compra inicial de un producto de facturación recurrente.

BILL

La refacturación de un producto de facturación recurrente.

RFND

El reembolso de un producto de facturación estándar o de facturación recurrente. Los productos de facturación recurrente que se reembolsan darán como resultado una transacción “CANCEL-REBILL”.

CGBK

El contracargo de un producto estándar o recurrente.

INSF

El contracargo de un cheque electrónico de un producto estándar o recurrente.

CANCEL-REBILL

La cancelación de un producto de facturación recurrente. Los productos de facturación recurrente que se cancelan no causarán ninguna otra acción.

UNCANCEL-REBILL

La reversión de la cancelación de un producto de facturación recurrente.

TEST

Una transacción de prueba activada durante la configuración.

TEST_BILL

Una refacturación de prueba de un producto de facturación recurrente.

TEST_RFND

Un reembolso de prueba de un producto estándar o de facturación recurrente.

TEST_SALE

Una compra de prueba de un producto estándar o de facturación recurrente.

CANCEL-TEST-REBILL

Una cancelación de prueba de un producto recurrente.

UNCANCEL-TEST-REBILL

Una reversión de cancelación de prueba de un producto recurrente.

Métodos de pago

Hay numerosos valores que usted puede recibir en el parámetro Método de pago. Estos valores se detallan debajo.

Parámetro del método de pago

Método de pago

PYPL

PayPal

VISA

Visa

MSTR

MasterCard

DISC

Discover

AMEX

American Express

SOLO

Solo

JCBC

JCB

DNRS

Diners Club

MAES

Maestro

ELV

Débito directo europeo

TEST

Pago de prueba

Ejemplo de notificación

Este es un ejemplo de la notificación JSON sin cifrar que muestra la estructura de los pares clave-valor para la versión 6.0 de Notificación Instantánea.

 {
    "transactionTime": "2016-06-05T13:47:51-06:00",
    "receipt": "CWOGBZLN",
    "transactionType": "SALE",
    "vendor": "testacct",
    "affiliate": "affiliate1",
    "role": "VENDOR",
    "totalAccountAmount": 0.00,
    "paymentMethod": "VISA",
    "totalOrderAmount": 0.00,
    "totalTaxAmount": 0.00,
    "totalShippingAmount": 0.00,
    "currency": "USD",
    "orderLanguage": "EN",
    "trackingCodes": [
        "tracking_code"
    ],
    "lineItems": [
        {
            "itemNo": "1",
           "productTitle": "Product Title",
            "shippable": false,
            "recurring": false,
            "accountAmount": 5.00,
            "quantity": 1,
            "downloadUrl": "<download_url>"
            "lineItemType": "CART"
      }         {
            "itemNo": "2",
           "productTitle": "Second Product",
            "shippable": false,
            "recurring": true,
            "accountAmount": 2.99,
            "quantity": 1,
            "downloadUrl": "<download_url>"
            "lineItemType": "CART"
      }
   ],
    "customer": {
        "shipping": {
            "firstName": "TEST",
            "lastName": "GUY",
            "fullName": "Test Guy",
            "phoneNumber": "",
            "email": "test@example.net",
            "address": {
                "address1": "12 Test Lane",
                "address2": "Suite 100",
                "city": "LAS VEGAS",
                "county": "LAS VEGAS",
                "state": "NV",
                "postalCode": "89101",
                "country": "US"
            }
        },
        "billing": {
            "firstName": "TEST",
            "lastName": "GUY",
            "fullName": "Test Guy",
            "phoneNumber": "",
            "email": "test@example.net",
            "address": {
                "state": "NV",
                "postalCode": "89101",
                "country": "US"
            }
        }
    },
    "upsell": {
        "upsellOriginalReceipt": "XXXXXXXX",
        "upsellFlowId": 55,
        "upsellSession": "VVVVVVVVVV",
        "upsellPath": "upsell_path"
    },
    "hopfeed": {
        "hopfeedClickId": "hopfeed_click",
        "hopfeedApplicationId": 0000,
        "hopfeedCreativeId": 0000,
        "hopfeedApplicationPayout": 0.00,
        "hopfeedVendorPayout": 0.00
    },
    "version": 6.0,
    "attemptCount": 1,
    "vendorVariables": {
       "v1": "variable1", 
       "v2": "variable2" 
    }
}

Implementación

Una vez que haya entendido bien la sección anterior de este documento, puede solicitar acceso a la función Notificación Instantánea, probar su URL y activar notificaciones instantáneas.

Cuando haya configurado una URL para las notificaciones instantáneas, puede agregar otra mediante estos procedimientos con el campo Notificación Instantánea 2.

Solicitud de acceso a Notificación Instantánea

La función Notificación Instantánea no se habilita automáticamente. Para solicitar acceso, siga estos pasos:

  1. Inicie sesión en su cuenta.
  2. Haga clic en la pestaña Configuración.
  3. Haga clic en Mi sitio.
  4. Ubique la sección Herramientas avanzadas y haga clic en Editar.
  5. Haga clic en el enlace Solicitar acceso al lado del campo URL de Notificación Instantánea.
  6. Complete el formulario, revise detenidamente los términos de uso y reconozca que los ha leído y está de acuerdo con ellos.
  7. Haga clic en el botón Guardar cambios y solicitar acceso a la API en la parte inferior del formulario.
  8. Haga clic en el botón Guardar cambios.

Configuración de la URL

Una vez que haya recibido acceso a la función Notificación Instantánea, debe crear una URL de destino y un programa que procese las notificaciones que reciba. Puede utilizar los puertos 80 o 443.

Seguridad de la capa de transporte (TLS) y capa de conexión segura (SSL)

Se recomienda encarecidamente que utilice esta función con los protocolos habilitados de seguridad de la capa de transporte (TLS) y capa de conexión segura (SSL). Utilizar esta función sin TLS y SSL habilitados puede exponer sus datos de venta a ladrones. Sin embargo, debido a que la información bancaria y de tarjetas de crédito no se transmite a través del Servicio de Notificación Instantánea, no es obligatorio que utilice TLS o SSL para cifrar las transmisiones de notificaciones instantáneas.

NOTA: no puede utilizar un certificado SSL autofirmado. Debe utilizar un certificado válido.

Probar la conectividad y el procesamiento

Antes de que pueda habilitar Notificación Instantánea, debe probar la conectividad y el procesamiento correcto de los parámetros de URL entre ClickBank y su servidor. Para realizar esta prueba, siga estos pasos.

  1. Inicie sesión en su cuenta.
  2. Haga clic en la pestaña Configuración.
  3. Haga clic en Mi sitio.
  4. Ubique la sección Herramientas avanzadas y haga clic en Editar.
  5. Introduzca su URL en el campo URL de Notificación Instantánea.
    NOTA: no haga clic en Guardar cambios.
  6. Haga clic en Probar a la derecha de la URL.
    Se envía una notificación de prueba con el recibo ******** y el tipo de transacción TEST.
  7. Revise la respuesta en la ventana emergente para comprobar que no tuvo errores.

Si la prueba tuvo errores, quite la URL del campo Notificación instantánea y solucione los problemas de conectividad o de su aplicación.

NOTA: no debe rellenar el campo Notificación instantánea a menos que pueda llevar a cabo una prueba sin errores. De lo contrario, es posible que se deshabilite el acceso a la función.

Habilitar Notificación Instantánea

Cuando ya tenga acceso a la función y haya realizado una prueba sin errores, puede habilitar las notificaciones instantáneas para recibirlas. Para habilitar las notificaciones instantáneas, debe hacer lo siguiente:

  1. Inicie sesión en su cuenta.
  2. Haga clic en la pestaña Configuración.
  3. Haga clic en Mi sitio.
  4. Ubique la sección Herramientas avanzadas y haga clic en Editar.
  5. Ingrese su clave secreta en el campo Clave secreta. Puede tener hasta 16 caracteres, todos en mayúsculas. Consulte la sección Cifrado para obtener más información.
  6. Introduzca su URL en el campo URL de Notificación Instantánea.
  7. Haga clic en Probar a la derecha de la URL.
    Se envía una notificación de prueba con el recibo ******** y el tipo de transacción  TEST.
  8. Revise la respuesta en la ventana emergente para comprobar que no tuvo errores.
  9. Haga clic en Guardar cambios.

Una vez finalizada la configuración, las transmisiones de notificaciones instantáneas comenzarán inmediatamente.

Deshabilitar Notificación Instantánea

Si elimina la URL, deshabilitará la función y evitará que se envíen notificaciones. Puede volver a habilitar la función cuando lo prefiera.

  1. Inicie sesión en su cuenta.
  2. Haga clic en la pestaña Configuración.
  3. Haga clic en Mi sitio.
  4. Ubique la sección Herramientas avanzadas y haga clic en Editar.
  5. Elimine la URL del campo de URL de Notificación Instantánea.
  6. Haga clic en Guardar cambios.

Monitoreo del código de respuesta

Cuando enviamos una notificación instantánea, monitoreamos el código de respuesta de su URL. Si está en el rango 200, se considera que la notificación se entregó correctamente.

De lo contrario, intentaremos reenviar la notificación una vez por hora durante 72 horas. Después de 72 intentos fallidos, deshabilitaremos la URL. Una vez que diagnostique la causa de los errores, puede volver a habilitar su URL y seguir recibiendo notificaciones instantáneas.

Ejemplos de código

Los datos que se envían mediante el Servicio de Notificación Instantánea se encuentran en la forma de parámetros de PUBLICACIÓN DE FORMULARIO HTML en la URL. Los programas escritos dentro de la arquitectura de la aplicación deben procesar estos pares. También pueden escribirse programas para la gestión de pedidos, la actividad de la base de datos y otros servicios, pero no están en el alcance de esta guía.

Los siguientes ejemplos de código cubren el descifrado de la notificación.

NOTA: los siguientes ejemplos de código deben estar anidados en un programa. Además, estas muestras fallarán si su conjunto de caracteres incluye caracteres alemanes, griegos, europeos orientales o asiáticos. Debe realizar su propia codificación antes de descifrar notificaciones instantáneas. Si no lo comprende, deberá encontrar un programador que pueda ayudarlo.

Java

El siguiente ejemplo de código utiliza Java para descifrar la notificación.

 public void processNotification(final HttpServletRequest theRequest,
                              final HttpServletResponse theResponse)
   throws IOException {
  try {
     final StringBuilder buffer = new StringBuilder();
    final String secretKey = "YOUR SECRET KEY";

     try {
       String line;
        final BufferedReader reader = theRequest.getReader();
         while(null != (line = reader.readLine())) {
          buffer.append(line);
         }
      } catch(final Exception ex) {
          ex.printStackTrace();
       }

       final JSONParser parser = new JSONParser();
       final JSONObject obj = (JSONObject) parser.parse(buffer.toString()); 

      final String initializationVector = (String) obj.get("iv");
       final String encryptedNotification = (String) obj.get("notification"); 
      final MessageDigest digest = MessageDigest.getInstance("SHA-1");
      digest.reset();
       digest.update(secretKey.getBytes("UTF-8"));
      final String key = new String(Hex.encodeHex(digest.digest())).substring(0, 32);

final IvParameterSpec iv =
          new IvParameterSpec(DatatypeConverter.parseBase64Binary(initializationVector));
       final SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
      final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
       cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);

      final JSONObject notification = (JSONObject) parser.parse(
      new String(cipher.doFinal(DatatypeConverter.parseBase64Binary(encryptedNotification)),
                     "ISO-8859-1"));

       //
       // Make use of the notification here...
      // 

   } catch(final NoSuchPaddingException
      | ParseException
       | NoSuchAlgorithmException
      | InvalidAlgorithmParameterException
       | BadPaddingException
      | IllegalBlockSizeException
       | UnsupportedEncodingException
      | InvalidKeyException ex) {
       ex.printStackTrace();
      theResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                             "Could not decrypt instant notification");
  }
    theResponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
}

PHP

El siguiente ejemplo de código utiliza PHP para descifrar la notificación.

<?php
// NOTA: deben instalarse librerías mcrypt y enumerarse como una
// extensión disponible en su phpinfo() para poder utilizar este
// método de descifrado.

$secretKey = "YOUR SECRET KEY"; // secret key from your ClickBank account

// get JSON from raw body...
$message = json_decode(file_get_contents('php://input'));

// Pull out the encrypted notification and the initialization vector for
// AES/CBC/PKCS5Padding decryption
$encrypted = $message->{'notification'};
$iv = $message->{'iv'};
error_log("IV: $iv");

// decrypt the body...
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
substr(sha1($secretKey), 0, 32),
base64_decode($encrypted),
MCRYPT_MODE_CBC,
base64_decode($iv)), "\0..\32");
error_log("Decrypted: $decrypted");

////UTF8 Encoding, remove escape back slashes, and convert the decrypted string to a JSON object...
$sanitizedData = utf8_encode(stripslashes($decrypted));
$order = json_decode($decrypted);

// Listo para todo: Si la decodificación de la cadena JSON
// tuvo errores, debe presumir que la notificación no estaba cifrada
// con su clave secreta.

?>

Python

El siguiente ejemplo de código utiliza Python para descifrar la notificación.

import hashlib
import json
from Crypto.Cipher import AES
##
# Parse ClickBank Notification
# @param message: A string representing the raw HTTP POST body
# @return: A JSON object representing the decrypted notification
def process_clickbank_notification(message):
    j = json.loads(message)
    iv = j['iv']
    encrypted_str = j['notification']
    sha1 = hashlib.sha1()
    sha1.update("YOUR SECRET KEY")
    cipher = AES.new(sha1.hexdigest()[:32], AES.MODE_CBC, iv.decode('base64'))
    return cipher.decrypt(encrypted_str.decode('base64')).strip()

Ruby

El siguiente ejemplo de código utiliza Ruby para descifrar la notificación.

require "base64"
require "digest/sha1"
require "json"
require "openssl"
 # Decode the IPN post into a JSON object.
# The message param is the raw HTTP POST
 # body of the notification
def decrypt_clickbank_notification(message)
  parsed = JSON.parse(message);
  aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
  aes.iv = Base64.decode64(parsed["iv"])
  aes.decrypt
  aes.key = Digest::SHA1.hexdigest("YOUR SECRET KEY").slice(0, 32)
  aes.update(Base64.decode64(parsed["notification"])) + aes.final
end
¿Tiene más preguntas? Enviar una solicitud

0 Comentarios

Inicie sesión para dejar un comentario.
Tecnología de Zendesk