Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 1 de 23 17/02/2016
INFORMACIÓN TÉCNICA
SOBRE
COMERCIO ELECTRÓNICO
VISA CHECKOUT
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 2 de 23 17/02/2016
INDICE
1. OBJETIVO ............................................................................................................................. 3
2. CONFIGURACIÓN DE DEVICE FINGERPRINT EN LA PÁGINA WEB DEL COMERCIO . 3
1.1 DATOS PARA LA INTEGRACIÓN .................................................................................... 3
1.2 INCLUIR FUNCIÓN DE CAPTURA DE DEVICE FINGERPRINT EN LA PÁGINA WEB 3
1.3 PROCESO DE INVOCACIÓN............................................................................................ 4
2 PROCESO DE CONFIGURACIÓN DE VISA CHECKOUT .................................................. 5
2.1 DATOS PARA LA INTEGRACIÓN .................................................................................... 5
2.2 INCLUIR BOTÓN DE VISA CHECKOUT EN LA PÁGINA. .............................................. 5
2.3 PREVENCIÓN CLICKJACKING ....................................................................................... 6
2.4 CONTROLAR LAS OPERACIONES DE VISA CHECKOUT LIGHTBOX ........................ 6
2.3.1. MANEJADOR DE EVENTOS V.INIT ............................................................................. 6
2.3.2. MANEJADOR DE EVENTOS V.ON ............................................................................... 8
2.5 MOSTRAR EL RESUMEN DE VISA CHECKOUT (DESENCRIPTAR) .......................... 10
2.5.1 DESENCRIPTAR .......................................................................................................... 10
2.5.2 MOSTRAR RESUMEN EN SU PÁGINA ...................................................................... 10
3 PROCESO DE AUTORIZACIÓN......................................................................................... 15
3.1 WEB SERVICE PARA TRANSACCIONES CON VISA CHECKOUT ............................ 15
3.2 MOSTRAR EL RESULTADO DE LA TRANSACCIÓN ................................................... 18
4 ANEXO 1 - EJEMPLO DE DESENCRIPTADO................................................................... 19
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 3 de 23 17/02/2016
1. Objetivo
Este documento tiene como objetivo describir los pasos a seguir por un comercio para la integración a Visa CheckOut, los cuales son:
1. Configuración de Device Fingerprint en la página web del comercio. 2. Configuración botón Visa CheckOut 3. Proceso de Autorización
Visa CheckOut es flexible en su forma de integrar, este documento muestra una forma resumida de este proceso, además de un mínimo esfuerzo requerido. Para acceder a información adicional deberá ponerse en contacto con el equipo de Visanet.
2. Configuración de Device Fingerprint en la página web del comercio
El Device Fingerprint permite recolectar información del dispositivo desde donde se está realizando el pago para la realización del análisis de prevención de fraude. A continuación describimos como se realizará la configuración de Device Fingerprint, para Visa CheckOut.
1.1 Datos para la integración
Utilizar la librería java Script [prd/dev]_dfp.js para controlar la operativa de Device Fingerprint en la página web. Existe una versión de integración y otra de producción:
Ambiente Archivo
Integración dev_dfp.js
Producción prd_dfp.js Ejemplo: <script src="prd_dfp.js" > </script> // archivo JavaScript
1.2 Incluir función de captura de Device Fingerprint en la página web
Colocar la siguiente función en el header de la página y configurar los valores indicados 1. codComercio: Código que VisaNet asigna al comercio cuando se registra en Comercio
Electrónico. 2. uuid: Identificador único que debe generar el comercio para cada transacción. Este valor
también se utilizará en el proceso de autorización. 3. numOrden: Número de orden del pedido de compra. Este valor también se utilizará en el
proceso de autorización. 4. cliente: IP del cliente (tarjetahabiente) que realiza la transacción pago.
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 4 de 23 17/02/2016
<script type="text/javascript">
function capturaDFP(){
var codComercio= "123456789"; //Código del comercio asignado por VisaNet. var uuid= "567"; //Identificador Único de la Transacción var numOrden= "123456"; //Número de Orden del Pedido var ipCliente= "192.168.1.1"; //IP del Cliente que accede a la página del comercio.
initDFP(uuid, numOrden, ipCliente, codComercio); }
</script>
Luego colocar el llamado al método “initDFP” en el evento onload de la página de pago. A continuación un ejemplo de invocación <body onload=” capturaDFP()” >
1.3 Proceso de Invocación
El comercio debe seguir los siguientes pasos para invocar al Device Fingerprint.
1. Capturar el IP del cliente. 2. Generar el UUID. 3. Generar el numOrden. 4. Invocar la función “initDFP” enviando los parámetros indicados, en el evento onload que se
encuentra en la misma página de pago.
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 5 de 23 17/02/2016
2 Proceso de configuración de Visa CheckOut
El siguiente paso para la integración es la configuración de Visa CheckOut, para ello debe añadir el botón de Visa CheckOut a su página web e incluir el JavaScript necesario para manejar los eventos asociados a este botón. 2.1 Datos para la Integración
Debe utilizar la librería java Script sdk.js para controlar la operativa de VCO en la página web. Existe una versión de prueba y otra en de producción:
Ambiente URL
Integración https://sandbox-assets.secure.checkout.visa.com/ checkout-widget/resources/js/integration/v1/sdk.js
Producción https://assets.secure.checkout.visa.com/ checkout-widget/resources/js/integration/v1/sdk.js
Ejemplo: <script type="text/javascript" src="https://sandbox-assets.secure.checkout.visa.com/checkout-widget/resources/js/integration/v1/sdk.js"> </script>
2.2 Incluir botón de Visa CheckOut en la página.
Debe usar la clase v-button img para invocar al botón Visa Checkout, el cual inicia el proceso de pago cuando el cliente da click.
Ambiente URL
Integración https://sandbox.secure.checkout.visa.com/wallet-services-web/xo/button.png
Producción https://secure.checkout.visa.com/wallet-services-web/xo/button.png
Ejemplo: <body>
... <img alt="..." class="v-button" role="button" src= "https://sandbox.secure.checkout.visa.com/wallet-services-web/xo/button.png?..." /> ... </body>
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 6 de 23 17/02/2016
2.3 Prevención Clickjacking
Para la prevención de ataques usando clickjacking, debe incluir en el header de cada página que aloje un botón de Visa CheckOut las siguientes líneas de código.
<head>
<style id="antiClickjack">body{display:none;}</style> <script type="text/javascript"> if (self === top) { var antiClickjack = document.getElementById("antiClickjack"); antiClickjack.parentNode.removeChild(antiClickjack); } else { top.location = self.location; } </script>
</head>
Este ataque ocurre si un código malicioso está oculto detrás de botones originales o en otros objetos a los cuales un usuario pueda hacerle click dentro de la página web. 2.4 Controlar las operaciones de Visa CheckOut lightbox
Deberá definir una función onVisaCheckoutReady, que incluya el manejador para los eventos de inicialización y compra. Esta función incluye 2 tipos de eventos:
Manejador de Evento Obligatorio Descripción
V.init Si Manejador de evento para la inicialización. Especifica los valores para la inicialización.
V.on Si Manejador de evento para la compra con Visa CheckOut. Especifica las acciones a tomar en los siguientes eventos de Visa CheckOut.
payment.success
payment.cancel
payment.error
2.3.1. Manejador de eventos V.init
El evento V.init se utiliza para especificar un objeto JSON que contiene los valores de inicialización de la librería de Visa CheckOut JavaScript. Debe especificar los valores de estas propiedades:
Propiedad Longitud Descripción Formato Obligatorio
apikey 100 Es el API Key que se obtiene cuando cree su cuenta en Visa CheckOut. Usará diferentes llaves: live key y sandbox key.
Alfanumérico
Si
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 7 de 23 17/02/2016
Parámetros
Propiedad Longitud Descripción Formato Obligatorio
locale Indica cómo se mostrará el texto en el lightbox de Visa CheckOut. Por defecto Visa CheckOut obtiene los datos de la configuración del browser para determinar la ubicación
en_PE - Peru, English
Si
countryCode Indica cómo se mostrará el texto en el lightbox de Visa CheckOut. Visa CheckOut determinará el país por medio de la dirección IP
PE No
logoUrl 256 URL que indica el logo a ser mostrado en el Visa CheckOut lightbox. Por defecto se muestra el logo de Visa CheckOut
HTTPS URL SI
displayName 100 Nombre del comercio, nombre de la compañía, el cual aparece como título de imagen
String No
websiteUrl URL del comercio No
shipping Propiedades: acceptedRegions: Limita la región de entrega. collectShipping: Para obtener la dirección de entrega del cliente
A list of ISO-3166-1 alpha-2 standard codes, such as US or CA. Format: uno de los siguientes valores • true – obtener la dirección del cliente (defecto) • false – La dirección de entrega no es requerida.
Si
payment Propiedades cardBrands: Visa como marca de tarjeta aceptada.
VISA
SI
dataLevel Nivel de información del cliente y del pago que la respuesta del evento payment.success debe incluir.
SUMMARY Si
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 8 de 23 17/02/2016
2.3.2. Manejador de eventos V.on
El evento V.on se utiliza para especificar un objeto JSON que contiene los valores para la compra con Visa CheckOut JavaScript. Maneja los siguientes eventos:
payment.success
payment.cancel
payment.error
1. payment.success
La respuesta asociada con el evento payment.success (respuesta de compra satisfactoria), retorna la siguiente información:
Propiedad Longitud Descripción Formato Obligatorio
callID 48 ID de la transacción de Visa CheckOut asociada con el requerimiento de pago. Por defecto el callId no expira. Puede solicitar la expiración por un periodo determinado en días, pero debe ser mayor al timeout de la sesión del comercio.
Alfanumérico
Si
responseStatus
Estado de la respuesta Propiedades
severity: severidad del error
message: descripción del error
ERROR, WARNING alfanumérico
si
encKey 128 Llave encriptada a ser usada para desencriptar el encPaymentData. Debe usar su shared secret para desencriptar esta llave.
Alfanumérico
si
encPaymentData
Contiene los datos del cliente y del pago encriptados que deben ser usados para procesar la transacción. Debe desencriptar este valor primero, revelando el valor encKey, luego use esta llave para desencriptar este valor.
si
externalClientId
100 ID del comercio, del comercio que recibe el pago.
Alfanumérico
Si
partialShippingAddress
2 128
Información parcial de envío del cliente
Propiedades countryCode: código del país donde la compra debe ser enviada
Alfanumérico Alfanumérico
Si Si
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 9 de 23 17/02/2016
Propiedad Longitud Descripción Formato Obligatorio
postalCode: de la ubicación donde la compra debe ser enviada, usada para el cálculo del costo de envío.
2. payment.cancel
La respuesta asociada con el evento payment.cancel retorna la siguiente información:
Propiedad Longitud Descripción Formato Obligatorio
callID 48 ID de la transacción de Visa que identifica a la solicitud de cancelación de pago
Alfanumérico
Si
3. payment.error
La respuesta asociada con el evento payment.error retorna la siguiente información:
Propiedad Descripción Formato
status Estado de respuesta HTTPS Numérico
Code Sub código interno numérico
severity Severidad del error ERROR, WARNING
message Descripción del error Alfanumérico
Ejemplo completo: <head> <script type="text/javascript"> function onVisaCheckoutReady() {
V.init({ apikey: "...", sourceId: "Merchant Defined Source ID", settings: {
locale: "en_US", countryCode: "US", displayName: "...Corp", logoUrl: "www.Some_Image_URL.gif", websiteUrl: "www....Corp.com", customerSupportUrl: "www....Corp.support.com", shipping: {
acceptedRegions: ["US", "CA"], collectShipping: "true" },
payment: { cardBrands: [
"VISA", "MASTERCARD" ],
acceptCanadianVisaDebit: "true", billingCountries:["US","CA"] },
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 10 de 23 17/02/2016
review: { message: "Merchant defined message", buttonAction: "Continue"
}, dataLevel: "SUMMARY"
}, paymentRequest: {
merchantRequestId: "Merchant defined request ID", currencyCode: "USD", subtotal: "10.00", shippingHandling: "2.00", tax: "2.00", discount: "1.00", giftWrap: "2.00", misc: "1.00", total: "16.00", description: "Megacorp Product", orderId: "Merchant defined order ID", promoCode: "Merchant defined promo code", customData: {
"nvPair": [ { "name": "customName1", "value": "customValue1" }, { "name": "customName2", "value": "customValue2" }
] }
} }
); V.on("payment.success", function(payment){document.write(JSON.stringify(payment)); }); V.on("payment.cancel", function (payment) { ... }); V.on("payment.error", function (payment, error) { ... });
} </script> </head> <body> <img alt="Visa Checkout" class="v-button" role="button"
src="https://sandbox.secure.checkout.visa.com/wallet-services-web/xo/button.png? cardBrands=VISA,MASTERCARD,DISCOVER,AMEX"/>
<script type="text/javascript" src="https://sandbox-assets.secure.checkout.visa.com/ checkout-widget/resources/js/integration/v1/sdk.js">
</script> </body> </html>
2.5 Mostrar el resumen de Visa CheckOut (Desencriptar)
Luego de recibir la respuesta de Visa CheckOut, deberá retornar a la página web, desencriptar la información y mostrar un resumen con los datos de la tarjeta que seleccionó el cliente en el lightbox de VISA Checkout. Este paso es importante para proporcionar seguridad de la elección al tarjetahabiente.
2.5.1 Desencriptar
Para desencriptar puede utilizar la información del Anexo 1 – Ejemplo de desencriptado.
2.5.2 Mostrar Resumen en su página
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 11 de 23 17/02/2016
En esta sección deberá mostrarse la información del cliente, la cual retorna en un formato JSON. Debe considerar usar librerías estándar para analizar sintácticamente objetos JSON. En las siguientes imágenes se muestra un ejemplo del resumen que deberá considerar para confirmar la tarjeta seleccionada por el cliente (imagen2), luego de seleccionarla en Visa CheckOut (imagen1).
Imagen1. Selección de tarjeta en Visa Checkout
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 12 de 23 17/02/2016
Imagen2. Confirmación de tarjeta
La siguiente información del cliente está disponible, ya sea encriptada en un payload, o como información de resumen de Get Payment Data:
Propiedad longitud Descripción Formato obligatorio
paymentInstrument
Información de la cuenta del cliente (tarjeta), es de contenido variado dependiendo si dataLevel es FULL o SUMMARY Propiedades
id: Identificador interno único relacionado al instrumento de pago.
Alfanumérico
lastFourDigits: 4 últimos número de la tarjeta
Numérico
binSixDigits: 6 primeros dígitos de la tarjeta
Numérico
19
paymentType: Tipo de instrumento de pago Propiedades
cardbrand: marca del instrumento de pago cardtype: tipo de tarjeta
VISA Numérico,
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 13 de 23 17/02/2016
Propiedad longitud Descripción Formato obligatorio
36
accountNumber: número de cuenta asociado al instrumento de pago. billingAddress: dirección de facturación asociada con el instrumento de pago. id: Identificador de la dirección
Alfanumérico. .
verificationStatus: Estatus de verificación de la dirección
VERIFIED, NOT_VERIFIED, CONSUMER_OVERRIDE
100
cardArts Propiedades
baseImageFileName: URL del arte de la tarjeta.
Height: Alto del arte en pixeles.
Width: ancho del arte en pixeles
Alfanumerico Número, valores entre 1 y 4096. Número, valores entre 1 y 4096.
Si
256 nameOnCard expirationDate: Fecha de expiración
month
year
Alfanumérico Formato MM (01-12) Formato YYYY
shippingAddress Información de la dirección de envío. Este dato es opcional. Propiedades
36 id: Identificador de la dirección
Alfanumérico
256
personName: Nombre de la persona propietaria de la dirección.
Alfanumérico
140 line1: Primera línea de la dirección
Alfanumérico.
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 14 de 23 17/02/2016
Propiedad longitud Descripción Formato obligatorio
140 line2: Segunda línea de la dirección
Alfanumérico.
140 line3: Tercera línea de la dirección
Alfanumérico.
100 city: Ciudad asociada a la dirección Alfanumérico.
100 stateProvinceCode: Estado o provincia asociada a la dirección
Alfanumérico
100 postalcode: Código postal asociado a la dirección (zip code)
Alfanumérico
countryCode: Código de país asociado a la dirección
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 15 de 23 17/02/2016
3 Proceso de Autorización
El último paso es el proceso de autorización de la compra, este se realiza mediante la invocación al web Service “WSVISACHECKOUT”, para luego mostrar el resultado de la transacción. 3.1 Web Service para transacciones con Visa CheckOut
El Web Service para transacciones con Visa CheckOut se llama “WSVISACHECKOUT”. Las Características de este Web Service son los siguientes:
1. URL: El Web Service se encuentra publicado en la URL
Ambiente URL
Integración http://qas.multimerchantvisanet.com/WebVisaCheckOut/WSVisacheckOut.asmx
Producción https://www.multimerchantvisanet.com/WebVisaCheckOut/WSVisacheckOut.asmx
2. Información de envío
Método: El Web Service expondrá el método llamado “AutorizarVisaCheckOut”.
Parámetro: Este método recibe un único parámetro “mensajeXML” de tipo String cuyo contenido es un XML.
XML Envío: El XML básico, para el envío de información al WSVisaCheckOut se describe a continuación:
Parámetro Longitud Descripción Formato Obligatorio
CANAL 1 Código de Canal: 3 Numérico SI
PRODUCTO 1 Código Producto: 1 Numérico SI
CODTIENDA 9 Código de Comercio Numérico SI
NUMORDEN 9 Código de Orden Numérico SI
MOUNT 10 Monto (Formato: ##.## - Ejemplo: 10.05)
Decimal SI
CODASOCIADO 15 Código PSP Numérico NO
NOMBREASOCIADO
17 Nombre Comercio Asociado
String NO
MCC 4 Numérico NO
NOMBRE 200 Nombre del Tarjeta Habiente
Alfanumérico
NO
APELLIDO 200 Apellido del Tarjeta Habiente
Alfanumérico
NO
CIUDAD 100 Ciudad del Tarjeta Habiente
Alfanumérico
NO
DIRECCION 100 Dirección de facturación
Alfanumérico
NO
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 16 de 23 17/02/2016
1 Ver 1. Integración de Device Fingerprint para la integración de Comercio Electrónico
El formato del XML de entrada es el siguiente:
<?xml version="1.0" encoding="UTF-8" ?> <registrar_pedidovco> <parametros> <parametro id="CANAL"></parametro> <parametro id="PRODUCTO"></parametro> <parametro id="CODTIENDA"></parametro> <parametro id="NUMORDEN"></parametro> <parametro id="MOUNT"></parametro> <parametro id="CODASOCIADO"></parametro> <parametro id="NOMBREASOCIADO"></parametro> <parametro id="MCC"></parametro> <parametro id="NOMBRE"></parametro> <parametro id="APELLIDO"></parametro> <parametro id="CIUDAD"></parametro> <parametro id="DIRECCION"></parametro> <parametro id="EMAIL"></parametro> <parametro id="DATO_COMERCIO"></parametro> <parametro id="CALLID"></parametro> <parametro id="CSCCODE"></parametro> </parametros> <parametros_antifraude> <parametro_ant id="DEVICEFINGERPRINTID"></parametro_ant> <parametro_ant id="merchantDefinedData"> <campo id="field3">VCO</campo> </parametro_ant> </parametros_antifraude> </registrar_pedidovco>
3. Información de Respuesta
EMAIL 100 Email del Tarjeta habiente
Alfanumérico
NO
DATO_COMERCIO
100 Valor referencial del comercio
String NO
CALLID 20 Identificador de VisaCheckOut
Numérico SI
CSCCODE 4 Código de seguridad de la tarjeta
Numérico NO
DeviceFingerprintID1
88 Identificador de sesión de la huella digital. La cadena puede contener letras mayúsculas y minúsculas, dígitos y estos Caracteres especiales: guion (-) y subrayado (_). El identificador de sesión debe ser exclusivo para cada orden y comercio.
Alfanumérico
NO
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 17 de 23 17/02/2016
Respuesta: La información de respuesta del web Service “WSVisaCheckOut – AutorizarVisaCheckOutResult”, es un dato de tipo String cuyo contenido es un XML.
XML Respuesta: El XML de respuesta del WS VisaCheckOut se describe a continuación:
Parámetro Descripción
RESPUESTA Tiene los siguientes valores: 1: Éxito 2: Error
CODTIENDA Código de la tienda
NUMORDEN Número de orden de la tienda.
CODACCION Código de denegación y aprobación. El Código de aprobación: 000.
PAN Número de tarjeta American Express. Está enmascarado, solamente muestra los 6 primeros dígitos y los 4 últimos.
ECI Electronic Commerce Indicator
COD_AUTORIZA
Código de autorización
ORI_TARJETA Indica origen de tarjeta: N (Tarjeta Nacional); I (Tarjeta Internacional)
NOM_EMISOR Nombre del banco emisor de la tarjeta. Solamente en caso que la tarjeta sea nacional.
DSC_ECI Descripción del campo ECI
RES_AVV Resultado de la validación del AVV
RES_ALPHA Resultado de la validación del Código ALPHA
IMP_AUTORIZADO
Importe autorizado.
MENSAJE Errores durante el proceso o de validación
El formato del XML de Respuesta es el siguiente: <?xml version="1.0" encoding="UTF-8"?> <respuesta_pedido> <pedido id="09090261"> <campo id="CODTIENDA"></campo> <campo id="NUMORDEN"></campo> <campo id="CODACCION"></campo> <campo id="PAN"></campo> <campo id="ECI"></campo> <campo id="COD_AUTORIZA"></campo> <campo id="ORI_TARJETA"></campo> <campo id="NOM_EMISOR"></campo> <campo id="DSC_ECI"></campo> <campo id="RES_CVV2"></campo> <campo id="IMP_AUTORIZADO"></campo> <campo id="ID_UNICO"></campo> <campo id="RESPUESTA"></campo> <campo id="FECHAYHORA_TX"></campo> <campo id="DSC_COD_ACCION"> </campo> <campo id="CANAL"></campo> <campo id="PRODUCTO"></campo> <campo id="DATO_COMERCIO"></campo> <campo id="NROCUOTA"></campo> <campo id="IMPCUOTAAPROX"></campo>
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 18 de 23 17/02/2016
</pedido> <mensajes /> </respuesta_pedido>
NOTA: Se debe tener en consideración que estos parámetros son los que se envían a la fecha de redacción de este documento. Siendo tramas XML, se puede incrementar el número de parámetros de respuesta, de acuerdo a las mejoras que se vayan implementando en la pasarela de pagos.
3.2 Mostrar el Resultado de la Transacción
Una vez obtenido el resultado del proceso de pago, el comercio deberá mostrar la pantalla final de respuesta al cliente. La pantalla final de compra debe mostrar la siguiente información:
Número de pedido
Número de tarjeta enmascarada
Fecha y hora del pedido
Importe de la transacción
Moneda
Descripción del producto
Nombre del Comprador
Descripción del código de acción de acuerdo a tabla
Términos y Condiciones (o el link a la página)
Incluir un texto indicando al cliente que debe imprimir y/o guardar el recibo de transacción.
En algunos casos por un tema de reclamos, VisaNet solicitará al establecimiento el envío de una copia de esta pantalla final de compra en un plazo no mayor a 48 horas.
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 19 de 23 17/02/2016
4 Anexo 1 - Ejemplo de desencriptado.
Ejemplos para desencriptación utilizando distintos lenguajes de programación:
Java:
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String HASH_ALGORITHM = "SHA-256";
private static final String HMAC_ALGORITHM = "HmacSHA256";
private static final int IV_LENGTH = 16, HMAC_LENGTH = 32;
private static final Charset utf8 = Charset.forName("UTF-8");
private static final Provider bcProvider;
static {
bcProvider = new BouncyCastleProvider();
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
Security.addProvider(bcProvider);
}
}
private static byte[] decrypt(byte[] key, byte[] data) throws GeneralSecurityException {
byte[] decodedData = Base64.decode(data);
if (decodedData == null || decodedData.length <= IV_LENGTH) {
throw new RuntimeException("Bad input data.");
}
byte[] hmac = new byte[HMAC_LENGTH];
System.arraycopy(decodedData, 0, hmac, 0, HMAC_LENGTH);
if (!Arrays.equals(hmac,
hmac(key, decodedData, HMAC_LENGTH, decodedData.length - HMAC_LENGTH))) {
throw new RuntimeException("HMAC validation failed.");
}
byte[] iv = new byte[IV_LENGTH];
System.arraycopy(decodedData, HMAC_LENGTH, iv, 0, IV_LENGTH);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, bcProvider);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(hash(key), "AES"),
new IvParameterSpec(iv));
return cipher.doFinal(decodedData, HMAC_LENGTH + IV_LENGTH,
decodedData.length - HMAC_LENGTH - IV_LENGTH);
}
private static byte[] hash(byte[] key) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
md.update(key);
return md.digest();
}
private static byte[] hmac(byte[] key, byte[] data, int offset, int length)
throws GeneralSecurityException {
Mac mac = Mac.getInstance(HMAC_ALGORITHM, bcProvider);
mac.init(new SecretKeySpec(key, HMAC_ALGORITHM));
mac.update(data, offset, length);
return mac.doFinal();
}
C#:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 20 de 23 17/02/2016
class Decrypt {
const int HMAC_LENGTH = 32, IV_LENGTH = 16;
public static String decryptPayload(String key, String wrappedKey, String payload) {
return Encoding.UTF8.GetString(decrypt(decrypt(Encoding.UTF8.GetBytes(key),
Convert.FromBase64String(wrappedKey)), Convert.FromBase64String(payload)));
}
public static byte[] decrypt(byte[] key, byte[] data) {
if (data == null || data.Length <= IV_LENGTH + HMAC_LENGTH) {
throw new ArgumentException("Bad input data", "data");
}
byte[] hmac = new byte[HMAC_LENGTH];
Array.Copy(data, 0, hmac, 0, HMAC_LENGTH);
byte[] iv = new byte[IV_LENGTH];
Array.Copy(data, HMAC_LENGTH, iv, 0, IV_LENGTH);
byte[] payload = new byte[data.Length - HMAC_LENGTH - IV_LENGTH];
Array.Copy(data, HMAC_LENGTH + IV_LENGTH, payload, 0, payload.Length);
//if (byteArrayEquals(hmac, dohmac(key, byteArrayConcat(iv, payload)))) {
// TODO: Handle HMAC validation failure
//}
Aes aes = new AesManaged();
aes.BlockSize = 128;
aes.KeySize = 256;
aes.Key = hash(key);
aes.IV = iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(payload, 0, payload.Length);
cs.FlushFinalBlock();
return ms.ToArray();
}
public static byte[] hash(byte[] key) {
return (new SHA256Managed()).ComputeHash(key);
}
public static byte[] dohmac(byte[] key, byte[] data) {
return (new HMACSHA256(key)).ComputeHash(data);
}
public static void Main(string[] args) {
Console.WriteLine(decryptPayload("SECRET_KEY",
"pX0WUfsSJQin8U01dmAHJHyZp1+M+CLnyw2oYS1ty
CcHJjSWcOl5oRcHl0LCq9+9YaGy1+WthVfKHRnTf+J7wMCFqcJzr6PXTxP7uKPXaHMrWQyIY5xXGN9Du8np75Em"
,
"6kH6cPtgvpgS4DvxsMWNg9W3CwN9AmhDFHmNQAJbvR4JBIvl4LznmIXESc9CgE87D5lAdqBVacGkR3bnCaBmfKi
b
/sVQoOQ/uNvB1O0Rrqo="));
}
}
Node.js:
var crypto = require('crypto')
function decryptPayload(key, wrappedKey, payload) {
var unwrappedKey = decrypt(key, wrappedKey);
return decrypt(unwrappedKey, payload);
}
function decrypt(key, data) {
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 21 de 23 17/02/2016
var dataBuffer = new Buffer(data, 'base64');
// TODO: Check that data is at least bigger than HMAC + IV length
var hmac = dataBuffer.toString('binary', 0, 32);
var iv = dataBuffer.toString('binary', 32, 48);
var decodedData = dataBuffer.toString('binary', 48);
if (hmac != doHmac(key, iv + decodedData)) {
// TODO: Handle HMAC validation failure
return 0;
}
var cipher = crypto.createDecipheriv('aes-256-cbc', hash(key), iv);
return cipher.update(decodedData, 'binary', 'binary') + cipher.final('binary');
}
function hash(data) {
var hasher = crypto.createHash('sha256');
hasher.update(data, 'binary');
return hasher.digest('binary');
}
function doHmac(key, data) {
var hmacer = crypto.createHmac('sha256', key);
hmacer.update(data);
return hmacer.digest('binary');
}
PHP:
<?php
function decryptPayload($key, $wrappedKey, $payload) {
$unwrappedKey = decrypt($key, $wrappedKey);
return decrypt($unwrappedKey, $payload);
}
function decrypt($key, $data) {
$decodedData = base64_decode($data);
// TODO: Check that data is at least bigger than HMAC + IV length
$hmac = substr($decodedData, 0, 32);
$iv = substr($decodedData, 32, 16);
$data = substr($decodedData, 48);
if ($hmac != hmac($key, $iv . $data)) {
// TODO: Handle HMAC validation failure
return 0;
}
return openssl_decrypt($data, 'aes-256-cbc', hashKey($key), OPENSSL_RAW_DATA, $iv);
}
function hashKey($data) {
$hasher = hash_init('sha256');
hash_update($hasher, $data);
return hash_final($hasher, true);
}
function hmac($key, $data) {
return hash_hmac('sha256', $data, $key, true);
}
?>
Python:
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 22 de 23 17/02/2016
from M2Crypto import EVP
import base64
import hashlib
import hmac
def decryptPayload(key, wrappedKey, payload):
unwrappedKey = decrypt(key, wrappedKey)
return decrypt(unwrappedKey, payload)
def decrypt(key, data):
decodedData = base64.b64decode(data)
# TODO: Check that data is at least bigger than HMAC + IV length
hmac = decodedData[0:32]
iv = decodedData[32:48]
data = decodedData[48:]
if hmac != doHmac(key, iv + data):
# TODO: Handle HMAC validation failure
return ''
cipher = EVP.Cipher('aes_256_cbc', hash(key), iv, 0)
unencrypted = cipher.update(data)
return unencrypted + cipher.final()
def hash(data):
hasher = hashlib.sha256()
hasher.update(data)
return hasher.digest()
def doHmac(key, data):
hmacer = hmac.new(key, data, hashlib.sha256)
return hmacer.digest()
Ruby:
require 'openssl'
require 'base64'
def decryptPayload(key, wrappedKey, payload)
unwrappedKey = decrypt(key, wrappedKey)
decrypt(unwrappedKey, payload)
end
def decrypt(key, data)
decodedData = Base64.strict_decode64(data)
# TODO: Check that data is at least bigger than IV length
if (decodedData.byteslice(0,32) !=
hmac(key,decodedData.byteslice(32,decodedData.bytesize-32)))
# TODO: Handle HMAC validation failure
return ''
end
cipher = OpenSSL::Cipher.new('AES-256-CBC')
cipher.decrypt
cipher.key = hash(key)
cipher.iv = decodedData.byteslice(32, 48)
cipher.update(decodedData.byteslice(48, decodedData.bytesize)) + cipher.final
end
def hash(data)
Información Técnica sobre
Comercio Electrónico Visa CheckOut Versión Nº: 2
Propiedad de Compañía Peruana de Medios de Pago S.A.C. - Prohibida cualquier reproducción, distribución o comunicación para otros fines, salvo autorización expresa de Visanet Perú.
Página 23 de 23 17/02/2016
digest = OpenSSL::Digest::SHA256.new
digest.update(data)
digest.digest
end
def hmac(key, data)
OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, key, data)
end