Connect es la solución más ágil y sencilla de implementar ya que permite incluir la aceptación de pagos en un sitio web con poco desarrollo.
Consiste en insertar un formulario HTML con los parámetros de la transacción a realizar y enviarlo a nuestro Gateway. El proceso de cobro es gestionado completamente por Fiserv por lo que no necesitas construir la pasarela de pagos por tu cuenta, ya que la herramienta se encuentra completamente certificada.
Puedes embeber la pasarela de pagos en un IFRAME dentro de tu sitio o redirigir al cliente en el navegador para procesar la transacción. Si optas por integrar con IFRAME el cliente nunca abandonará tu sitio web.
Los formularios de pago son personalizables en el ambiente productivo a través de la herramienta de Virtual Terminal, con lo cual podremos modificar colores y agregar logotipos para que se amolden más al estilo de nuestro comercio.
VirtualTerminal>Customization>Customize the design of your hosted payment forms>Combined page
Listo ¡has decidido que Connect es la solución para tu comercio! A continuación los pasos a seguir:
A continuación, los pasos para el desarrollo.
Cada una de las transacciones realizadas a través de la solución Connect requiere incluir un hash de seguridad para poder garantizar la integridad del mensaje en nuestro servidor.
Para ello necesitaremos como mínimo los siguientes parámetros dentro de nuestro formulario HTML en el siguiente orden (es posible que según la operación se requieran más parámetros).
Nombre del parámetro | Definición | Ejemplo |
---|---|---|
Chargetotal | Este es el monto total de la transacción utilizando un punto o una coma como separador decimal | 13.00 |
checkoutoption | Establezca el valor de este parámetro en "combinedpage" combinedpage para una integración de página de pago estándar. |
|
currency | El código ISO numérico de la moneda de la transacción. 484 es el código de pesos mexicanos, 840 USD. | 484 |
hash_algorithm | Esto es para indicar el algoritmo que utiliza para el cálculo de hash. Los valores posibles es: HMACSHA256. | HMACSHA256 |
responseFailURL | La URL a la que desea dirigir a los clientes después de una transacción o exitosa | https://localhost:8643/webshop/response_success.jsp |
storename | Es el StoreId que te proporcionaremos por correo, siempre inicia con 62 | 62666666 |
timezone | Zona horaria de la transacción en formato Área/Ubicación según el formato IANA | America/Mexico_City |
txndatetime | YYYY:MM:DD-hh:mm:ss tiempo exacto de la transacción (formato 24 hrs). No se debe usar un valor fijo Siempre debe coincidir con el timezone especificado | 2022:05:11-12:32:45 |
txntype | 'sale’, 'preauth’, 'postauth’, or ‘payer_auth’ | sale |
sharedsecret | Esta es la llave utilizada que te hemos compartido para calcular el hash | TopSecret |
Paso 1 - El Hash necesita ser calculado utilizando TODOS los parámetros que vayas a enviar.
Crea una lista de todos los parámetros a enviar y ordénalos alfabéticamente según el nombre del parámetro (exceptuando sharedsecret y hashExtended).
Con la lista de parámetros ordenada, se debe unir los valores de los parámetros separados por pipes “|” para generar un único string.
stringForExtendedHash =
13.00|combinedpage|978|HMACSHA256|https://localhost:8643/webshop/response_failure.jsp|https
//localhost:8643/webshop/response_success.jsp|10123456789|Europe/Berlin|2021:09:0616:43:04|sale
Paso 2 – Debemos encriptar el string creado con anterioridad a usando el algoritmo HMCASHA256 y con el SharedSecret que te fue compartido como la llave para generar el valor calculado del Hash.
Es importante que el valor obtenido de esta operación se mantenga como binario sin formato y no se convierta a un string ya que esto podría ocasionar problemas en el segundo paso.
HmacSHA256(stringToExtendedHash, sharedsecret)
En php la sintaxis correcta para este paso es incluir el parámetro raw_output como true. Cuando se establece en true la salida serán datos binarios sin formato:
hash_hmac("sha256", stringToExtendedHash, sharedsecret, true)
Paso 3 - Codificar el valor retornado del algoritmo HMACSHA256 usando Base64, este valor es el que podrás utilizar para el parámetro hashExtended dentro del formulario HTML a enviar.
Base64:
EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8="/>
Una muy buena práctica de seguridad también es validar el hash obtenido a la respuesta de cada transacción. Esto para validar que la integridad del mensaje se haya conservado a la hora de obtener una respuesta.
Para ello realizaremos los siguientes pasos:
Este es el parámetro que nos ayudará a identificar cada una de nuestras transacciones. Por default, no hace falta agregarlo dentro del formulario ya que el gateway automáticamente genera este campo y nos lo regresa en la respuesta como "oid".
Ejemplo: C-424d61f0-2225-4ec8-b2e0-db2a8f926422
Sin embargo, si nosotros deseamos utilizar nuestro propio "oid" es posible enviarlo en el formulario de la siguiente manera, no debemos olvidar agregar también este parámetro en el cálculo del hash:
<input type="hidden" name="oid" value="yourOrderId" />
Tiene un límite de 78 caracteres con los siguientes rangos de caracteres permitidos A-Z, a-z, 0-9, "-".
Cabe recalcar que para cada transacción necesitamos generar un “oid” único para asegurar una correcta identificación de cada transacción (sin importar si fuera aprobada o declinada) y también asegurarnos de que el usuario no pueda reutilizar un “oid” ya que en este caso obtendremos un error.
A continuación, un formulario que representa una venta de $100.00 MXN que se está realizando el día 02 de enero de 2020 a las 12:51:05 PM que se está efectuando sobre la tienda con ID 399000002. Al finalizar la transacción, el comprador es redirigido a las URLs especificadas en responseFailURL o responseSuccessURL.
<form method="POST" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="sale" />
</form>
Si quieres embeber tu formulario dentro de un iframe considera los siguientes pasos:
1.Agrega el siguiente fragmento de código javascript a tu página de "Checkout". De esta forma podrás recibir la notificación de las transacciones realizadas y redirigir al comprador a la página de "ÉXITO" o de "ERROR".
window.addEventListener( "message", receiveMessage, false) ;
function receiveMessage(event) { if (event.origin "https://test.ipg-online.com") return; var elementArr = event.data.elementArr;
forwardForm(event.data, elementArr);
}
function forwardForm( responseobj, elementArr) { var newForm = document.createElement ("form");
newForm.setAttribute('method', ' post ') ;
newForm.setAttribute('action ', responseObj.redirectURL); newForm.setAttribute('id', 'newForm '); newForm.setAttribute('name', 'newForm'); document.body.appendChiId(newForm) ;
for (var i = 0; i < elementArr.length; i++) { var element = elementArr[i];
var input = document.createElement(' input' ) ; input.setAttribute( 'type ' , 'hidden '); input.setAttribute( ' name ' , element.name) ; input.setAttribute( ' value ' , element.value) ;
document.newForm.appendChiId (input) ;
}
document.newForm.submit( ) ;
}
2. Crea un formulario de pago simple con HTML dentro de tu sitio Web y en la página de "Checkout". Donde, adicionalmente a los parámetros de Venta directa, agregaremos el atributo target al elemento form y el parámetro parentUri.
<form method="POST" target="myFrame" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" />
<input type="hidden" name="parentUri" value="URL WHERE IFRAME IS LOADED" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="sale" />
</form>
<iframe name="myFrame"></iframe>
Para saber cómo mapear correctamente las respuestas de nuestras transacciones consulta la siguiente guía haciendo click aquí.
Además de Ventas directas Connect ofrece la funcionalidad de poder procesar las siguientes transacciones.
Es importante mencionar que en caso de requerir alguno de estos servicios se le haga mención hacia el equipo de integraciones de Fiserv para que el servicio sea agregado a la hora de la generación de la tienda.
Para hacer una venta a meses sin intereses, es prácticamente igual que una Venta Directa con la diferencia de que agregaremos dos parámetros adicionales a nuestro formulario HTML los cuales deben ser considerados a la hora de generar el hash.
El formulario a continuación, representa una venta de $100.00 MXN que se está realizando el día 02 de enero de 2020 a las 12:51:05 PM que se está efectuando sobre la tienda con ID 399000002.
Adicionalmente se agregaron dos parámetros: numberOfInstallments, que representan el número de meses a pagar y installmentsInterest que indica si se aplicarán intereses, siempre usaremos el valor de "false".
<form method="POST" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" />
<input type="hidden" name="installmentsInterest" value="false" /> <input type="hidden" name="numberOfInstallments" value="6" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="sale" />
</form>
Para hacer una venta y tokenizar una tarjeta es prácticamente igual que una Venta Directa con la diferencia de que agregaremos un parámetro adicional a nuestro formulario HTML, assignToken con el valor true, el cual debe ser considerado a la hora de generar el hash.
De esta forma, al procesar satisfactoriamente una transacción, obtendremos un token en la respuesta dentro del parámetro hosteddataid.
Este token quedará asociado dentro de nuestro Gateway a la tarjeta utilizada en la transacción. Es tu deber implementar la lógica para guardarlo dentro de tu base de datos y asociarlo a tu cliente.
<form method="POST" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="assignToken" value="true" />
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="sale" />
</form>
Al enviar el parámetro hosteddataid con un token previamente generado, únicamente se le solicitará al comprador ingresar el Código de Seguridad (CVV/CVV2) empleado para ese medio de pago; de esta forma el Gateway de IPG obtendrá los datos cifrados de la tarjeta y procesará la transacción.
<form method="POST" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" /> <input type="hidden" name="hosteddataid" value="TOKEN_TO_USE" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="sale" />
</form>
Por Connect también es posible programar que una misma venta se repita de forma automática un número finito de veces.
Para esto agregaremos parámetros adicionales a nuestro formulario HTML, los cuales deben ser considerados a la hora de generar el hash.
El formulario a continuación, representa una venta de $100.00 MXN que se está realizando el día 02 de enero de 2020 a las 12:51:05 PM que se está efectuando sobre la tienda con ID 399000002.
The documentation of every method exposed by this sdk can be found here.
<form method="POST" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" />
<input type="hidden" name="ponumber" value="PO02220202" />
<input type="hidden" name="recurringInstallmentCount" value="12" />
<input type="hidden" name="recurringInstallmentPeriod" value="month" />
<input type="hidden" name="recurringInstallmentFrequency" value="1" />
<input type="hidden" name="recurringComments" value="Comentarios adicionales de la transacción" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="sale" />
</form>
Los cargos recurrentes podrán ser cancelados desde la VT en Reportes/Recurrencias Activas identificando el oid o haciendo uso del API REST e identificando el ipgTransactionID que obtenemos a la respuesta.
Una preautorización es una venta en donde el monto en lugar de ser descontado de la cuenta del cliente final es retenido o congelado. Esto se refiere a que tu cliente podrá seguir viendo los fondos en su cuenta, pero no le será posible usarlos y este monto podrá aparecer en sus movimientos bancarios como pendiente, en tránsito o algún otro estatus similar dependiendo del banco de su tarjeta.
Para concretar una preautorización, debes generar la instrucción a través de la Virtual Terminal (forma manual) o dando la instrucción a través de nuestra API para que se efectúe el descuento del monto final, de modo que puedas recibir los fondos por parte del cliente. Es decir, confirmar que se realice el cobro al cliente o, por el contrario, solicitar que se cancele.
En este caso, el formulario va a ser exactamente igual al caso de Venta Directa. La única diferencia es que en lugar de usar el input "txntype" con el valor de "sale", utilizaremos el valor de "preauth".
A continuación, un formulario que representa una preautorización de $100.00 MXN que se está realizando el día 02 de enero de 2020 a las 12:51:05 PM que se está efectuando sobre la tienda con ID 399000002. Al finalizar la transacción, el comprador es redirigido a las URLs especificadas en responseFailURL o responseSuccessURL.
<form method="POST" action="https://test.ipg-online.com/connect/gateway/processing">
<input type="hidden" name="chargetotal" value="100.00" />
<input type="hidden" name="checkoutoption" value="combinedpage" />
<input type="hidden" name="currency" value="484" />
<input type="hidden" name="hash_algorithm" value="HMACSHA256" />
<input type="hidden" name="hashExtended"
value="EapafBqqOF6N/kch8USkHPGh+fwSko24h6FpQnQHfQ8=" />
<input type="hidden" name="responseFailURL" value="https://myurl.com/checkout/success" />
<input type="hidden" name="responseSuccessURL" value="https://myurl.com/checkout/error" />
<input type="hidden" name="storename" value="399000002" />
<input type="hidden" name="timezone" value="America/Mexico_City" />
<input type="hidden" name="txndatetime" value="2020:01:02-12:51:05" />
<input type="hidden" name="txntype" value="preauth" />
</form>
Si requerimos enviar información adicional junto con nuestra transacción, podremos hacerlo con “parámetros adicionales”. Estos serán pares llave/valor donde los valores no podrán exceder 100 caracteres, es posible siguiendo la siguiente sintaxis:
customParam_key=value
Ejemplo:
<input type = "hidden" name="customParam_color" value="green">
Se pueden enviar hasta 10 parámetros adicionales. Estos podrán verse tanto en el detalle de transacción en nuestra VT, como en la respuesta dentro de nuestras URL's especificadas.
Es importante mencionar que, si vamos a utilizar estos parámetros, no debemos olvidar incluirlos en el cálculo de nuestro hash.
Podemos hacer que la página muestre un desglose por ítems. Para ello, agregaremos parámetros con la siguiente nomenclatura:
"item" + [número de ítem]
pudiendo agregar hasta 99 ítems.
Para el valor de cada ítem separaremos con ";" los valores en el siguiente orden:
Id de item;description;quantity;item_total_price;item_total_price;0;0
Ejemplo:
Para agregar 2 ítems a desplegar agregaríamos los siguientes parámetros
<input type = "hidden" name="item1" value="1;Product1;1;100;100;0;0">
<input type = "hidden" name="item2" value="2;Product2;2;566;566;0;0">
Esto permitirá que los productos se desplieguen de la siguiente forma
No te preocupes aquí unas recomendaciones para tu desarrollo.
Primero que nada ¿en qué parte del desarrollo nos encontramos?
¿Qué situación describe tu problema?
Esto puede llegar a suceder gracias a diversos factores a continuación una lista de las causas más comunes:
Si nos enfrentamos a esta situación, revisemos que estamos obteniendo a la respuesta, podemos consultar la siguiente documentación (Manejo de Respuestas).
Adicional a ello aquí las explicaciones a los tipos de rechazos más comunes:
En ambiente de pruebas los rechazos más comunes se deben a que usemos números de tarjeta inválidos Recordemos que solo podremos procesar transacciones con tarjetas de prueba. En ocasiones estas pueden presentar intermitencias debido a que son utilizadas por múltiples comercios y es necesario darles mantenimiento. Si alguna no funciona recomendamos probar con otra diferente.
5426064000424979 | Germany/MC | Venta directa |
4035874000424977 | Germany/Visa | Venta directa |
4931580001642617 | MEX/VISA | Local venta directa y MSI |
5579220000000012 | MEX/MC | Local venta directa y MSI |
Tarjetas de prueba
Cuando nos encontramos en esta etapa, es importante recordar que no podremos utilizar tarjetas de prueba.
Casos con el código N:51:05-DECLINED son rechazos del emisor (banco), pueden deberse a que nuestra tarjeta no esté habilitada para transacciones por e-commerce. Últimamente hemos visto la siguiente tendencia, los bancos tienden únicamente a aceptar transacciones de ecommerce a través de sus tarjetas digitales reservando las físicas únicamente para transacciones en puntos de venta físicos. En todo caso debe consultarse con el banco.
Casos con el código N:91:91-PLEASE RETRY hacen referencia a que el sistema del banco no está disponible por el momento.
Casos con el código N:5101 hacen referencia a que el tarjetahabiente no realizó de manera correcta el proceso de autenticación. Este varía según el emisor puede ser haber introducido de manera errónea el código sms, haber fallado en hacer la autenticación en la app bancaria, etc.
Casos con el código N:5003 hacen referencia a que ya se había mandado un formulario con ese "oid" al gateway, pude suceder debido a un error en la integración o a que el tarjetahabiente interactúe con el comercio de manera errónea (abriendo múltiples pestañas, navegando hacia atrás) generando dos veces el mismo "oid", en ambos casos recomendamos revisar la integración.
En este caso, si aún no eres un comercio operando libremente en producción, te pedimos de favor enviar un correo a udi_lan@fiserv.com explicando tu situación, te recomendamos incluir la siguiente información para que puedan identificar a tu comercio de manera más eficiente:
En caso de tratarse de revisión de una transacción en específico, te recomendamos primero revisar la transacción en tu VT si es que ya te encuentras en un piloto productivo(https://www2.ipg-online.com/vt/login) y, si aún buscas asesoramiento, no olvides incluir en tu correo los siguientes datos:
En este caso te pedimos de favor enviar un correo a servicioacomercios@fiserv.com explicando tu situación. Te recomendamos incluir la siguiente información para que puedan identificar a tu comercio de manera más eficiente:
En caso de tratarse de revisión de una transacción en específico, te recomendamos primero revisar la transacción en tu VT (https://www2.ipgonline.com/vt/login) y, si aún buscas asesoramiento, no olvides incluir en tu correo los siguientes datos: