first atlantic commerce payment gateway 2 guía rápida de … · 2020. 7. 28. · nota: el monto...
TRANSCRIPT
First Atlantic Commerce Payment Gateway 2 Guía Rápida de Integración para Programadores
Versión 1.4, 24 de Enero de 2020
2
Table of Contents
Registro de Cambios ...................................................................................................................................................4
Acerca de esta guía .....................................................................................................................................................5
Antecedentes..............................................................................................................................................................5
API de FACPG2 ............................................................................................................................................................6
URLs de plataforma de producción ........................................................................................................................7
https://ecm.firstatlanticcommerce.com/PGService/<Service Name> ........................................................................7
https://marlin.firstatlanticcommerce.com/PGService/<Service Name> .....................................................................7
https://ecm.firstatlanticcommerce.com/PGServiceXML ............................................................................................7
https://marlin.firstatlanticcommerce.com/PGServiceXML ........................................................................................7
https://ecm.firstatlanticcommerce.com/PGService/Services.svc................................................................................7
https://ecm.firstatlanticcommerce.com/PGService/Services.svc?WSDL ..................................................................7
Operaciones disponibles de servicio ......................................................................................................................7
La operación Authorize...............................................................................................................................................8
AuthorizeRequest – Descripciones detalladas de campos .....................................................................................9
AuthorizeResponse – Descripciones detalladas de campos................................................................................ 12
Ejemplos de Código Fuente ................................................................................................................................. 14
Ejemplos de XML ............................................................................................................................................. 15
xmlns="http://schemas.firstatlanticcommerce.com/gateway/data" ......................................................................... 15
xmlns="http://schemas.firstatlanticcommerce.com/gateway/data" ......................................................................... 15
Ejemplos de SOAP ............................................................................................................................................ 17
Ejemplo de autorización simple (SOAP) .......................................................................................................... 18
Ejemplo de autorización simple (XML) ............................................................................................................ 21
Ejemplo de autorización de una sola pasada con AVS (SOAP) ........................................................................ 24
Authorization with Tokenization (SOAP) ......................................................................................................... 24
Mensajes de Ejemplo .......................................................................................................................................... 25
Ejemplo de AuthorizeRequest / AuthorizeResponse en SOAP: ...................................................................... 25
Ejemplo de AuthorizeRequest / AuthorizeResponse en XML: ........................................................................ 26
La operación TransactionModification .................................................................................................................... 28
1) Capture ............................................................................................................................................................ 28
3
2) Refund ............................................................................................................................................................. 28
3) Reversal ........................................................................................................................................................... 28
Tipos de modificación .......................................................................................................................................... 28
Capture ............................................................................................................................................................ 28
Refund ............................................................................................................................................................. 28
Reversal ........................................................................................................................................................... 29
TransactionModificationRequest – Descripciones detalladas de campos .......................................................... 29
TransactionModificationResponse – Descripciones detalladas de campos ........................................................ 30
Ejemplos de Código Fuente ................................................................................................................................. 31
Modificación de transacción – Capture (SOAP)............................................................................................... 31
Modificación de transacción – Reversal (SOAP) .............................................................................................. 32
Modificación de transacción – Refund (SOAP) ................................................................................................ 33
Mensajes de Ejemplo .......................................................................................................................................... 34
Ejemplo de TransactionModificationRequest / TransactionModificationResponse en XML para una captura:
......................................................................................................................................................................... 34
Ejemplo de TransactionModificationRequest / TransactionModificationResponse en SOAP para una
captura:............................................................................................................................................................ 35
La operación de pago por token o tokenización ..................................................................................................... 36
TokenizeRequest – Descripciones detalladas de campos ................................................................................... 37
TokenizeResponse – Descripciones detalladas de campos ................................................................................. 37
Ejemplos de Código Fuente ................................................................................................................................. 38
Tokenización (SOAP) ........................................................................................................................................ 38
Mensajes de Ejemplo .......................................................................................................................................... 39
Ejemplo de TokenizeRequest / TokenizeResponse en SOAP: ......................................................................... 39
Ejemplo de TokenizeRequest / TokenizeResponse en XML: ........................................................................... 39
La operación 3D-Secure ........................................................................................................................................... 40
3D-Secure con Tokenizacion ............................................................................................................................... 41
Aquí .................................................................................................................................................................. 41
Authorize3DSRequest – Descripciones detalladas de campos ........................................................................... 41
Authorize3DSResponse – Descripciones detalladas de campos ......................................................................... 41
3DSecure Authentication Result (EcIIndicator, AuthenticationResult, CAVV) .................................................... 42
4
Ejemplos de Código Fuente ................................................................................................................................. 43
Authorize3DS (SOAP) ....................................................................................................................................... 43
Authorize3DS (XML) ........................................................................................................................................ 45
Tokenizacion con 3D-Secure............................................................................................................................ 49
Ejemplos de Mensajes ......................................................................................................................................... 52
Authorize3DS (SOAP) flujo normal .................................................................................................................. 52
Authorize3DS (SOAP) flujo de error – Cuando se retorna un error................................................................ 56
Authorize3DS XML flujo normal ...................................................................................................................... 61
Registro de Cambios
Versión del documento
Descripción Fecha de emisión
V1.0 Versión inicial en base a la Guía de integración FACPG2 v2.5.9 23/Ene/2019 V1.1 Se agregaron ejemplos de mensajes HTTP POST 19/Feb/2019 V1.2 - Se agregaron ejemplos adicionales de mensajes HTTP POST para 3D Secure.
- Se agregó una ejemplo de utilizacion de 3D Secure con tokenización 12/Nov/2019
V1.3 Se agregaron ejemplos adicionales para 3D Secure (via interface XML) 12/Dic/2019
V1.4 Se agregaron ejemplos adicionales para 3D Secure para Autorizaciones y Modificacion de Transcciones
24/Ene/2020
5
Acerca de esta guía
Este documento sirve como una guía rápida que permitirá a los programadores repasar en corto tiempo los aspectos más
importantes del proceso de integración para utilizar, por primera vez, los servicios de pasarela de pagos (conocida en inglés
como Payment Gateway o PG) de First Atlantic Commerce (FAC).
Este documento incluye solamente las operaciones más comunes de API, así que debe acompañarse siempre del documento
completo Guía de Integración de FACPG2, que contiene explicaciones detalladas de todas las operaciones.
Antecedentes
Este documento es una guía para el programador durante el proceso de integración requerido para utilizar por primera vez los
servicios de pasarela de pagos Payment Gateway Services de First Atlantic Commerce.
La versión actual de la pasarela de pagos de FAC tiene dos maneras de integrarse; un servicio web de pasarela de pagos
basado en SOAP y un servicio XML POST. Ambos métodos comparte los mismos atributos y estructuras de datos, pero se
convocan a través de distintos URLs y campos semánticos.
Ambos métodos utilizan HTTPS como protocolo de transporte.
6
API de FACPG2
Los servicios de pasarela de pagos de FAC aceptan solicitudes tanto de SOAP como de XML POST y soportan
solicitudes de transacción que utilizan el protocolo HTTPS. Este es un resumen de las operaciones disponibles:
Operación(SOAP) Descripción
Services.svc – Operaciones base de pasarela de pagos
Authorize - Autorizar Soporta autorizaciones sin 3D Secure,
autorizaciones con captura en una sola transacción,
Verificación AVS,
transacciones recurrentes
transacciones pre-autenticadas con servicio 3D secure
Transaction
Modification –
Modificación de
transacción
Captura una transacción previamente autorizada
Reversa una transacción previamente autorizada y capturada
Reembolsa una transacción previamente autorizada, capturada y liquidada
Cancela una transacción recurrente
Authorize3DS –
Autorización con
seguridad 3DS
Soporta autorizaciones con 3DS solamente,
autorización 3DS con una captura,
transacciones con seguridad 3DS para autenticación solamente
AVS
Transaction Status –
Estatus de
transacción
Despliega el estatus de una transacción previa
Tokenization.svc – Operaciones de tokenización/destokenización y manejo de PANs
Tokenize – Tokenizar Tokeniza un número de tarjeta de crédito
ExpiringCreditCards
– Tarjetas de crédito
a punto de expirar
Despliega una lista de tarjetas tokenizadas con fecha cercana de expiración
DeTokenize -
Destokenizar
Permite que una tarjeta tokenizada sea destokenizada de regreso al número de tarjeta original
UpdateToken –
Actualizar token
Permite la actualización de la fecha de expiración y la referencia del cliente
HostedPage.svc – Operaciones para la autorización de una página de pago alojada en el portal del cliente
HostedPageAuthorize
– Autorización de una
página alojada en la
página web del cliente
Pasa datos preliminares de una página alojada hacia la pasarela de pagos y devuelve un token de
uso único para permitir acceso a la página
HostedPageResults –
Resultados de página
alojada
Permite recuperar todos los datos de respuesta, independientemente a la transacción en la pagina
alojada en la web del cliente. Sólo se requiere del token de uso único como parámetro
7
URLs de plataforma de producción
Interface Ambiente Url
SOAP Prueba https://ecm.firstatlanticcommerce.com/PGService/<Service Name>
SOAP Producción https://marlin.firstatlanticcommerce.com/PGService/<Service Name>
XML Prueba https://ecm.firstatlanticcommerce.com/PGServiceXML
XML Producción https://marlin.firstatlanticcommerce.com/PGServiceXML
Ejemplos:
Operación de
servicio
https://ecm.firstatlanticcommerce.com/PGService/Services.svc
WSDL https://ecm.firstatlanticcommerce.com/PGService/Services.svc?WSDL
Operaciones disponibles de servicio
Las operaciones de servicios disponibles se enumeran a continuación, y están agrupadas en cuatro grupos de
servicios (Servicios, pago por tokens, página web alojada y utilerías).
// Services.svc:
AuthorizeResponse Authorize(AuthorizeRequest Request)
TransactionModificationResponse TransactionModification(TransactionModificationRequest Request)
Authorize3DSResponse Authorize3DS(Authorize3DSRequest Request)
TransactionStatusResponse TransactionStatus(TransactionStatusRequest Request)
// Tokenization.svc:
TokenizeResponse Tokenize(TokenizeRequest Request)
ExpiringCreditCardsResponse ExpiringCreditCards(ExpiringCreditCardsRequest Request)
DeTokenizeResponse DeTokenize(DeTokenizeRequest Request)
UpdateTokenResponse UpdateToken(UpdateTokenRequest Request)
// HostedPage.svc:
HostedPageAuthorizationResponse HostedPageAuthorize(HostedPageAuthorizationRequest Request)
HostedPageResultsResponse HostedPageResults(string Key)
8
La operación Authorize
La operación de autorización Authorize Operation utiliza el mensaje AuthorizeRequest para enviar una solicitud
de autorización de transacción sin seguridad 3D.
Con esta operación también es posible:
Incluir una captura como parte de la solicitud (conocida como transacción de una sola pasada)
Incluir una Verificación de dirección (AVS por sus siglas en inglés) en la solicitud
Llevar a cabo una verificación de dirección $0 solamente, sin autorización ni monto
Incluir los resultados de una transacción previa autenticada a través de 3D Secure
- - Debido a la naturaleza apátrida e interconectada de la internet, es posible que ocasionalmente una
solicitud de autorización de un transacción enviada a FAC caduque (timeout) antes de recibir una respuesta.
Si este fuera el caso, no asuma que la transacción no fue procesada de nuestro lado. Es posible que hayamos
recibido la solicitud y enviado una respuesta que nunca llegó a usted debido a una falla en la conexión entre
su servidor y FAC. En este caso, utilice la operación TransactionStatus para verificar el estatus de esta
transacción y si fue o no aprobada.
- - El parámetro TransactionCode se utiliza para identificar los ítems de la operación de autorización que se
encuentran soportados a nivel sistema. El parámetro TransactionCode es una totalización del valor asignado
al ítem. Favor de referirse a la sección Descripción detallada de campos para una lista de posibles
TransactionCodes.
o Si el parámetro TransactionCode se encuentra ajustado para incluir la marca AVS Verification Only,
es posible enviar una transacción con monto cero, con el propósito de verificar la dirección
solamente. Este tipo de transacciones AVS Verification Only nunca son autorizadas. El banco que
proporciona el hosting deberá soportar solicitudes de AVS con monto cero para poder utilizar este
parámetro. Si el banco no soporta este servicio, FAC puede proporcionar una cuenta separada de
FAC que soporte solamente verificaciones de dirección con monto cero. Para más información
consulte la sección de Verificación AVS de montos en cero en la Guía de integración FACPG2.
o Si el parámetro TransactionCode está fijado para incluir la marca (flag) ‘Pre-Authenticated’, los
parámetros ECIIndicator y AuthenticationResult deberán incluirse en la solicitud; de lo contrario, la
transacción no podrá ser completada. Adicionalmente, si el valor del parámetro ECIIndicator está
fijado en “05” (para Visa) o en “02” (para MC), y el valor del parámetro AuthenticationResult está
fijado en “Y”, los parámetros TransactionStain y CAVVValue deberán incluirse; de lo contrario, la
transacción no podrá ser completada.
No se podrá ajustar el parámetro TransactionCode para incluir las marcas (flags) AVSOnly y PreAuthenticated.
Hacerlo le arrojará un mensaje de error y la transacción no será procesada.
9
AuthorizeRequest – Descripciones detalladas de campos
Nota:
“R/O/C” se refiere a si la presencia del campo es Requerida (obligatoria), Opcional o Condicional.
N/AN se refiere a si el campo es Numérico o AlfaNumérico.
Sección/Campo Format
o R/
O/
C
Valor
TransactionDetails
AcquirerId N(11) R “464748”
MerchantId N(15) R Su número de FAC ID que le proporcionó FAC
OrderNumber AN(150) R Identificador único asignado por el comercio para la transacción
TransactionCode N(4) R El código de transacción es un valor numérico que permite cualesquiera
combinaciones de los identificadores (flags) que se enlistan a
continuación y que se incluyen con la solicitud de transacción, sumando
su valor correspondiente. Por ejemplo, para incluir AVS en la
transacción y marcarla como una transacción de prueba, se asigna la
suma de los valores correspondientes 1 y 16 al código de la transacción.
Los códigos válidos para una solicitud de autorización son:
0 - Ninguno
1 – Incluir una verificación AVS en la transacción
2 – Identificar como una verificación AVS solamente, con monto cero
4 – La transacción ha sido previamente autenticada con seguridad 3D y
los resultados de la autenticación se incluirán en la transacción. 8 – Identificar como transacción de una sola pasada (autorización y
captura en una sola transacción)
32 - Reservado
64 – Identificar como una transacción de autenticación solamente, con
seguridad 3DS
128 – Tokenizar el PAN (solicitar token)
256 – Autorización de página alojada + 3DS (aplica solamente a
páginas de pago alojadas)
512 – Verificación de fraude solamente
1024 – Prueba de fraude
2048 - Reservado
Amount N(12) R Monto total de la compra. Nota: El monto de la compra deberá
presentarse como una secuencia de 12 caracteres (por ej. $12.00 se
escribiría “000000001200”)
Currency N(3) R El código ISO del país de divisa con la que se hizo la compra (ej. US
Dollars = 840)
Ver el Anexo A de la Guía de integración FACPG2 para obtener una
lista completa de códigos.
CurrencyExponent N(1) R El número de dígitos después del punto decimal del monto de la compra
(por ej. $12.00 = 2)
SignatureMethod AN(4) R “SHA1”
Signature AN(28) R Ver Creación y verificación de firma en la Guía de integración
FACPG2 para información sobre cómo crear esta firma
IPAddress AN(15) C Dirección del cliente IPv4
CustomData AN(n) O Reservado para uso futuro
10
CustomerReference AN(256) O Se usa con la solicitud de tokenización para asociar un token con un
cliente
CardDetails
CardNumber N(19) R Número de tarjeta de crédito/débito de un tarjetahabiente o de un PAN
previamente tokenizado
CardExpiryDate N(4) C Fecha de expiración de la tarjeta de crédito de un tarjetahabiente
(formato MMYY)
No se requiere si se utiliza un número de tarjeta tokenizado
CardCVV2 N(4) R Número CVV2 de tarjeta de crédito del tarjetahabiente tal como aparece
en la parte trasera de la tarjeta de crédito
(3 dígitos para tarjetas Visa y MasterCard, 4 dígitos para AMEX)
IssueNumber N(2) C Número de expedición de la tarjeta de débito del tarjetahabiente Puede
ser de uno o dos dígitos, dependiendo del tipo de tarjeta.
StartDate C Fecha de vigencia inicial de la tarjeta de crédito de un tarjetahabiente
(formato MMYY) Se requiere para algunas tarjetas de débito. BillingDetails
BillToAddress AN(50) C Dirección del tarjetahabiente. Este valor se necesita para transacciones
con verificación AVS. Ver el Anexo A en la Guía de integración
FACPG2 para todos los requerimientos de los campos de detalles de
facturación
BillToAddress2 AN(50) O Reservado para uso interno de FAC
BillToZipPostCode AN(10) C Código postal del tarjetahabiente. Este valor se necesita para
transacciones con verificación AVS. Ver el Anexo A en la Guía de
integración FACPG2 para todos los requerimientos de los campos.
BillToFirstName AN(30) O Nombre del tarjetahabiente
BillToLastName AN(30) O Apellido del tarjetahabiente
BillToCity AN(30) O Ciudad del tarjetahabiente.
BillToState AN(5) O Estado o provincial del tarjetahabiente – debe tener un mínimo de dos
caracteres Ver el Anexo A en la Guía de integración FACPG2 para
información sobre los valores permitidos.
BillToCountry* N(3) O Código ISO del país del tarjetahabiente (ej. U.S.A. = 840) Ver el Anexo
A en la Guía de integración FACPG2
BillToEmail* AN(50) O Dirección electrónica del tarjetahabiente
BillToTelephone* N(20) O Número telefónico del tarjetahabiente
ShippingDetails
Son los mismos campos que BillingDetails, pero con el prefijo “ShipTo”
Detalles de 3DSecure
ECIIndicator N(2) C Este valor solo se necesita para transacciones con seguridad 3D y el
código de transacción debe incluir el valor 4 en el valor totalizado. Los
posibles valores incluyen: Visa:
“05” – Autenticación completa 3D Secure
“06” – El emisor y/o el tarjetahabiente no están suscritos a 3D Secure
“07” – Falló el intento de autenticación 3D Secure (las razones posibles
son numerosas)
MasterCard:
“01” – El emisor y/o el tarjetahabiente no están suscritos a 3D Secure
“02” – Autenticación completa 3D Secure
AuthenticationResult A(1) C Este valor solo se necesita para transacciones con seguridad 3D y el
código de transacción debe incluir el valor 4 en el valor totalizado. Los
posibles valores incluyen:
11
“A” = Se hizo un intento de autenticación (ECIIndicator: V=06,
MC=01) “N” = El intento de autenticación no se encontraba soportado
(ECIIndicator: V=06, MC=01) “U” = No se pudo autenticar (ECIIndicator: V=07, MC=01) “Y” = Se intentó y se logró la autenticación (ECIIndicator: V=05,
MC=02)
TransactionStain AN(28) O Una versión “hash” del número de identificación de la transacción
(XID). El XID es un número único de rastreo que se asigna a la
solicitud de autenticación y previene el reenvío de la misma
transacción.
CAVV AN(28) O Este es un valor criptográfico que se deriva del emisor durante la
autenticación del pago; proporciona evidencia de los resultados del
proceso de autenticación del pago. Note que para MasterCard, este
campo se conoce como UCAF pero el nombre del campo seguirá siendo
CAVV. RecurringDetails IsRecurring A(5) C Se fija como “True” o “False” dependiendo de si se requiere una
transacción recurrente.
ExecutionDate N(8) C Cuándo ejecutar la siguiente autorización después de la autorización
inicial inmediata. Un ejemplo del formato de la fecha es “20130715”
(YYYYMMDD).
Frequency A(1) C Identificar o marcar para definir la frecuencia de ejecución de la
autorización recurrente.
Los posibles valores son:
“D” – Diariamente
“W” – Semanalmente
“F” – Quincenal/cada dos semanas
“M” – Mensualmente
“E” – Bi-Mensualmente
“Q” – Trimestralmente
“Y” – Anual
NumberOfRecurrences
N(3) C Cuántas veces se debe ejecutar. Por ejemplo, si Frequency = “D”,
NumberOfRecurrences = 7 se ejecutará cada día por una semana.
FraudDetails
AuthResponseCode A(1) O Para verificaciones de preautorización, solo para verificación de fraude,
“A” = Autorizado, “D” = Declinado.
AVSResponseCode A(1) O Código estándar de respuesta AVS, para verificaciones solamente de
fraude pre-autorizados
CVVResponseCode A(1) O Código estándar de respuesta de validación CVV2, para verificaciones
pre-autorizadas de fraude solamente
SessionId AN(32) R Para cualquier verificación de fraude se requiere un número único de
identificación de sesión y debe ser el mismo número de ID de la sesión
generado por el recolector de datos. Ver la sección de Control de fraude
en la Guía de integración FACPG2
Notas:
La capacidad de procesar verificaciones AVS es específica según el procesador. Por favor informe a FAC
si usted desea utilizar este servicio y nosotros le haremos saber si se encuentra disponible a través del
procesador de su elección.
12
Aunque la interface existe para soportar transacciones recurrentes, este servicio podría depender del
procesador. Le sugerimos que se comunique con FAC si usted desea utilizar transacciones recurrentes.
Para servicios de Control de Fraude, se requiere de cambios adicionales en la configuración de su cuenta
de procesamiento y se requiere también que se inscriba al servicio. Por favor informe a FAC si desea
implementar servicios de control de fraude.
AuthorizeResponse – Descripciones detalladas de campos
Nota:
“R/O/C” se refiere a si la presencia del campo es Requerida (obligatoria), Opcional o Condicional.
N/AN se refiere a si el campo es Numérico o AlfaNumérico.
Sección/Campo Format
o
Notas:
AuthorizeResponse (Main Body)
AcquirerID N(11) El valor pasado en AcquiereId en la operación AuthorizeRequest
CustomData AN(n) Reservado para uso futuro
IPAddress N(15) El valor pasado en IPAddress en la operación AuthorizeRequest
MerchantID N(15) El valor pasado en AcquirerId en la operación AuthorizeRequest
ReferenceNumber N(12) El número único de referencia que el sistema de FAC asigna a esta
transacción
Signature AN(28) Ver Verificación y creación de firmas en la sección de ejemplos más abajo o
consulte la Guía de integración FACPG2 para obtener información sobre
cómo se crea esta firma
SignatureMethod AN(4) Siempre será “SHA1”
CreditCardTransactionResults
AuthCode AN(6) El código de autorización lo proporciona el banco emisor del tarjetahabiente
AVSResult AN(1) Campo de resultados de la verificación de dirección. Ver Error! Reference s
ource not found.
CVV2Result A(1) Ver Códigos de respuesta CVV2/CVC2 en la Guía de integración FACPG2
para consultar los posibles valores de este parámetro.
OriginalResponseCode AN(3) Ver Códigos de respuesta de autorización original en la Guía de integración
FACPG2 para consultar los posibles valores de este parámetro.
PaddedCardNumber N(19) El valor pasado en CardNumber en la operación AuthorizeRequest, ampliado
con Xs, pero que solo proporciona los últimos 4 dígitos
ReasonCode N(4) Ver Códigos de respuesta y de razones en la Guía de integración FACPG2
para consultar los posibles valores de este parámetro.
ReasonCodeDescription AN(100) Ver Códigos de respuesta y de razones en la Guía de integración FACPG2
para consultar los posibles valores de este parámetro.
ResponseCode N(1) Ver Códigos de respuesta y de razones en la Guía de integración FACPG2
para consultar los posibles valores de este parámetro.
TokenizedPAN N(19) Se despliega el número de tarjeta tokenizado con solicitudes de tokenización
y autorizaciones tokenizadas
BillingDetails
BillToAddress AN(50) Dirección del tarjetahabiente. Este valor se necesita para transacciones con
verificación AVS.
13
BillToAddress2 AN(50) Reservado para uso interno de FAC
BillToZipPostCode AN(10) Código postal del tarjetahabiente. Este valor se necesita para transacciones
con verificación AVS.
BillToFirstName AN(30) Nombre del tarjetahabiente
BillToLastName AN(30) Apellido del tarjetahabiente
BillToCity AN(30) Ciudad del tarjetahabiente.
BillToState AN(5) Estado o provincial del tarjetahabiente – debe tener un mínimo de dos
caracteres
BillToCountry N(3) Código ISO del país del tarjetahabiente (ej. U.S.A. = 840). Ver el Anexo A
en la Guía de integración FACPG2
BillToEmail AN(50) Dirección electrónica del tarjetahabiente
BillToTelephone N(20) Número telefónico del tarjetahabiente
FraudControlResults AuthCode N(6) Código de autorización de una transacción completada exitosamente
FraudControlId AN(50) Número de identificación de la transacción del sistema de control de fraudes
FraudResponseCode AN(3) Código de respuesta del Sistema de control de fraudes. Ver la sección de
Códigos de respuesta del sistema de control de fraudes en la Guía de
integración FACPG2
ReasonCode AN(4) Razón de fraude if ResponseCode = 3. Ver la sección de Códigos de respuesta del sistema de control de fraudes en la Guía de integración
FACPG2
ReasonCodeDesc AN(255) Descripción de la razón de fraude. Ver la sección de Códigos de razón del control de fraudes en la Guía de integración FACPG2
ResponseCode N(1) 1 or 3, Pass o Fail. Ver la sección de Códigos de respuesta de control de fraudes en la Guía de integración FACPG2
Score AN(20) Número de calificación de fraude (Kount)
14
Ejemplos de Código Fuente
Como se mencionó anteriormente, los servicios de pasarela de pagos de FAC aceptan tanto solicitudes
SOAP como XML POST.
En las secciones siguientes damos ejemplos de la mayoría de las operaciones incluidas en esta guía.
Por favor utilice estos ejemplos como referencia solamente.
Los ejemplos incluidos para todas las operaciones utilizan SOAP.
El ejemplo de la operación de autorización (Authorize) se encuentra tanto en SOAP como en XML POST.
15
Ejemplos de XML
Al utilizar la interface XML asegúrese de incluir referencias del espacio de nombre predeterminado para la
solicitud; podrá esperar en la respuesta, tal como se describe a continuación:
Ejemplo de solicitud:
<AuthorizeRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.firstatlanticcommerce.com/gateway/data">
Ejemplo de respuesta:
<AuthorizeRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.firstatlanticcommerce.com/gateway/data">
El siguiente ejemplo fue creado utilizando lenguaje Microsoft Visual Studio using C# y muestra cómo
postear una solicitud de autorización XML en nuestro ambiente de prueba.
Un ejemplo de mensaje de autorización XML (solicitud y respuesta) se puede encontrar en las páginas más
arriba.
/// <summary> /// Posts an XML message using HTTP POST /// </summary> /// <param name="strRequest">xmlrequest</param> /// <param name="baseUrl">For example: baseUrl= @https://ecm.firstatlanticcommerce.com </param> /// <param name="url">For example: url = @"/PGService/Services.svc" </param> /// <returns></returns> public static string postFACXMLMessage(string strRequest, string baseUrl, string url) { StreamReader reader = null; string strResponse = ""; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; byte[] byteArray = Encoding.UTF8.GetBytes(strRequest); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseUrl + url); req.Method = "POST"; req.ContentType = string.Format("text/xml"); req.ContentLength = byteArray.Length; try { // Get the request stream. Stream dataStream = req.GetRequestStream(); // Write the data to the request stream. dataStream.Write(byteArray, 0, byteArray.Length); // Close the Stream object. dataStream.Close(); WebResponse response = req.GetResponse();
16
Debug.WriteLine("Service Status Code:" + ((HttpWebResponse)response).StatusDescription); // Get the stream containing content returned by the server. dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. reader = new StreamReader(dataStream); // Read the content. strResponse = reader.ReadToEnd(); reader.Close(); } catch (WebException ex) { string exMessage = ex.Message; if (ex.Response != null) { using (var responseReader = new StreamReader(ex.Response.GetResponseStream())) { strResponse = responseReader.ReadToEnd(); } } } return strResponse; }
17
Ejemplos de SOAP
Los siguientes ejemplos se programaron utilizando operaciones SOAP en Microsoft C#.
Para poder correr estos ejemplos en Microsoft Visual Studio:
1) Genere un Proyecto de prueba C# y copie todo el código fuente C# que se encuentra a continuación
2) Genere las referencias necesarias de servicio (por ej.: Servicios, pago por tokens, HostedPage)
3) Asegúrese que el archivo app.config se vea similar a la configuración descrita más abajo (si fuese
necesario)
4) Asegúrese de checar que los nombres de servicio correspondan a la configuración (si fuese necesario)
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> … </runtime> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IHostedPage"> <security mode="Transport" /> </binding> <binding name="BasicHttpBinding_IServices"> <security mode="Transport" /> </binding> <binding name="BasicHttpBinding_Tokenization"> <security mode="Transport" /> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="https://ecm.firstatlanticcommerce.com/PGService/HostedPage.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IHostedPage" contract="HPPSvc.IHostedPage" name="BasicHttpBinding_IHostedPage" /> <endpoint address="https://ecm.firstatlanticcommerce.com/PGService/Services.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServices" contract="FPG2Svc.IServices" name="BasicHttpBinding_IServices" /> <endpoint address="https://ecm.firstatlanticcommerce.com/PGService/Tokenization.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Tokenization" contract="FACPG2Tok.Tokenization" name="BasicHttpBinding_Tokenization" /> </client> </system.serviceModel> </configuration>
18
Ejemplo de autorización simple (SOAP)
Este ejemplo muestra cómo enviar una autorización utilizando la operación Authorize de SOAP.
[TestClass] public class FACPG2Tests { private readonly string MERCH_ID = "YOUR MERCHANT ID NUMBER GOES HERE"; private readonly string MERCH_PWD = "YOUR MERCHANT PASSWORD GOES HERE"; [TestMethod] public void TestAuthorize_WithCorrectCardInfo_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD); //Act var authResponse = client.Authorize(authRequest); //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.CreditCardTransactionResults.ResponseCode == "1" && authResponse.CreditCardTransactionResults.ReasonCode == "1" && authResponse.CreditCardTransactionResults.ReasonCodeDescription == "Transaction is approved."); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.AuthCode)); Assert.IsFalse( string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.ReferenceNumber)); }
private FPG2Svc.AuthorizeRequest CreateAuthorizeRequest(string merchId, string merchPwd) { var request = new FPG2Svc.AuthorizeRequest { CardDetails = GetCardDetails(), TransactionDetails = GetTransactionDetails(merchId, merchPwd), ShippingDetails = null, BillingDetails = GetBillingDetails(), RecurringDetails = null, FraudDetails = null, ThreeDSecureDetails = null }; return request; }
19
private FPG2Svc.CardDetails GetCardDetails() { return new FPG2Svc.CardDetails { CardNumber = "4242424242424242", CardExpiryDate = "1220", CardCVV2 = "234" }; } private FPG2Svc.TransactionDetails GetTransactionDetails(string merchId, string merchPwd) { var amount = 1; var currency = "840"; var order = GenOrderNum(); return new FPG2Svc.TransactionDetails { Amount = AmountFormatted(amount).Trim(), Currency = currency, CurrencyExponent = 2, TransactionCode = 0, OrderNumber = order, AcquirerId = "464748", MerchantId = merchId, Signature = GenerateSignature(merchId, merchPwd, order, amount, currency), SignatureMethod = "SHA1", CustomerReference = $"This is a test for merchant: {merchId}" }; }
private BillingDetails GetBillingDetails() { return new BillingDetails { BillToFirstName = "John", BillToLastName = "Smith", BillToAddress = "1200 Whitewall Blvd.", BillToAddress2 = "Unit 15", BillToCity = "Boston", BillToZipPostCode = "200341", BillToState = "NY", BillToCountry = "840", BillToTelephone = "211-3454-6790", BillToEmail = "[email protected]" }; }
private string GenOrderNum() { return string.Format("Test|{0}", Right(Guid.NewGuid().ToString(), 18).Replace("-", "")); } public static string Right(string value, int length) { return value.Substring(value.Length - length); }
20
private string GenerateSignature(string merchId, string merchPwd, string ordNum, decimal amount, string curr) { var source = string.Format("{0}{1}{2}{3}{4}{5}", merchPwd, merchId, "464748", ordNum, AmountFormatted(amount).Trim(), curr.Trim()); //HPP Auth+3DS (trxn code 256) requires SHA1 signature no longer than 28 characters //so HPP signature cannot be URL-encoded return GenerateSignature(source); } public static string GenerateSignature(string source) { var provider = new SHA1CryptoServiceProvider(); var bytearray = Encoding.UTF8.GetBytes(source); var buffer = provider.ComputeHash(bytearray); var hashValue = Convert.ToBase64String(buffer); return hashValue; } public string AmountFormatted(decimal amount) { var factor = Math.Pow(10, 2); return Math.Round(amount * (decimal)factor, 0).ToString().PadLeft(12, '0'); }
}
21
Ejemplo de autorización simple (XML)
Este ejemplo muestra cómo enviar una autorización utilizando la operación Authorize de HTTP POST.
Los parámetros AuthorizeRequest y AuthorizeResponse necesitan estar activos para que este ejemplo
funcione.
La definición de esas clases se pueden extraer de las descripciones detalladas de campos que se incluyen
en cada sección para cada operación y también de los ejemplos de mensajes de SOAP.
[TestClass] public class FACPG2XMLTests { private const string BASE_XML_URL = @"https://ecm.firstatlanticcommerce.com"; private readonly string MERCH_ID = "YOUR MERCHANT ID NUMBER GOES HERE"; private readonly string MERCH_PWD = "YOUR MERCHANT PASSWORD GOES HERE"; [TestMethod] public void TestAuthorize_WithCorrectCardInfo_ShouldSucceed() { //Arrange ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var tcode = 0; //None=0 var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD, tcode); var authRequestBody = ToXML(authRequest); //Act var authResponseBody = ExecXmlAction(BASE_XML_URL, authRequestBody, "Authorize"); var authResponse = LoadFromXMLString(typeof(AuthorizeResponse), authResponseBody) as AuthorizeResponse; //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.CreditCardTransactionResults.ResponseCode == "1" && authResponse.CreditCardTransactionResults.ReasonCode == "1" && authResponse.CreditCardTransactionResults.ReasonCodeDescription == "Transaction is approved."); Assert.IsFalse(string.IsNullOrEmpty( authResponse.CreditCardTransactionResults.AuthCode)); Assert.IsFalse(string.IsNullOrEmpty( authResponse.CreditCardTransactionResults.ReferenceNumber)); }
22
/// <summary> /// Serializes an Object to XML /// </summary> /// <param name="obj"></param> /// <returns></returns> public string ToXML(object obj) { var stringwriter = new StringWriter(); var serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(stringwriter, obj); var rslt = stringwriter.ToString(); //Add default namespace to the Request --> // xmlns:i="http://www.w3.org/2001/XMLSchema-instance" // xmlns=""http://schemas.firstatlanticcommerce.com/gateway/data" rslt = rslt.Replace( @"Request xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">", @"Request xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.firstatlanticcommerce.com/gateway/data"">"); //Make sure the encoding is utf-8 return rslt.Replace(@"encoding=""utf-16""?", @"encoding=""utf-8""?"); } /// <summary> /// Deserializes a string into an object of the specified Type /// </summary> /// <param name="myType"></param> /// <param name="xmlText"></param> /// <returns></returns> public static object LoadFromXMLString(Type myType, string xmlText) { var xmlBody = @"<?xml version=""1.0"" encoding=""utf-8""?>" + "\n" + xmlText; //Remove default namespace otherwise Deserialization fails xmlBody = xmlBody.Replace( @"Response xmlns=""http://schemas.firstatlanticcommerce.com/gateway/data"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">", @"Response xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">"); var stringReader = new System.IO.StringReader(xmlBody); var serializer = new XmlSerializer(myType); return serializer.Deserialize(stringReader); } }
23
/// <summary> /// Post the XML request to the Server /// </summary> /// <param name="baseUrl"></param> /// <param name="requestBody"></param> /// <param name="xmlAction"></param> /// <returns></returns> string ExecXmlAction(string baseUrl, string requestBody, string xmlAction) { var url = $"{baseUrl}/PGServiceXML/{xmlAction}"; string ResponseRaw = PostXmlRequest(url, requestBody); return ResponseRaw; } public string PostXmlRequest(string url, string requestBody) { var postData = Encoding.UTF8.GetBytes(requestBody); var request = WebRequest.Create(url) as HttpWebRequest; if (request == null) { throw new Exception("HttpWebRequest initialization failed"); } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postData.Length; using (var requestStream = request.GetRequestStream()) { requestStream.Write(postData, 0, postData.Length); using (var responseStream = request.GetResponse().GetResponseStream()) using (var reader = new StreamReader(responseStream)) { return reader.ReadToEnd(); } } }
24
Ejemplo de autorización de una sola pasada con AVS (SOAP) [TestMethod] public void TestAuthorize_WithSinglePassAndAVSAndCorrectCardInfo_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD); authRequest.TransactionDetails.TransactionCode = 0 + 1 + 8; //AVS=1, SINGLE_PASS=8 //Act var authResponse = client.Authorize(authRequest); //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.CreditCardTransactionResults.ResponseCode == "1" && authResponse.CreditCardTransactionResults.ReasonCode == "1" && authResponse.CreditCardTransactionResults.ReasonCodeDescription == "Transaction is approved."); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.CVV2Result)); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.AVSResult)); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.AuthCode)); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.ReferenceNumber)); }
Authorization with Tokenization (SOAP) [TestMethod] public void TestAuthorize_WithTokenizePanAndCorrectCardInfo_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD); authRequest.TransactionDetails.TransactionCode = 0 + 128; //TokenizePAN=128 //Act var authResponse = client.Authorize(authRequest); //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.CreditCardTransactionResults.ResponseCode == "1" && authResponse.CreditCardTransactionResults.ReasonCode == "1" && authResponse.CreditCardTransactionResults.ReasonCodeDescription == "Transaction is approved."); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.AuthCode)); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.ReferenceNumber)); Assert.IsFalse(string.IsNullOrEmpty(authResponse.CreditCardTransactionResults.TokenizedPAN)); Assert.IsTrue(authResponse.CreditCardTransactionResults.TokenizedPAN != authRequest.CardDetails.CardNumber); }
25
Mensajes de Ejemplo
Ejemplo de AuthorizeRequest / AuthorizeResponse en SOAP:
AuthorizeRequest AuthorizeResponse POST
https://ecm.firstatlanticcommerce.com/PGServiceXML/Autho
rize HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: ecm.firstatlanticcommerce.com
Content-Length: 1906
Expect: 100-continue
Connection: Keep-Alive
<?xml version="1.0" encoding="utf-8"?>
<AuthorizeRequest
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.firstatlanticcommerce.com/gateway/
data">
<BillingDetails>
<BillToAddress>1200 Whitewall Blvd.</BillToAddress>
<BillToAddress2>Unit 15</BillToAddress2>
<BillToCity>Boston</BillToCity>
<BillToCountry>840</BillToCountry>
<BillToEmail>[email protected]</BillToEmail>
<BillToFirstName>John</BillToFirstName>
<BillToLastName>Smith</BillToLastName>
<BillToState>NY</BillToState>
<BillToTelephone>211-3454-6790</BillToTelephone>
<BillToZipPostCode>200341</BillToZipPostCode>
</BillingDetails>
<CardDetails>
<CardCVV2>234</CardCVV2>
<CardExpiryDate>1220</CardExpiryDate>
<CardNumber>4111111111111111</CardNumber>
<Installments>0</Installments>
</CardDetails>
<TransactionDetails>
<AcquirerId>464748</AcquirerId>
<Amount>000000000100</Amount>
<Currency>840</Currency>
<CurrencyExponent>2</CurrencyExponent>
<MerchantId>YOUR_MERCHANT_HERE</MerchantId>
<OrderNumber>Test|a4a475c787c2285f</OrderNumber>
<Signature>QCRcH7W20DVDWzTPlFZou+lXhTQ=</Signature>
<SignatureMethod>SHA1</SignatureMethod>
<TransactionCode>0</TransactionCode>
<CustomerReference>This is a
test</CustomerReference>
</TransactionDetails>
<ShippingDetails>
<ShipToAddress>1200 Whitewall Blvd.</ShipToAddress>
<ShipToAddress2>Unit 15</ShipToAddress2>
<ShipToCity>Boston</ShipToCity>
<ShipToCountry>840</ShipToCountry>
<ShipToEmail>[email protected]</ShipToEmail>
<ShipToFirstName>John</ShipToFirstName>
<ShipToLastName>Smith</ShipToLastName>
<ShipToState>NY</ShipToState>
<ShipToTelephone>211-3454-6790</ShipToTelephone>
<ShipToZipPostCode>200341</ShipToZipPostCode>
</ShippingDetails>
</AuthorizeRequest>
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Server: X-AspNet-Version: 4.0.30319 Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Thu, 28 Nov 2019 22:19:48 GMT Content-Length: 2206 <AuthorizeResponse xmlns="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <AcquirerId>464748</AcquirerId> <CreditCardTransactionResults> <AVSResult/> <AuthCode>123456</AuthCode> <CVV2Result>M</CVV2Result> <OriginalResponseCode>00</OriginalResponseCode> <PaddedCardNumber>XXXXXXXXXXXX1111</PaddedCardNumber> <ReasonCode>1</ReasonCode> <ReasonCodeDescription>Transaction is approved.</ReasonCodeDescription> <ReferenceNumber>933222600144</ReferenceNumber> <ResponseCode>1</ResponseCode> <TokenizedPAN/> </CreditCardTransactionResults> <CustomData/> <MerchantId>88800033</MerchantId> <OrderNumber>Test|a4a475c787c2285f</OrderNumber> <Signature>KPvVKY7wdcZMmLoLhiUjTkheSmA=</Signature> <SignatureMethod>SHA1</SignatureMethod> <BinCheckResults> <BIN/> <Brand/> <Country/> <Issuer/> <Subtype/> <Type/> </BinCheckResults> </FraudControlResults> <ShippingDetails> <ShipToAddress>1200 Whitewall Blvd.</ShipToAddress> <ShipToAddress2>Unit 15</ShipToAddress2> <ShipToCity>Boston</ShipToCity> <ShipToCountry>840</ShipToCountry> <ShipToCounty/> <ShipToEmail>[email protected]</ShipToEmail> <ShipToFirstName>John</ShipToFirstName> <ShipToLastName>Smith</ShipToLastName> <ShipToMobile/> <ShipToState>NY</ShipToState> <ShipToTelephone>211-3454-6790</ShipToTelephone> <ShipToZipPostCode>200341</ShipToZipPostCode> </ShippingDetails> </AuthorizeResponse>
26
Ejemplo de AuthorizeRequest / AuthorizeResponse en XML:
AuthorizeRequest AuthorizeResponse POST https://ecm.firstatlanticcommerce.com/PGServiceXML/Authorize
HTTP/1.1
Content-Type: text/xml
Host: ecm.firstatlanticcommerce.com
Content-Length: 2386
Expect: 100-continue
Connection: Keep-Alive
<AuthorizeRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.firstatlanticcommerce.com/gateway/data"> <TransactionDetails> <AcquirerId>464748</AcquirerId> <MerchantId>MERCHANT_ID HERE</MerchantId> <OrderNumber>Test|b40a41bda7d6402d</OrderNumber> <TransactionCode>0</TransactionCode> <Amount>000000000120</Amount> <Currency>840</Currency> <CurrencyExponent>2</CurrencyExponent> <SignatureMethod>SHA1</SignatureMethod> <Signature>SIGNATURE_HERE</Signature> <IPAddress /> <CustomData /> <CustomerReference /> <ExtensionData /> </TransactionDetails> <CardDetails> <CardNumber>4111111111111111</CardNumber> <CardExpiryDate>0130</CardExpiryDate> <CardCVV2>123</CardCVV2> <IssueNumber /> <StartDate /> <Installments>0</Installments> <DocumentNumber /> <ExtensionData /> </CardDetails> <BillingDetails> <BillToAddress>STREET786</BillToAddress> <BillToAddress2 /> <BillToZipPostCode /> <BillToFirstName /> <BillToLastName /> <BillToCity>BELGARDE</BillToCity> <BillToState /> <BillToCountry /> <BillToEmail /> <BillToTelephone>875684445</BillToTelephone> <BillToCounty /> <BillToMobile /> <ExtensionData /> </BillingDetails> <ThreeDSecureDetails> <ECIIndicator /> <AuthenticationResult /> <TransactionStain /> <CAVV /> </ThreeDSecureDetails> <RecurringDetails> <IsRecurring>false</IsRecurring> <ExecutionDate /> <Frequency /> <NumberOfRecurrences>0</NumberOfRecurrences> </RecurringDetails> <ShippingDetails> <ShipToAddress /> <ShipToAddress2 />
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'
Strict-Transport-Security: max-age=31536000;
includeSubdomains=true
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Date: Tue, 19 Feb 2019 14:17:07 GMT
Content-Length: 1884
<AuthorizeResponse xmlns="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <AcquirerId>464748</AcquirerId> <BillingDetails> <BillToAddress>STREET786</BillToAddress> <BillToAddress2/> <BillToCity>BELGARDE</BillToCity> <BillToCountry/> <BillToEmail/> <BillToFirstName/> <BillToLastName/> <BillToState/> <BillToTelephone>875684445</BillToTelephone> <BillToZipPostCode/> <BillToCounty/> <BillToMobile/> </BillingDetails> <CreditCardTransactionResults> <AVSResult/> <AuthCode>123456</AuthCode> <CVV2Result>M</CVV2Result> <OriginalResponseCode>00</OriginalResponseCode> <PaddedCardNumber>XXXXXXXXXXXX1111</PaddedCardNumber> <ReasonCode>1</ReasonCode> <ReasonCodeDescription>Transaction is approved.</ReasonCodeDescription> <ReferenceNumber>905014574660</ReferenceNumber> <ResponseCode>1</ResponseCode> <TokenizedPAN/> </CreditCardTransactionResults> <CustomData/> <IPGeoLocationResults> <City/> <CountryLong/> <CountryShort/> <DomainName/> <IPAddress/> <IPResponseCode/> <IPResponseCodeDescription/> <ISP/> <Latitude/> <Longitude/> <Region/> <TimeZone/> <ZipCode/> </IPGeoLocationResults> <MerchantId>88800033</MerchantId> <OrderNumber>Test|b40a41bda7d6402d</OrderNumber> <Signature>DU8gjgUD5JCajxOjl7/mgWdq7Qs=</Signature> <SignatureMethod>SHA1</SignatureMethod>
27
<ShipToZipPostCode /> <ShipToFirstName /> <ShipToLastName /> <ShipToCity /> <ShipToState /> <ShipToCountry /> <ShipToEmail /> <ShipToTelephone /> <ShipToMobile /> <ShipToCounty /> </ShippingDetails> <FraudDetails> <SessionId /> <AuthResponseCode /> <AVSResponseCode /> <CVVResponseCode /> </FraudDetails> <InterfaceCode></InterfaceCode> <TransactionID>00000000-0000-0000-0000-000000000000</TransactionID> <Version>0</Version> <ExtensionData /> </AuthorizeRequest>
<BinCheckResults> <BIN>411111</BIN> <Brand>VISA</Brand> <Country>UNITED STATES</Country> <Issuer>JPMORGAN CHASE BANK, N.A.</Issuer> <Subtype/> <Type/> </BinCheckResults> <FraudControlResults> <FraudControlId>7TMN0Q08KS3X</FraudControlId> <FraudResponseCode>A</FraudResponseCode> <ReasonCode/> <ReasonCodeDesc/> <ResponseCode>1</ResponseCode> <Score>34</Score> </FraudControlResults> <ShippingDetails> <ShipToAddress/> <ShipToAddress2/> <ShipToCity/> <ShipToCountry/> <ShipToCounty/> <ShipToEmail/> <ShipToFirstName/> <ShipToLastName/> <ShipToMobile/> <ShipToState/> <ShipToTelephone/> <ShipToZipPostCode/> </ShippingDetails> </AuthorizeResponse>
28
La operación TransactionModification
La operación TransactionModification permite cambios a una transacción previamente autorizada.
Las siguientes operaciones son posibles:
1) Capture
2) Refund
3) Reversal
Nota: Si recibe una notificación de caducidad (timeout) de una transacción de Capture, Reversal o Refund, deberá
revisar los reportes web de FAC para verificar si la transacción fue o no completada.
Tipos de modificación
Capture
La operación Capture se utiliza para capturar una transacción previamente autorizada que no ha sido aún
capturada.
- Si el monto de la captura es igual al de la transacción previamente autorizada, la transacción se enviará para
ser completada durante el siguiente periodo de liquidación.
- Si el monto solicitado de la captura es menor al monto previamente autorizado, la transacción no se
completará hasta que la diferencia sea reversada o que se emita una nueva solicitud de captura que coincida
con el monto autorizado originalmente.
- Si el monto solicitado de la captura es mayor al monto previamente autorizado, se generará un mensaje de
error.
Nota: Informe a FAC si usted planea procesar capturas parciales, pues se requiere de una configuración
específica en nuestro sistema de pasarela de pagos.
Refund
La operación de Refund se utiliza para reembolsar una transacción previamente capturada y liquidada. Una
transacción de reembolso se enviará para ser completada en el siguiente periodo de liquidación.
Nota: Es posible reembolsar una transacción que no ha sido aún completada, pero al hacer esto, tanto la captura
como el reembolso aparecerán en el estado de cuenta de tarjeta de crédito del cliente como un débito seguido de
un crédito. De ser posible, sería preferible evitar esto por lo que se recomienda que la transacción capturada se
reverse antes de su liquidación.
29
Reversal
La operación de Reversal se puede utilizar para reversar en forma parcial o total una transacción previamente
capturada.
- Si una transacción previamente autorizada se captura en forma parcial solamente, el monto remanente
deberá ser reversado antes de que el monto parcial sea completado.
- Esta operación también se puede utilizar para reversar una transacción capturada en su totalidad, siempre y
cuando la transacción no haya sido enviada para su liquidación. Si la transacción ya ha sido enviada para
liquidación, se tendrá que procesar un reembolso de la misma de acuerdo a la operación Refund descrita
anteriormente.
Nota:
- Si usted necesita procesar reversos parciales por favor informe a FAC, pues para ello se requiere de una
configuración específica en nuestro sistema de pasarela de pagos.
Para una lista completa de códigos de posibles respuestas y de razones de una solicitud de reembolso, favor de
consultar la sección Códigos de Respuesta y Respuestas de Códigos de Razones en la Guía de integración
FACPG2.
TransactionModificationRequest – Descripciones detalladas de campos
Nota:
“R/O/C” se refiere a si la presencia del campo es Requerida (obligatoria), Opcional o Condicional.
N/AN se refiere a si el campo es Numérico o AlfaNumérico.
Sección Nombre del campo Form
ato
Presen
cia
Notas:
TransactionModification Request (Main Body)
ModificationType N(1) R Puede ser uno de 3 valores:
1 = Capture (captura)
2 = Refund (reembolso)
3 = Reversal (reverso)
AcquirerID N(11) R “464748”
Password AN(20)
R Contraseña del comercio
MerchantID N(15) R Su número de FAC ID que le
proporcionó FAC
OrderNumber AN(150)
R Identificador único asignado
por el comercio para la
transacción
30
Amount N(12) R Monto total de la compra.
Nota: El monto de la compra
deberá presentarse como una
secuencia de 12 caracteres
(por ej. $12.00 se escribiría
“000000001200”)
CurrencyExponent N(1) R El número de dígitos después
del punto decimal del monto
de la compra (por ej. $12.00
= 2)
TransactionModificationResponse – Descripciones detalladas de campos
Nota:
“R/O/C” se refiere a si la presencia del campo es Requerida (obligatoria), Opcional o Condicional.
N/AN se refiere a si el campo es Numérico o AlfaNumérico.
Sección Nobre del campo Form
ato
Notas:
Transaction
Modification
Response
(Main Body)
AcquirerID N(11) El valor pasado en AcquiereId en la
operación AuthorizeRequest
MerchantID N(15) El valor pasado en AcquirerId en la
operación AuthorizeRequest
OrderNumber AN(150)
Identificador único asignado por el
comercio para la transacción
OriginalResponseCode AN(3) Ver Códigos de respuesta de autorización
original en la Guía de integración FACPG2
para consultar los posibles valores de este
parámetro
ReasonCode N(4) Ver Códigos de razón y respuesta de
modificación de transacción en la Guía de
integración FACPG2
ReasonCodeDescription
AN(100)
Ver Códigos de razón y respuesta de
modificación de transacción en la Guía de
integración FACPG2
ResponseCode N(1) Ver Códigos de razón y respuesta de
modificación de transacción en la Guía de
integración FACPG2
31
Ejemplos de Código Fuente
Modificación de transacción – Capture (SOAP)
Este ejemplo muestra cómo enviar una captura de una transacción previamente autorizada utilizando la
operación de SOAP TransactionModification.
Por favor, tome nota de que en este ejemplo primero se autoriza la transacción y después se envía la
captura.
[TestMethod] public void TestCapture_WithCorrectInfo_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //First send the authorization var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD); var authResponse = client.Authorize(authRequest); //Then create the capture with the order number of the authorization we just sent var captureRequest = CreateCaptureRequest(MERCH_ID, MERCH_PWD, authRequest.TransactionDetails.OrderNumber); //Act var captureResponse = client.TransactionModification(captureRequest); //Assert Assert.IsNotNull(captureResponse); Assert.IsTrue(captureResponse.ResponseCode == "1" && captureResponse.ReasonCode == "1101" && captureResponse.ReasonCodeDescription == "Transaction successful"); }
private TransactionModificationRequest CreateCaptureRequest(string merchId, string merchPwd, string orderNumber) { var amount = 1; return new TransactionModificationRequest { ModificationType = 1, //Capture=1 AcquirerId = "464748", MerchantId = merchId, Password = merchPwd, OrderNumber = orderNumber, Amount = AmountFormatted(amount).Trim(), CurrencyExponent = 2 }; }
32
Modificación de transacción – Reversal (SOAP)
Este ejemplo muestra cómo enviar un reverso de una transacción previamente capturada utilizando la
operación de SOAP TransactionModification.
Por favor, tome nota de que en este ejemplo primero se autoriza la transacción, después se envía la
captura y finalmente se envía el reverso.
[TestMethod] public void TestReversal_WithCorrectInfo_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //First send the authorization var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD); var authResponse = client.Authorize(authRequest); //Then create the capture with the order number of the authorization we just sent var captureRequest = CreateCaptureRequest(MERCH_ID, MERCH_PWD, authRequest.TransactionDetails.OrderNumber); //Then create the reversal with the order number of the authorization we just sent var reversalRequest = CreateReversalRequest(MERCH_ID, MERCH_PWD, authRequest.TransactionDetails.OrderNumber); //Act var reversalResponse = client.TransactionModification(reversalRequest); //Assert Assert.IsNotNull(reversalResponse); Assert.IsTrue(reversalResponse.ResponseCode == "1" && reversalResponse.ReasonCode == "1101" && reversalResponse.ReasonCodeDescription == "Transaction successful"); }
private TransactionModificationRequest CreateReversalRequest(string merchId, string merchPwd, string orderNumber) { var amount = 1; return new TransactionModificationRequest { ModificationType = 3, //Reversal=3 AcquirerId = "464748", MerchantId = merchId, Password = merchPwd, OrderNumber = orderNumber, Amount = AmountFormatted(amount).Trim(), CurrencyExponent = 2 }; }
33
Modificación de transacción – Refund (SOAP)
Este ejemplo muestra cómo enviar un reembolso de una transacción previamente capturada y liquidada
utilizando la operación de SOAP TransactionModification.
Por favor, tome nota de que en este ejemplo primero se autoriza la transacción, después se envía la
captura y finalmente se envía el reembolso.
Este ejemplo no completa la transacción, pues la liquidación es un proceso batch que corre diariamente.
[TestMethod] public void TestRefund_WithCorrectInfo_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //First send the authorization var authRequest = CreateAuthorizeRequest(MERCH_ID, MERCH_PWD); var authResponse = client.Authorize(authRequest); //Then we send the capture with the order number of the authorization we just sent var captureRequest = CreateCaptureRequest(MERCH_ID, MERCH_PWD, authRequest.TransactionDetails.OrderNumber); var captureResponse = client.TransactionModification(captureRequest); //Then create the refund with the order number of the authorization we just sent var refundRequest = CreateRefundRequest(MERCH_ID, MERCH_PWD, authRequest.TransactionDetails.OrderNumber); //Act var refundResponse = client.TransactionModification(refundRequest); //Assert Assert.IsNotNull(refundResponse); Assert.IsTrue(refundResponse.ResponseCode == "1" && refundResponse.ReasonCode == "1101" && refundResponse.ReasonCodeDescription == "Transaction successful"); }
private TransactionModificationRequest CreateRefundRequest(string merchId, string merchPwd, string orderNumber) { var amount = 1; return new TransactionModificationRequest { ModificationType = (int)ModificationType.Refund, AcquirerId = "464748", MerchantId = merchId, Password = merchPwd, OrderNumber = orderNumber, Amount = AmountFormatted(amount).Trim(), CurrencyExponent = 2 }; }
Mensajes de Ejemplo
Ejemplo de TransactionModificationRequest / TransactionModificationResponse en XML para una captura:
TransactionModificationRequest TransactionModificationResponse POST https://ecm.firstatlanticcommerce.com/PGServiceXML/TransactionModification HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: ecm.firstatlanticcommerce.com Content-Length: 495 Expect: 100-continue <?xml version="1.0" encoding="utf-8"?> <TransactionModificationRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.firstatlanticcommerce.com/gateway/data"> <AcquirerId>464748</AcquirerId> <Amount>000000000100</Amount> <CurrencyExponent>2</CurrencyExponent> <MerchantId>YOUR_MERCHANT_HERE</MerchantId> <ModificationType>1</ModificationType> <OrderNumber>Test|a4a475c787c2285f</OrderNumber> <Password>*********</Password> </TransactionModificationRequest>
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html Server: X-AspNet-Version: 4.0.30319 Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Thu, 28 Nov 2019 22:19:50 GMT Content-Length: 444 <TransactionModificationResponse xmlns="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <AcquirerId>464748</AcquirerId> <MerchantId>88800033</MerchantId> <OrderNumber>Test|a4a475c787c2285f</OrderNumber> <OriginalResponseCode/> <ReasonCode>1101</ReasonCode> <ReasonCodeDescription>Transaction successful</ReasonCodeDescription> <ResponseCode>1</ResponseCode> </TransactionModificationResponse>
35
Ejemplo de TransactionModificationRequest / TransactionModificationResponse en SOAP para una captura:
TransactionModificationRequest TransactionModificationResponse POST https://ecm.firstatlanticcommerce.com/PGService/Services.svc HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://schemas.firstatlanticcommerce.com/gateway/IServices/TransactionModification" Host: ecm.firstatlanticcommerce.com Content-Length: 611 Expect: 100-continue Accept-Encoding: gzip, deflate <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <TransactionModification xmlns="http://schemas.firstatlanticcommerce.com/gateway"> <Request xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:AcquirerId>464748</a:AcquirerId> <a:Amount>000000000100</a:Amount> <a:CurrencyExponent>2</a:CurrencyExponent> <a:MerchantId>MERCHANT_HERE</a:MerchantId> <a:ModificationType>1</a:ModificationType> <a:OrderNumber>Test|b69013d69fa1a47f</a:OrderNumber> <a:Password>PASSWORD_HERE</a:Password> </Request> </TransactionModification> </s:Body> </s:Envelope>
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Server: Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-Frame-Options: sameorigin X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Fri, 24 Jan 2020 20:31:32 GMT Content-Length: 686 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <TransactionModificationResponse xmlns="http://schemas.firstatlanticcommerce.com/gateway"> <TransactionModificationResult xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:AcquirerId>464748</a:AcquirerId> <a:MerchantId>MERCHANT_ID</a:MerchantId> <a:OrderNumber>Test|b69013d69fa1a47f</a:OrderNumber> <a:OriginalResponseCode/> <a:ReasonCode>1101</a:ReasonCode> <a:ReasonCodeDescription>Transaction successful</a:ReasonCodeDescription> <a:ResponseCode>1</a:ResponseCode> </TransactionModificationResult> </TransactionModificationResponse> </s:Body> </s:Envelope>
La operación de pago por token o tokenización
En la operación de tokenización se toma un número de tarjeta y se devuelve un número de tarjeta tokenizado.
Favor de referirse a la sección de Pagos por token utilizando la operación Authorize (y Authorize3DS) de la Guía
de integración FACPG2, para mayor información sobre los usos y formatos de tokenización.
- Aunque usted puede solicitar un PAN tokenizado utilizando los métodos Authorize o Authorize3DS, algunos
comercios prefieren convertir los números de tarjeta que tienen almacenados “en masa”. Este método se
puede utilizar para hacer esto.
- Una vez creado un token, usted puede utilizar el PAN tokenizado en lugar del número de tarjeta y fecha de
expiración para todas las transacciones futuras del mismo tarjetahabiente. Si desea reducir el alcance de
algunas partes de sus sistema para cumplir con PCI, usted no debería almacenar el número original de la
tarjeta y debería eliminarlo al momento de ser tokenizado.
Nota IMPORTANTE:
• Cuando se tokeniza un número de tarjeta de crédito mediante la operación Tokenize, la fecha de
vencimiento es obligatoria y se almacena en la base de datos FAC para su uso futuro durante la
Autorización.
• Sin embargo, la validez de la Fecha de Vencimiento no se puede verificar en el Banco hasta que se envíe
posteriormente una Autorización.
• Esto significa que si la fecha de vencimiento proporcionada es incorrecta al llamar a la función Tokenize,
cualquier autorización posterior se rechazará en el banco independientemente de la fecha de
vencimiento proporcionada durante la autorización (porque solo se utiliza la fecha de vencimiento
almacenada y fue incorrecta en el citado ejemplo )
• Se recomienda utilizar solamente Authorize o Authorize3DS con TransactionCode = 128. Estas
operaciones, con el mencionado código de transacción, tokenizarán el número de la tarjeta de crédito
solo si la autorización tiene éxito, lo que significa que la fecha de vencimiento y el CVV se han verificado
en el banco previamente.
37
TokenizeRequest – Descripciones detalladas de campos
Nobre del
campo
Format
o
Presenc
ia
Valor
CardNumb
er
N(19) R Número de tarjeta a ser tokenizado
Customer Reference
AN(255) R Nombre o número de identificación interno de cliente. Debería
ser único para cada cliente (tarjetahabiente)
ExpiryDate N(4) R Fecha de expiración (MMYY) de la tarjeta
Merchant Number
N(8) R Su número de FAC ID que le proporcionó FAC
Signature AN(28) R Ver Creación y verificación de firma en la Guía de integración FACPG2 o en los ejemplos que vienen más abajo
TokenizeResponse – Descripciones detalladas de campos
Nobre del
campo
Format
o
Presenc
ia
Valor
ErrorMsg AN(255) O Contiene información sobre cualquier tipo de error
Success Boolean R Puede ser True o False
Token AN(19) R El número tokenizado de tarjeta
Ejemplo:
CardNumber: 4111111111111111
ExpiryDate: 1220
Token: 411111_000011111
38
Ejemplos de Código Fuente
Tokenización (SOAP)
Este ejemplo muestra cómo enviar una solicitud de tokenización de tarjeta de crédito utilizando la
operación Tokenize de SOAP
Si el proceso se completa en forma exitosa, se obtiene un token para la tarjeta de crédito en cuestión.
[TestMethod] public void TestTokenize_WithCorrectCardInfo_ShouldSucceed() { //Arrange var client = new TokenizationClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var tokRequest = CreateTokenizationRequest(MERCH_ID, MERCH_PWD); //Act var tokResponse = client.Tokenize(tokRequest); //Assert Assert.IsNotNull(tokResponse); Assert.IsTrue(tokResponse.Success); Assert.IsNotNull(tokResponse.Token); Assert.IsTrue(tokResponse.Token != tokRequest.CardNumber); Assert.IsTrue(string.IsNullOrEmpty(tokResponse.ErrorMsg)); }
private TokenizationSvc.TokenizeRequest CreateTokenizationRequest(string merchId, string merchPwd) { return new TokenizationSvc.TokenizeRequest { CardNumber="4111111111111111", ExpiryDate = "1220", MerchantNumber=merchId, Signature = GenerateTokenSignature(merchId, merchPwd) }; }
private string GenerateTokenSignature(string merchId, string merchPwd) { var source = string.Format("{0}{1}{2}", merchPwd, merchId, "464748"); return GenerateSignature(source); }
39
Mensajes de Ejemplo
Ejemplo de TokenizeRequest / TokenizeResponse en SOAP: POST
https://ecm.firstatlanticcommerce.com/PGService/Tokenization.svc
HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction:
"http://schemas.firstatlanticcommerce.com/gateway/Tokenization/Token
ize"
Host: ecm.firstatlanticcommerce.com
Content-Length: 520
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Tokenize
xmlns="http://schemas.firstatlanticcommerce.com/gateway">
<Request
xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/data"
xmlns:i="http://www.w3.org/2001/XMLSchema-
instance">
<a:CardNumber>4111111111111111</a:CardNumber>
<a:CustomerReference i:nil="true"/>
<a:ExpiryDate>0121</a:ExpiryDate>
<a:MerchantNumber>YOUR_MERCHANT</a:MerchantNumber>
<a:Signature>m//jB6Dpgl3OyXeA/thFQNelXb0=</a:Signature>
</Request>
</Tokenize>
</s:Body>
</s:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Server:
Content-Security-Policy: default-src https: 'unsafe-eval'
'unsafe-inline'
Strict-Transport-Security: max-age=31536000;
includeSubdomains=true
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Date: Fri, 24 Jan 2020 21:04:43 GMT
Content-Length: 412
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<TokenizeResponse
xmlns="http://schemas.firstatlanticcommerce.com/gateway">
<TokenizeResult
xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/da
ta" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:ErrorMsg/>
<a:Success>true</a:Success>
<a:Token>411111_04NK01111</a:Token>
</TokenizeResult>
</TokenizeResponse>
</s:Body>
</s:Envelope>
Ejemplo de TokenizeRequest / TokenizeResponse en XML:
POST
https://ecm.firstatlanticcommerce.com/PGServiceXML/Tokeniz
e HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: ecm.firstatlanticcommerce.com
Content-Length: 369
Expect: 100-continue
Connection: Keep-Alive
<?xml version="1.0" encoding="utf-8"?>
<TokenizeRequest
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.firstatlanticcommerce.com/gateway/da
ta">
<CardNumber>4111111111111111</CardNumber>
<ExpiryDate>0121</ExpiryDate>
<MerchantNumber>YOUR_MERCHANT</MerchantNumber>
<Signature>m//jB6Dpgl3OyXeA/thFQNelXb0=</Signature
>
</TokenizeRequest>
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html
Server:
X-AspNet-Version: 4.0.30319
Content-Security-Policy: default-src https: 'unsafe-eval'
'unsafe-inline'
Strict-Transport-Security: max-age=31536000;
includeSubdomains=true
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Date: Fri, 24 Jan 2020 21:08:33 GMT
Content-Length: 216
<TokenizeResponse
xmlns="http://schemas.firstatlanticcommerce.com/gateway/d
ata" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorMsg/>
<Success>true</Success>
<Token>411111_04NK01111</Token>
</TokenizeResponse>
40
La operación 3D-Secure
3-D Secure es un protocolo XML diseñado para agregar una capa de seguridad a las transacciones de tarjetas de
crédito y débito.
El protocolo utiliza mensajes XML que se envían a través de conexiones SSL con autenticación de cliente
(esto asegura la autenticidad tanto del servidor como del cliente, utilizando certificados digitales).
La intención de este Sistema es que los tarjetahabientes reduzcan el riesgo de que otras personas
puedan utilizar sus tarjetas para cometer fraudes a través del internet.
La ventaja para los comercios es la reducción de contracargos por concepto de “cargos no autorizados”.
La operación Authorize3DS utiliza el mensaje Authorize3DSRequest para mandar datos de 3DS Authorization
que se utilizan para construir una forma HTML con campos ocultos. Esta forma se devuelve en la operación
Authorize3DSResponse.
Este método es diferente al método de web Authorize en que la respuesta que se devuelve no es la autorización
final; más bien se trata de una página HTML con código JavaScript integrado que debe ser re-dirigido al
navegador del tarjetahabiente. Esto es necesario para que la porción de autenticación de una transacción con
seguridad 3D ocurra directamente entre el navegador del tarjetahabiente y su banco emisor.
Por esta razón, usted deberá hacer dos cosas para utilizar estos métodos en la web:
1) Publique la respuesta de este mensaje, sin modificaciones, de vuelta en el navegador del
tarjetahabiente.
2) Desarrolle una página web segura utilizando HTTPS para recibir la información de la autorización final
en 3DS. El URL de esta página deberá incluirse en el campo MerchantResponseURL de la solicitud
Authorize3DS.
Nota importante
Cuando se invoca la función Authorize3DS ejecuta solo la primera parte de la operación:
• Cualquier información de error detectada en los parámetros Authorize3DSRequest se devolverá dentro
de un formulario HTML, de vuelta al MerchantResponseURL especificado. Ver ejemplo para más
detalles.
• Si no se detectaron errores en Authorize3DS, el formulario HTML devuelto redirigirá al usuario a la
página de autenticación 3DS del banco. Después de que el usuario se autentica, el usuario es redirigido a
MerchantResponseURL y esa redirección también lleva un formulario HTML con el resultado de la
autenticación (campo AuthenticationResult y ECIIndicator) y la prueba de autenticación (campo CAVV).
Ver ejemplo para más detalles.
41
3D-Secure con Tokenizacion
En la actualidad la mayoría de los bancos exigen que las transacciones se realicen exclusivamente como
transacciones 3D-Secure.
Al usar la “card on file”, la tarjeta debe ser Tokenizada previamente usando el método Tokenize
explicado anteriormente. El CVV no se proporcionará durante el proceso de tokenización. Para más
información consultar aquí.
La tarjeta Tokenizada y el CVV (el CVV que es capturado por el usuario cada vez) deberán proporcionarse
en la operación Authorize3Ds.
Aquí se proporciona un ejemplo o tokenización con 3D-Secure.
Authorize3DSRequest – Descripciones detalladas de campos
Sección Nobre del campo Format
o
Presenci
a
Notas:
Authorize3DSReque
st
(Main Body)
MerchantResponseURL AN(250) R El URL de una página web
segura utilizando HTTPS para
recibir la información de la
autorización final en 3DS.
BillingDetails Ver la sección, AuthorizeRequest, BillingDetails en la Guía de integración
FACPG2
CardDetails Ver la sección, AuthorizeRequest, CardDetails en la Guía de integración
FACPG2
TransactionDetails Ver la sección, AuthorizeRequest, TransactionDetails en la Guía de integración
FACPG2
FraudDetails Ver la sección, AuthorizeRequest, FraudDetails en la Guía de integración
FACPG2
Authorize3DSResponse – Descripciones detalladas de campos
Sección Nobre del campo Format
o
Notas:
Authorize3DSRespons
e
(Main Body)
HTMLFormData AN(250) Página HTML con JavaScript que
se debe postear de regreso al
navegador del usuario
ResponseCode N(4) Responde con un "00" si la
autorización procede o "03" si hay
algún problema
ResponseCodeDescription AN(100) Descripción de la respuesta
42
TokenizedPAN N(19) Se despliega el número de tarjeta
tokenizado con solicitudes de
tokenización y autorizaciones
tokenizadas
3DSecure Authentication Result (EcIIndicator, AuthenticationResult, CAVV)
43
Ejemplos de Código Fuente
Authorize3DS (SOAP)
Este ejemplo muestra cómo enviar una autorización 3DS utilizando la operación Authorize3DS de SOAP
Este ejemplo solamente verifica la tarjeta registrada en 3DS.
El resultado de invocar la operación Authorize3DS es una forma HTML que se presentará al usuario para
continuar con el paso de autenticación en el proceso 3D Secure.
[TestMethod] public void TestAuthorize3DS_WithAuthOnly_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var authRequest = CreateAuthorize3DSRequest(MERCH_ID, MERCH_PWD); authRequest.TransactionDetails.TransactionCode = 0 + 64; //AuthenticateOnly=64 //Act var authResponse = client.Authorize3DS(authRequest); //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.ResponseCode == "0" && authResponse.ResponseCodeDescription == "Success"); Assert.IsFalse(string.IsNullOrEmpty(authResponse.HTMLFormData)); Assert.IsTrue(authResponse.HTMLFormData.StartsWith("<HTML><BODY><FORM ID=")); Assert.IsTrue(authResponse.HTMLFormData.Contains("Please click on the Submit button to continue processing")); }
private FPG2Svc.Authorize3DSRequest CreateAuthorize3DSRequest(string merchId, string merchPwd) { var request = new FPG2Svc.Authorize3DSRequest { CardDetails = GetCardDetails(), TransactionDetails = GetTransactionDetails(merchId, merchPwd, 0), ShippingDetails = GetShippingDetails(), BillingDetails = GetBillingDetails(), RecurringDetails = GetRecurringDetails(), FraudDetails = GetFraudDetails(), MerchantResponseURL ="https://Merchant.com/MerchantResponseURL" }; return request; }
44
private static FACPG2Svc.TransactionDetails GetTransactionDetails(string merchId, string merchPwd, int tcode) { var amount = 1; var currency = "840"; var order = GenOrderNum(); return new FACPG2Svc.TransactionDetails { Amount = AmountFormatted(amount).Trim(), Currency = currency, CurrencyExponent = 2, TransactionCode = tcode, OrderNumber = order, AcquirerId = "464748", MerchantId = merchId, Signature = GenerateSignature(merchId, merchPwd, order, amount, currency), SignatureMethod = "SHA1", CustomerReference = $"This is a test for merchant: {merchId}" }; }
public static string GenerateSignature(string merchId, string merchPwd, string ordNum, decimal amount, string curr) { var source = string.Format("{0}{1}{2}{3}{4}{5}", merchPwd, merchId, "464748", ordNum, AmountFormatted(amount).Trim(), curr.Trim()); //HPP Auth+3DS (trxn code 256) requires SHA1 signature no longer than 28 characters //so HPP signature cannot be URL-encoded return GenerateSignature(source); } public static string GenerateSignature(string source) { var provider = new SHA1CryptoServiceProvider(); var bytearray = Encoding.UTF8.GetBytes(source); var buffer = provider.ComputeHash(bytearray); var hashValue = Convert.ToBase64String(buffer); return hashValue; } public static string AmountFormatted(decimal amount) { var factor = Math.Pow(10, 2); return Math.Round(amount * (decimal)factor, 0).ToString().PadLeft(12, '0'); }
45
Authorize3DS (XML)
[TestMethod] public void TestAuthorize3DS_WithCorrectCardInfo_ShouldSucceed() { //Arrange ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; WebUtils.AcceptCerts(); var authRequest = CreateAuthorize3DSRequest(MERCH_ID, MERCH_PWD); var authRequestBody = ToXML(authRequest); //Act var authResponseBody = ExecXmlAction(BASE_XML_URL, authRequestBody, "Authorize3DS"); var authResponse = LoadFromXMLString(typeof(FACPG2Svc.Authorize3DSResponse), authResponseBody) as FACPG2Svc.Authorize3DSResponse; //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.ResponseCode == "0" && authResponse.ResponseCodeDescription == "Success"); Assert.IsFalse(string.IsNullOrEmpty(authResponse.HTMLFormData)); Assert.IsTrue(authResponse.HTMLFormData.StartsWith("<HTML><BODY><FORM ID=")); Assert.IsTrue(authResponse.HTMLFormData.Contains("Please click on the Submit button to continue processing")); }
private Authorize3DSRequest CreateAuthorize3DSRequest(string merchId, string merchPwd) { var request = new Authorize3DSRequest { CardDetails = GetCardDetails(), TransactionDetails = GetTransactionDetails(merchId, merchPwd, 0), ShippingDetails = GetShippingDetails(), BillingDetails = GetBillingDetails(), RecurringDetails = GetRecurringDetails(), FraudDetails = GetFraudDetails(), MerchantResponseURL ="https://Merchant.com/MerchantResponseURL" }; return request; }
private static TransactionDetails GetTransactionDetails(string merchId, string merchPwd, int tcode) { var amount = 1; var currency = "840"; var order = GenOrderNum(); return new TransactionDetails {
46
Amount = AmountFormatted(amount).Trim(), Currency = currency, CurrencyExponent = 2, TransactionCode = tcode, OrderNumber = order, AcquirerId = "464748", MerchantId = merchId, Signature = GenerateSignature(merchId, merchPwd, order, amount, currency), SignatureMethod = "SHA1", CustomerReference = $"This is a test for merchant: {merchId}" }; }
public static string GenerateSignature(string merchId, string merchPwd, string ordNum, decimal amount, string curr) { var source = string.Format("{0}{1}{2}{3}{4}{5}", merchPwd, merchId, "464748", ordNum, AmountFormatted(amount).Trim(), curr.Trim()); //HPP Auth+3DS (trxn code 256) requires SHA1 signature no longer than 28 characters //so HPP signature cannot be URL-encoded return GenerateSignature(source); } public static string GenerateSignature(string source) { var provider = new SHA1CryptoServiceProvider(); var bytearray = Encoding.UTF8.GetBytes(source); var buffer = provider.ComputeHash(bytearray); var hashValue = Convert.ToBase64String(buffer); return hashValue; } public static string AmountFormatted(decimal amount) { var factor = Math.Pow(10, 2); return Math.Round(amount * (decimal)factor, 0).ToString().PadLeft(12, '0'); }
47
public static string ExecXmlAction(string baseUrl, string requestBody, string xmlAction) { var url = $"{baseUrl}/PGServiceXML/{xmlAction}"; string ResponseRaw = PostXmlRequest(url, requestBody); return ResponseRaw; } /// <summary> /// Post the XML request to the Server /// </summary> /// <param name="baseUrl"></param> /// <param name="requestBody"></param> /// <returns></returns> public static string PostXmlRequest(string url, string requestBody) { var postData = Encoding.UTF8.GetBytes(requestBody); var request = WebRequest.Create(url) as HttpWebRequest; if (request == null) { throw new Exception("HttpWebRequest initialization failed"); } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postData.Length; using (var requestStream = request.GetRequestStream()) { requestStream.Write(postData, 0, postData.Length); using (var responseStream = request.GetResponse().GetResponseStream()) using (var reader = new StreamReader(responseStream)) { return reader.ReadToEnd(); } } }
48
/// <summary> /// Serializes an Object to XML /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ToXML(object obj) { var stringwriter = new StringWriter(); var serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(stringwriter, obj); var rslt = stringwriter.ToString(); //Add default namespace to the Request rslt = rslt.Replace(@"Request xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">", @"Request xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.firstatlanticcommerce.com/gateway/data"">"); //Make sure the encoding is utf-8 return rslt.Replace(@"encoding=""utf-16""?", @"encoding=""utf-8""?"); }
/// <summary> /// Deserializes a string into an object of the specified Type /// </summary> /// <param name="myType"></param> /// <param name="xmlText"></param> /// <returns></returns> public static object LoadFromXMLString(Type myType, string xmlText) { var xmlBody = @"<?xml version=""1.0"" encoding=""utf-8""?>" + "\n" + xmlText; //Remove default namespace otherwise Deserialization fails xmlBody = xmlBody.Replace(@"Response xmlns=""http://schemas.firstatlanticcommerce.com/gateway/data"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">", @"Response xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">"); var stringReader = new System.IO.StringReader(xmlBody); var serializer = new XmlSerializer(myType); return serializer.Deserialize(stringReader); }
49
Tokenizacion con 3D-Secure
[TestMethod] public void TestAuthorize3DS_WithAuthOnly_ShouldSucceed() { //Arrange var client = new ServicesClient(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //First send the Tokenization var tokClient = new TokenizationClient(); var crdDtls = GetVisaTestCard1Details(); var tokRequest = CreateTokenizationRequest(MERCH_ID, MERCH_PWD, crdDtls.CardNumber, crdDtls.CardExpiryDate); var tokResponse = tokClient.Tokenize(tokRequest); Assert.IsNotNull(tokResponse); Assert.IsTrue(tokResponse.Success); Assert.IsNotNull(tokResponse.Token); //Assign the card Token obtained during Tokenization var crdDetails = new CardDetails { CardNumber = tokResponse.Token, CardExpiryDate = crdDtls.CardExpiryDate, CardCVV2 = crdDtls.CardCVV2 }; var authRequest = CreateAuthorize3DSRequest(MERCH_ID, MERCH_PWD, crdDetails); //Act //Call the Authorize3Ds method var authResponse = client.Authorize3DS(authRequest); //Assert Assert.IsNotNull(authResponse); Assert.IsTrue(authResponse.ResponseCode == "0" && authResponse.ResponseCodeDescription == "Success"); Assert.IsFalse(string.IsNullOrEmpty(authResponse.HTMLFormData)); Assert.IsTrue(authResponse.HTMLFormData.StartsWith("<HTML><BODY><FORM ID=")); Assert.IsTrue(authResponse.HTMLFormData.Contains("Please click on the Submit button to continue processing")); }
public static FACPG2Svc.CardDetails GetVisaTestCard1Details() { return new FACPG2Svc.CardDetails { CardNumber = "4111111111111111", CardExpiryDate = "1220", CardCVV2 = "234" }; }
50
public static FACPG2Tok.TokenizeRequest CreateTokenizationRequest(string merchId, string
merchPwd, string cardNumber, string expiryDate)
{ return new FACPG2Tok.TokenizeRequest { CardNumber = cardNumber, ExpiryDate = expiryDate, MerchantNumber = merchId, Signature = GenerateTokenSignature(merchId, merchPwd) }; }
private static string GenerateTokenSignature(string merchId, string merchPwd) { var source = string.Format("{0}{1}{2}", merchPwd, merchId, "464748"); return GenerateSignature(source); } public static string GenerateSignature(string source) { var provider = new SHA1CryptoServiceProvider(); var bytearray = Encoding.UTF8.GetBytes(source); var buffer = provider.ComputeHash(bytearray); var hashValue = Convert.ToBase64String(buffer); return hashValue; }
public static FACPG2Svc.Authorize3DSRequest CreateAuthorize3DSRequest(string merchId, string merchPwd, FACPG2Svc.CardDetails crdDetails) { var resp = CreateAuthorize3DSRequest(merchId, merchPwd); resp.CardDetails = crdDetails; return resp; }
51
public static FACPG2Svc.Authorize3DSRequest CreateAuthorize3DSRequest(string merchId, string merchPwd) { var request = new FACPG2Svc.Authorize3DSRequest { CardDetails = GetVisaTestCard1Details(), TransactionDetails = GetTransactionDetails(merchId, merchPwd, (int)TransactionCodes.None), ShippingDetails = GetShippingDetails(), BillingDetails = GetBillingDetails(), RecurringDetails = GetRecurringDetails(), FraudDetails = GetFraudDetails(), MerchantResponseURL = "https://ecm.firstatlanticcommerce.com/FACPGTest/receiveInfo.aspx" }; return request; }
Ejemplos de Mensajes
Authorize3DS (SOAP) flujo normal
Authorize3DS SOAP Request devuelve un formulario HTML que comienza el proceso de autenticacion 3DS.
Authorize3DS SOAP Response (con el HTMLFormData que sera auto-posted cuando sea desplegado en el browser)
Request Response POST https://ecm.firstatlanticcommerce.com/PGService/Services.svc
HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction:
"http://schemas.firstatlanticcommerce.com/gateway/IServices/Authorize3DS"
Host: ecm.firstatlanticcommerce.com
Content-Length: 2384
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Authorize3DS
xmlns="http://schemas.firstatlanticcommerce.com/gateway">
<Request
xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/data"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:BillingDetails>
<a:BillToAddress>1200 Whitewall Blvd.</a:BillToAddress>
<a:BillToAddress2>Unit 15</a:BillToAddress2>
<a:BillToCity>Boston</a:BillToCity>
<a:BillToCountry>840</a:BillToCountry>
<a:BillToEmail>[email protected]</a:BillToEmail>
<a:BillToFirstName>John</a:BillToFirstName>
<a:BillToLastName>Smith</a:BillToLastName>
<a:BillToState>NY</a:BillToState>
<a:BillToTelephone>211-3454-6790</a:BillToTelephone>
<a:BillToZipPostCode>200341</a:BillToZipPostCode>
<a:BillToCounty i:nil="true"/>
<a:BillToMobile i:nil="true"/>
</a:BillingDetails>
<a:CardDetails>
<a:CardCVV2>234</a:CardCVV2>
<HTML><BODY><FORM ID="frmHtmlCheckout" NAME="frmHtmlCheckout" METHOD="POST"
ACTION="https://ecm.firstatlanticcommerce.com/SENTRY/PaymentGateway/
Application/DirectAuthLink.aspx">
<NOSCRIPT>
<BR><BR>
<H1 ALIGN="center">Processing your Transaction</H1>
<H2 ALIGN="center">JavaScript is currently disabled or is
not supported by your browser.</H2><BR>
<H3 ALIGN="center">Please click on the Submit button to continue
processing.</H3>
<INPUT TYPE="submit" value="Submit" ID="submit" NAME="submit">
</NOSCRIPT>
<INPUT TYPE="hidden" NAME="Version" ID="Version" VALUE="1.0.0">
<INPUT TYPE="hidden" NAME="AcqID" ID="AcqID" VALUE="464748">
<INPUT TYPE="hidden" NAME="MerID" ID="MerID" VALUE="#### MERCHANT ID HERE
####">
<INPUT TYPE="hidden" NAME="PurchaseAmt" ID="PurchaseAmt"
VALUE="000000000100">
<INPUT TYPE="hidden" NAME="PurchaseCurrency" ID="PurchaseCurrency"
VALUE="840">
<INPUT TYPE="hidden" NAME="PurchaseCurrencyExponent"
ID="PurchaseCurrencyExponent" VALUE="2">
<INPUT TYPE="hidden" NAME="OrderID" ID="OrderID"
VALUE="Test|834c6ba3448f6861">
<INPUT TYPE="hidden" NAME="CardNo" ID="CardNo" VALUE="###### CARD HERE
######">
<INPUT TYPE="hidden" NAME="CardExpDate" ID="CardExpDate" VALUE="0122">
<INPUT TYPE="hidden" NAME="CardCVV2" ID="CardCVV2" VALUE="#####CVV
HERE#####">
<INPUT TYPE="hidden" NAME="SignatureMethod" ID="SignatureMethod"
VALUE="SHA1">
<INPUT TYPE="hidden" NAME="Signature" ID="Signature"
VALUE="LBqvpeOyyhe/ab3635N47YBUnRY=">
<INPUT TYPE="hidden" NAME="CaptureFlag" ID="CaptureFlag" VALUE="M">
53
<a:CardExpiryDate>01/22</a:CardExpiryDate>
<a:CardNumber>CARD_HERE</a:CardNumber>
<a:IssueNumber i:nil="true"/>
<a:StartDate i:nil="true"/>
<a:DocumentNumber i:nil="true"/>
<a:Installments>0</a:Installments>
</a:CardDetails>
<a:MerchantResponseURL>https://Merchant.com/MerchantResponseURL
</a:MerchantResponseURL>
<a:TransactionDetails>
<a:AcquirerId>464748</a:AcquirerId>
<a:Amount>000000000100</a:Amount>
<a:Currency>840</a:Currency>
<a:CurrencyExponent>2</a:CurrencyExponent>
<a:CustomData i:nil="true"/>
<a:IPAddress i:nil="true"/>
<a:MerchantId>YOUR_MERCHANT</a:MerchantId>
<a:OrderNumber>Test|bc7396483095e39a</a:OrderNumber>
<a:Signature>t0mM0zJ1VBejLh7X94RUuO+L3ro=</a:Signature>
<a:SignatureMethod>SHA1</a:SignatureMethod>
<a:TransactionCode>64</a:TransactionCode>
<a:CustomerReference>This is a test for merchant:
88800033</a:CustomerReference>
</a:TransactionDetails>
<a:RecurringDetails i:nil="true"/>
<a:FraudDetails i:nil="true</Request>
</Authorize3DS>
</s:Body>
</s:Envelope>
<INPUT TYPE="hidden" NAME="MerRespURL" ID="MerRespURL"
VALUE="https://myserver.com">
<INPUT TYPE="hidden" NAME="CustomData" ID="CustomData" VALUE="">
<INPUT TYPE="hidden" NAME="InterfaceCode" ID="InterfaceCode"
VALUE="FACPG2.WCF">
<INPUT TYPE="hidden" NAME="BillToAddress1" ID="BillToAddress1" VALUE="1200
Whitewall Blvd.">
<INPUT TYPE="hidden" NAME="BillToAddress2" ID="BillToAddress2" VALUE="Unit
15">
<INPUT TYPE="hidden" NAME="BillToPostCode" ID="BillToPostCode"
VALUE="200341">
<INPUT TYPE="hidden" NAME="BillToFirstName" ID="BillToFirstName"
VALUE="John">
<INPUT TYPE="hidden" NAME="BillToLastName" ID="BillToLastName"
VALUE="Smith">
<INPUT TYPE="hidden" NAME="BillToCity" ID="BillToCity" VALUE="Boston">
<INPUT TYPE="hidden" NAME="BillToState" ID="BillToState" VALUE="NY">
<INPUT TYPE="hidden" NAME="BillToCountry" ID="BillToCountry" VALUE="840">
<INPUT TYPE="hidden" NAME="BillToEmail" ID="BillToEmail"
VALUE="[email protected]">
<INPUT TYPE="hidden" NAME="BillToTelephone" ID="BillToTelephone"
VALUE="211-3454-6790">
<INPUT TYPE="hidden" NAME="AuthenticationOnly" ID="AuthenticationOnly"
VALUE="Y">
</FORM>
<SCRIPT LANGUAGE="JavaScript">
Checkout();
function Checkout() {
document.frmHtmlCheckout.action =
"https://ecm.firstatlanticcommerce.com/SENTRY/PaymentGateway/Application/
DirectAuthLink.aspx";
document.frmHtmlCheckout.submit();
}
</SCRIPT>
</BODY></HTML>
54
HTTP request del HTMLFormData obtenido en la respuesta SOAP de Authorize3DS
HTTP response del resultado (en este caso exitoso) del proceso Authorize3DS process dentro de un HTML form que sera auto-
posteado al MerchantResponseURL
Request Response POST https://ecm.firstatlanticcommerce.com/SENTRY/PaymentGateway/ Application/DirectAuthLink.aspx HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: ecm.firstatlanticcommerce.com Content-Length: 935 Expect: 100-continue frmHtmlCheckout=frmHtmlCheckout&Version=2.0.0&AcqID=464748&MerID= MERCHANT_ID_HERE&PurchaseAmt=000000000100& PurchaseCurrency=840&PurchaseCurrencyExponent=2& OrderID=Test%7cbc7396483095e39a& CardNo=CARD_NUMBER&CardExpDate=01%2f22&CardCVV2=234& SignatureMethod=SHA1&Signature=t0mM0zJ1VBejLh7X94RUuO%2bL3ro%3d&CaptureFlag=M&MerRespURL=https%3a%2f%2fecm.firstatlanticcommerce.com%2fFACPGTest%2freceiveInfo.aspx& CustomData=&InterfaceCode=FACPG2.WCF& BillToAddress1=1200+Whitewall+Blvd.&BillToAddress2=Unit+15& BillToPostCode=200341&BillToFirstName=John&BillToLastName=Smith&BillToCity=Boston&BillToState=NY&BillToCountry=840& BillToEmail=john.smith%40gmail.com&BillToTelephone=211-3454-6790&AuthenticationOnly=Y
HTTP/1.1 200 OK Cache-Control: no-cache,no-store, no-cache, must-revalidate Pragma: no-cache,no-cache Content-Length: 3388 Content-Type: text/html; charset=utf-8 Expires: -1 Server: X-AspNet-Version: 4.0.30319 Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Mon, 21 Oct 2019 18:17:34 GMT Connection: close <HTML> <HEAD> <title>Request Result</title> </HEAD> <Body> <form id="SENTRYResponse" name="SENTRYResponse" action="https://api.pjdevelopmentpanama.woloxtest.com/v1/orders/1030/payments/credomatci/confirm" method="POST"> <noscript> <br> <br> <h1 align='center'> Processing your 3-D Secure Transaction</h1> <h2 align='center'>JavaScript is currently disabled or is not supported by your browser.</h2> <br> <h3 align='center'>Please click on the Submit button to <font color='blue'>complete</font> the processing of your 3-D secure transaction.</h3> <h4 align='center'><input type='submit' value='Submit'></h4> </noscript> <input type="hidden" name="MerID" id="MerID" value="88801117"/>
55
<input type="hidden" name="AcqID" id="AcqID" value="464748"/> <input type="hidden" name="OrderID" id="OrderID" value="Test|834c6ba3448f6861"/> <input type="hidden" name="ResponseCode" id="ResponseCode" value="1"/> <input type="hidden" name="ReasonCode" id="ReasonCode" value="31"/> <input type="hidden" name="ReasonCodeDesc" id="ReasonCodeDesc" value="Authentication successful."/> <input type="hidden" name="AuthenticationResult" id="AuthenticationResult" value="Y"/> <input type="hidden" name="CAVVValue" id="CAVVValue" value="AAACAxkZhBeJEzc2ORmEEMes7/I="/> <input type="hidden" name="ECIIndicator" id="ECIIndicator" value="05"/> <input type="hidden" name="TransactionStain" id="TransactionStain" value="AgABCQEAAgEBBQEHAwEABAYjVPM="/> <input type="hidden" name="BillToFirstName" id="BillToFirstName" value="John"/> <input type="hidden" name="BillToLastName" id="BillToLastName" value="Smith"/> <input type="hidden" name="BillToAddress1" id="BillToAddress1" value="1200 Whitewall Blvd."/> <input type="hidden" name="BillToAddress2" id="BillToAddress2" value="Unit 15"/> <input type="hidden" name="BillToCity" id="BillToCity" value="Boston"/>
Redirecciones
• Después de enviar el mensaje HTTP anterior, se produce una serie de redireccionamientos y finalmente se le presenta al usuario el
Formulario de autenticación 3DS del Banco
• El estilo del formulario de autenticación 3DS del banco y el aspecto de la página no se pueden modificar.
• El usuario ingresa la contraseña de 3DS y envía el formulario HTTP al banco que luego se redirige nuevamente a FAC
• Finalmente, FAC redirige el resultado de la autenticación a MerchantResponseURL como se muestra en la página siguiente.
• El resultado más la prueba de autenticación (ECI, CAVV y TransactionStain) pueden verse resaltados en amarillo.
56
Authorize3DS (SOAP) flujo de error – Cuando se retorna un error
• Este ejemplo muestra el resultado de un error en uno de los parametros de Authorize3DSRequest, concretamente en el formato de
fecha.
• El error se devuelve como un formulario HTML al MerchantResponseURL que le proporcionó el comerciante.
• Asegúrese de especificar el MerchantResponseURL correcto en el sitio del comerciante
• Al probar 3D Secure en el entorno de pruebas, la pantalla de autenticación de bancos no se presentará al cliente.
Authorize3DS SOAP Request
Authorize3DS SOAP Request devuelve un formulario HTML que comienza el proceso de autenticacion 3DS.
Authorize3DS SOAP Response (con el HTMLFormData que sera auto-posted cuando se procese en el navegador)
Request Response POST https://ecm.firstatlanticcommerce.com/PGService/Services.svc HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://schemas.firstatlanticcommerce.com/gateway/ IServices/Authorize3DS" Host: ecm.firstatlanticcommerce.com Content-Length: 2384 Expect: 100-continue Accept-Encoding: gzip, deflate Connection: Keep-Alive <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <Authorize3DS xmlns="http://schemas.firstatlanticcommerce.com/gateway"> <Request xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:CardDetails> <a:CardCVV2>234</a:CardCVV2>
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Server: Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Wed, 23 Oct 2019 18:24:22 GMT Content-Length: 4808 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body><Authorize3DSResponse xmlns="http://schemas.firstatlanticcommerce.com/gateway"> <Authorize3DSResult xmlns:a="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:HTMLFormData><HTML><BODY><FORM ID="frmHtmlCheckout" NAME="frmHtmlCheckout" METHOD="POST" ACTION="https://ecm.firstatlanticcommerce.com/SENTRY/ PaymentGateway/Application/DirectAuthLink.aspx">
 <NOSCRIPT>
 <BR><BR>
57
<a:CardExpiryDate>01/22</a:CardExpiryDate> <a:CardNumber>CARD_HERE</a:CardNumber> <a:IssueNumber i:nil="true"/> <a:StartDate i:nil="true"/> <a:DocumentNumber i:nil="true"/> <a:Installments>0</a:Installments> </a:CardDetails> <a:MerchantResponseURL>https://Merchant.com/ </a:MerchantResponseURL> <a:TransactionDetails> <a:AcquirerId>464748</a:AcquirerId> <a:Amount>000000000100</a:Amount> <a:Currency>840</a:Currency> <a:CurrencyExponent>2</a:CurrencyExponent> <a:CustomData i:nil="true"/> <a:IPAddress i:nil="true"/> <a:MerchantId>YOUR_MERCHANT</a:MerchantId> <a:OrderNumber>Test|bc7396483095e39a</a:OrderNumber> <a:Signature>t0mM0zJ1VBejLh7X94RUuO+L3ro=</a:Signature> <a:SignatureMethod>SHA1</a:SignatureMethod> <a:TransactionCode>64</a:TransactionCode> <a:CustomerReference>This is a test </a:CustomerReference> </a:TransactionDetails> <a:RecurringDetails i:nil="true"/> <a:FraudDetails i:nil="true"/> </Request> </Authorize3DS> </s:Body> </s:Envelope>
<H1 ALIGN="center">Processing your Transaction</H1>
 <H2 ALIGN="center">JavaScript is currently disabled or is not supported by your browser.</H2><BR>
 <H3 ALIGN="center">Please click on the Submit button to continue processing.</H3>
 <INPUT TYPE="submit" value="Submit" ID="submit" NAME="submit">
 </NOSCRIPT>
 <INPUT TYPE="hidden" NAME="Version" ID="Version" VALUE="2.0.0">
 <INPUT TYPE="hidden" NAME="AcqID" ID="AcqID" VALUE="464748"> 
 <INPUT TYPE="hidden" NAME="MerID" ID="MerID" VALUE="MERCHANT_HERE">
 <INPUT TYPE="hidden" NAME="PurchaseAmt" ID="PurchaseAmt" VALUE="000000000100">
 <INPUT TYPE="hidden" NAME="PurchaseCurrency" ID="PurchaseCurrency" VALUE="840">
 <INPUT TYPE="hidden" NAME="PurchaseCurrencyExponent" ID="PurchaseCurrencyExponent" VALUE="2">
 <INPUT TYPE="hidden" NAME="OrderID" ID="OrderID" VALUE="Test|bc7396483095e39a">
 <INPUT TYPE="hidden" NAME="CardNo" ID="CardNo" VALUE="CARD_HERE">
 <INPUT TYPE="hidden" NAME="CardExpDate" ID="CardExpDate" VALUE="01/22">
 <INPUT TYPE="hidden" NAME="CardCVV2" ID="CardCVV2" VALUE="234">
 <INPUT TYPE="hidden" NAME="SignatureMethod" ID="SignatureMethod" VALUE="SHA1">
 <INPUT TYPE="hidden" NAME="Signature" ID="Signature" VALUE="t0mM0zJ1VBejLh7X94RUuO+L3ro=">
 <INPUT TYPE="hidden" NAME="CaptureFlag" ID="CaptureFlag" VALUE="M">
 <INPUT TYPE="hidden" NAME="MerRespURL" ID="MerRespURL" VALUE="https://ecm.firstatlanticcommerce.com/FACPGTest/receiveInfo.aspx"> 
 <INPUT TYPE="hidden" NAME="CustomData" ID="CustomData" VALUE=""> 
 <INPUT TYPE="hidden" NAME="InterfaceCode" ID="InterfaceCode" VALUE="FACPG2.WCF">
 <INPUT TYPE="hidden" NAME="BillToAddress1" ID="BillToAddress1" VALUE="1200 Whitewall Blvd.">
 <INPUT TYPE="hidden" NAME="BillToAddress2" ID="BillToAddress2" VALUE="Unit 15">
 <INPUT TYPE="hidden" NAME="BillToPostCode" ID="BillToPostCode" VALUE="200341">
 <INPUT TYPE="hidden" NAME="BillToFirstName" ID="BillToFirstName" VALUE="John">
 <INPUT TYPE="hidden" NAME="BillToLastName" ID="BillToLastName" VALUE="Smith">
 <INPUT TYPE="hidden" NAME="BillToCity" ID="BillToCity" VALUE="Boston">
58
<INPUT TYPE="hidden" NAME="BillToState" ID="BillToState" VALUE="NY">
 <INPUT TYPE="hidden" NAME="BillToCountry" ID="BillToCountry" VALUE="840">
 <INPUT TYPE="hidden" NAME="BillToEmail" ID="BillToEmail" VALUE="[email protected]">
 <INPUT TYPE="hidden" NAME="BillToTelephone" ID="BillToTelephone" VALUE="211-3454-6790">
 <INPUT TYPE="hidden" NAME="ShipToAddress1" ID="ShipToAddress1" VALUE="1200 Whitewall Blvd.">
 <INPUT TYPE="hidden" NAME="ShipToAddress2" ID="ShipToAddress2" VALUE="Unit 15">
 <INPUT TYPE="hidden" NAME="ShipToPostCode" ID="ShipToPostCode" VALUE="200341">
 <INPUT TYPE="hidden" NAME="ShipToFirstName" ID="ShipToFirstName" VALUE="John">
 <INPUT TYPE="hidden" NAME="ShipToLastName" ID="ShipToLastName" VALUE="Smith">
 <INPUT TYPE="hidden" NAME="ShipToCity" ID="ShipToCity" VALUE="Boston">
 <INPUT TYPE="hidden" NAME="ShipToState" ID="ShipToState" VALUE="NY">
 <INPUT TYPE="hidden" NAME="ShipToCountry" ID="ShipToCountry" VALUE="840">
 <INPUT TYPE="hidden" NAME="ShipToEmail" ID="ShipToEmail" VALUE="[email protected]">
 <INPUT TYPE="hidden" NAME="ShipToTelephone" ID="ShipToTelephone" VALUE="211-3454-6790">
 <INPUT TYPE="hidden" NAME="AuthenticationOnly" ID="AuthenticationOnly" VALUE="Y">
 </FORM>
 <SCRIPT LANGUAGE="JavaScript">
 Checkout();
 function Checkout() {
 document.frmHtmlCheckout.action = "https://ecm.firstatlanticcommerce.com/SENTRY/PaymentGateway/ Application/DirectAuthLink.aspx";
 document.frmHtmlCheckout.submit();
 }
 </SCRIPT>
 </BODY></HTML>
 </a:HTMLFormData><a:ResponseCode>0</a:ResponseCode> <a:ResponseCodeDescription>Success</a:ResponseCodeDescription> <a:TokenizedPAN/></Authorize3DSResult> </Authorize3DSResponse></s:Body></s:Envelope>
59
HTTP request - Posting del HTMLFormData que fue obtenido en el Authorize3DS SOAP response
HTTP response del resultado (en este caso error) del proceso de Authorize3DS dentro de un form HTML que sera auto-posted a la
MerchantResponseURL
Request Response POST https://ecm.firstatlanticcommerce.com/SENTRY/ PaymentGateway/Application/DirectAuthLink.aspx HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: ecm.firstatlanticcommerce.com Content-Length: 935 Expect: 100-continue frmHtmlCheckout=frmHtmlCheckout&Version=2.0.0& AcqID=464748&MerID=MERCHANT_HERE& PurchaseAmt=000000000100& PurchaseCurrency=840&PurchaseCurrencyExponent=2& OrderID=Test%7cbc7396483095e39a&CardNo=CARD_HERE& CardExpDate=01%2f22&CardCVV2=234&SignatureMethod=SHA1& Signature=t0mM0zJ1VBejLh7X94RUuO%2bL3ro%3d&CaptureFlag=M& MerRespURL=https%3a%2f%2fecm.firstatlanticcommerce.com %2fFACPGTest%2freceiveInfo.aspx& CustomData=&InterfaceCode=FACPG2.WCF& BillToAddress1=1200+Whitewall+Blvd.&BillToAddress2=Unit+15& BillToPostCode=200341&BillToFirstName=John& BillToLastName=Smith&BillToCity=Boston&BillToState=NY& BillToCountry=840&BillToEmail=john.smith%40gmail.com& BillToTelephone=211-3454-6790& ShipToAddress1=1200+Whitewall+Blvd.& ShipToAddress2=Unit+15&ShipToPostCode=200341& ShipToFirstName=John& ShipToLastName=Smith&ShipToCity=Boston&ShipToState=NY& ShipToCountry=840&ShipToEmail=john.smith%40gmail.com& ShipToTelephone=211-3454-6790&AuthenticationOnly=Y
HTTP/1.1 200 OK Cache-Control: private,no-store, no-cache, must-revalidate Pragma: no-cache Content-Length: 1071 Content-Type: text/html; charset=utf-8 Server: Set-Cookie: ASP.NET_SessionId=hogulzw3lbk1nakzytfcztzs; path=/; HttpOnly X-AspNet-Version: 4.0.30319 Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Wed, 23 Oct 2019 18:24:22 GMT Connection: close <HTML> <HEAD> <title>Request Result</title> </HEAD> <Body> <form id="SENTRYResponse" name="SENTRYResponse" action="https://Merchant.com/MerchantResponseURL" method="POST"> <noscript> <br> <br> <h1 align='center'> Processing your 3-D Secure Transaction</h1> <h2 align='center'>JavaScript is currently disabled or is not supported by your browser.</h2> <br> <h3 align='center'>Please click on the Submit button to <font color='blue'>complete</font> the processing of your 3-D secure transaction.</h3> <h4 align='center'><input type='submit' value='Submit'></h4> </noscript>
60
<input type="hidden" name="OrderID" id="OrderID" value="Test|bc7396483095e39a"/> <input type="hidden" name="ResponseCode" id="ResponseCode" value="3"/> <input type="hidden" name="ReasonCode" id="ReasonCode" value="8"/> <input type="hidden" name="ReasonCodeDesc" id="ReasonCodeDesc" value="CardExpDate format is invalid"/> <script type="text/javascript" language='javascript'>document.getElementById('SENTRYResponse').submit();</script> </Body> </HTML>
Authorize3DS XML flujo normal
Request Response POST https://ecm.firstatlanticcommerce.com/PGServiceXML/Authorize3DS HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: ecm.firstatlanticcommerce.com Content-Length: 2023 Expect: 100-continue Connection: Keep-Alive
<?xml version="1.0" encoding="utf-8"?> <Authorize3DSRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.firstatlanticcommerce.com/gateway/data"> <CardDetails> <CardCVV2>234</CardCVV2> <CardExpiryDate>1220</CardExpiryDate> <CardNumber>4111111111111111</CardNumber> <Installments>0</Installments> </CardDetails> <MerchantResponseURL>https://ecm.firstatlanticcommerce.com/FACPGTest/receiveInfo.aspx</MerchantResponseURL> <TransactionDetails> <AcquirerId>464748</AcquirerId> <Amount>000000000100</Amount> <Currency>840</Currency> <CurrencyExponent>2</CurrencyExponent> <MerchantId>YOUR MERCHANT HERE</MerchantId> <OrderNumber>Test|a7c6231589fc249b</OrderNumber> <Signature>Q2iroCFWQ54l6Q8XPthaRkEfpSE=</Signature> <SignatureMethod>SHA1</SignatureMethod> <TransactionCode>0</TransactionCode> <CustomerReference>This is a test</CustomerReference> </TransactionDetails> </Authorize3DSRequest>
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html Server: X-AspNet-Version: 4.0.30319 Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline' Strict-Transport-Security: max-age=31536000; includeSubdomains=true X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Referrer-Policy: no-referrer-when-downgrade Date: Tue, 10 Dec 2019 17:27:29 GMT Content-Length: 4506 <Authorize3DSResponse xmlns="http://schemas.firstatlanticcommerce.com/gateway/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HTMLFormData><HTML><BODY><FORM ID="frmHtmlCheckout" NAME="frmHtmlCheckout" METHOD="POST" ACTION="https://ecm.firstatlanticcommerce.com/SENTRY/PaymentGateway/Application/DirectAuthLink.aspx">
 <NOSCRIPT>
 <BR><BR>
 <H1 ALIGN="center">Processing your Transaction</H1>
 <H2 ALIGN="center">JavaScript is currently disabled or is not supported by your browser.</H2><BR>
 <H3 ALIGN="center">Please click on the Submit button to continue processing.</H3>
 <INPUT TYPE="submit" value="Submit" ID="submit" NAME="submit">
 </NOSCRIPT>
 <INPUT TYPE="hidden" NAME="Version" ID="Version" VALUE="2.0.0">
 <INPUT TYPE="hidden" NAME="AcqID" ID="AcqID" VALUE="464748"> 
 <INPUT TYPE="hidden" NAME="MerID" ID="MerID" VALUE="88800033">
 <INPUT TYPE="hidden" NAME="PurchaseAmt" ID="PurchaseAmt" VALUE="000000000100">
 <INPUT TYPE="hidden" NAME="PurchaseCurrency" ID="PurchaseCurrency" VALUE="840">
 <INPUT TYPE="hidden" NAME="PurchaseCurrencyExponent" ID="PurchaseCurrencyExponent" VALUE="2">
 <INPUT TYPE="hidden" NAME="OrderID" ID="OrderID" VALUE="Test|a7c6231589fc249b">
 <INPUT TYPE="hidden" NAME="CardNo" ID="CardNo" VALUE="4111111111111111">
 <INPUT TYPE="hidden" NAME="CardExpDate" ID="CardExpDate" VALUE="1220">
62
<INPUT TYPE="hidden" NAME="CardCVV2" ID="CardCVV2" VALUE="234">
 <INPUT TYPE="hidden" NAME="SignatureMethod" ID="SignatureMethod" VALUE="SHA1">
 <INPUT TYPE="hidden" NAME="Signature" ID="Signature" VALUE="Q2iroCFWQ54l6Q8XPthaRkEfpSE=">
 <INPUT TYPE="hidden" NAME="CaptureFlag" ID="CaptureFlag" VALUE="M">
 <INPUT TYPE="hidden" NAME="MerRespURL" ID="MerRespURL" VALUE="https://ecm.firstatlanticcommerce.com/FACPGTest/receiveInfo.aspx"> 
 <INPUT TYPE="hidden" NAME="CustomData" ID="CustomData" VALUE=""> 
 <INPUT TYPE="hidden" NAME="InterfaceCode" ID="InterfaceCode" VALUE="FACPG2.XML">
 < <SCRIPT LANGUAGE="JavaScript">
 Checkout();
 function Checkout() {
 document.frmHtmlCheckout.action = "https://ecm.firstatlanticcommerce.com/SENTRY/PaymentGateway/Application/DirectAuthLink.aspx";
 document.frmHtmlCheckout.submit();
 }
 </SCRIPT>
 </BODY></HTML>
 </HTMLFormData><ResponseCode>0</ResponseCode><ResponseCodeDescription>Success</ResponseCodeDescription><TokenizedPAN/></Authorize3DSResponse>