Integración Proxy - Expedia
Introducción
El servicio Proxy de PAYCOMET con Expedia permite tokenizar las tarjetas enviadas en las reservas hoteleras y verificar que los datos de tarjeta enviados son correctos. Para poder acceder a este tipo de integración, se deberá contar previamente con la integración de la API de Expedia (https://developers.expediagroup.com/supply/lodging) para servers PCI), en la que se envían los datos de la reserva ya que la respuesta incluirá todos los datos de la reserva seleccionada y se añadirán y/o transformarán los relativos a la tarjeta.
Tipos de reservas
Los tipos de reservas que se tratan en esta integración son aquellas que pueden recuperarse mediante identificador de hotel (hotel_id), estado de la reserva (status) y días solicitados (nb_days_in_past).
Ejemplo de información contenida en una reserva:
<BookingRetrievalRS xmlns="http://www.expediaconnect.com/EQC/BR/2014/01"> <Bookings> <Booking id="619" type="Book" createDateTime="2013-12-12T00:01:00Z" source="A-Hotels.com" status="pending"> <Hotel id="123456"/> <RoomStay roomTypeID="200263232" ratePlanID="201547528A"> <StayDate arrival="2014-01-01" departure="2014-01-02"/> <GuestCount adult="2"/> <PerDayRates currency="USD"> <PerDayRate stayDate="2014-01-01" baseRate="109.99" promoName="ASAP DEAL 50pct"/> </PerDayRates> <Total amountAfterTaxes="124.29" amountOfTaxes="14.30" currency="USD"/> <PaymentCard cardCode="VI" cardNumber="4242424242424242" expireDate="1218" seriesCode="123"> <CardHolder name="John Smith" address="500 Park Avenue" city="New York" stateProv="NY" country="US" postalCode="10022"/> </PaymentCard> </RoomStay> <PrimaryGuest> <Name givenName="John" surname="Smith"/> <Phone countryCode="1" cityAreaCode="425" number="5555555"/> </PrimaryGuest> <SpecialRequest code="1.14">One King Bed</SpecialRequest> <SpecialRequest code="2.1">Non-Smoking</SpecialRequest> <SpecialRequest code="3">Multi-room booking. Primary traveler:Smith, John. 1 of 2 rooms.</SpecialRequest> <SpecialRequest code="4">Adjoining rooms please</SpecialRequest> <SpecialRequest code="5">Hotel Collect Booking Collect Payment From Guest</SpecialRequest> </Booking> <Booking id="301" type="Book" createDateTime="2013-12-12T12:03:00Z" source="Expedia" status="pending"> <Hotel id="654321"/> <RoomStay roomTypeID="200225905" ratePlanID="201297424"> <StayDate arrival="2014-01-26" departure="2014-02-02"/> <GuestCount adult="2"/> <PerDayRates currency="ZAR"> <PerDayRate stayDate="2014-01-26" baseRate="756.58"/> <PerDayRate stayDate="2014-01-27" baseRate="756.58"/> <PerDayRate stayDate="2014-01-28" baseRate="756.58"/> <PerDayRate stayDate="2014-01-29" baseRate="756.58"/> <PerDayRate stayDate="2014-01-30" baseRate="756.58"/> <PerDayRate stayDate="2014-01-31" baseRate="756.58"/> <PerDayRate stayDate="2014-02-01" baseRate="1085.53"/> </PerDayRates> <Total amountAfterTaxes="6412.50" amountOfTaxes="787.49" currency="ZAR"/> <PaymentCard cardCode="MC" cardNumber="***1234" expireDate="1116"> <CardHolder name="Expedia VirtualCard" address="333 108th Avenue NE" city="Bellevue" stateProv="WA" country="US" postalCode="98004"/> </PaymentCard> </RoomStay> <PrimaryGuest> <Name givenName="Jeff" surname="Pirelli"/> <Phone countryCode="44" cityAreaCode="071" number="0123876"/> </PrimaryGuest> <SpecialRequest code="2.1">Non-Smoking</SpecialRequest> <SpecialRequest code="1.13">One Double Bed</SpecialRequest> <SpecialRequest code="5">Bill only nghts bkd by Expedia to cc# @ ck-in gst pays incid</SpecialRequest> <SpecialRequest code="4">NON SMOKING ROOM A ROOM IN THE MOST QUIET AREA PLEASE</SpecialRequest> </Booking> </Bookings> </BookingRetrievalRS>
Tokenización de la información de tarjeta de una reserva
En la respuesta devuelta, la tarjeta aparecerá enmascarada, 456789******1234. Le fecha de caducidad se devolverá tal y como aparece en la reserva y el código CVC2 se eliminará y no llegará. Por lo tanto, la reserva anterior, una vez tokenizada la información de la tarjeta y sin errores en la preautorización ni en la cancelación de preautorización, el nodo <RoomStay> quedará de la siguiente manera:
<RoomStay roomTypeID="200263232" ratePlanID="201547528A"> <StayDate arrival="2014-01-01" departure="2014-01-02"/> <GuestCount adult="2"/> <PerDayRates currency="USD"> <PerDayRate stayDate="2014-01-01" baseRate="109.99" promoName="ASAP DEAL 50pct"/> </PerDayRates> <Total amountAfterTaxes="124.29" amountOfTaxes="14.30" currency="USD"/> <PaymentCard cardCode="VI" cardNumber="4242424242424242" expireDate="1218" seriesCode="123"> <CardHolder name="John Smith" address="500 Park Avenue" city="New York" stateProv="NY" country="US" postalCode="10022"/> </PaymentCard> <iduser>999999999</iduser> <tokenuser>XXXXXXXXXXXXXXX</tokenuser> </RoomStay>
En caso de error en la preautoriación/cancelación también elemento ds_error_id
<RoomStay> … <ds_error_id>999999999</ds_error_id> … </RoomStay>
Se informará también dentro del nodo RoomStay, en el caso de que existan datos de tarjeta, de si la tarjeta pertenece a la categoría B2B. <b2b>1/0</b2b>
Endpoint y datos de la llamada
El script al que hay que realizar la petición es:
- https://eclipse.paycomet.com/api/v1/expediaEl tipo de petición que espera es un post con un parámetro 'xml' con la siguiente estructura:
<root?> <booking?> <xml?> <request?> <username?>vuestro usuario Expedia</username?> <password?>vuestra password Expedia</password?> <hotel_id?>id del Hotel</hotel_id?> <status?>estados requeridos separados por comas</status?> <nb_days_in_past?>días solicitados</nb_days_in_past?> </request?> </xml?> <url?>URL Expedia a la que se debe realizar la llamada</url?> </booking?> <paytpv?> <ds_merchant_code?>código de comercio en PAYCOMET</ds_merchant_code?> <ds_merchant_terminal?>número de terminal en PAYCOMET</ds_merchant_terminal?> </paytpv?> </root?>
Respuesta error
Si se produce un error en los datos de la petición o al acceder a Expedia, se enviará la siguiente respuesta:
<?xml version="1.0" standalone="yes"??> <reservations?> <fault code="9999-PAYTPV" string="The type of operation requested doesnt exist" /?> </reservations?>
Donde 9999 indicará el código de error observado.
Envío de API-KEYS
En el nuevo Endpoint el método de autenticación ha sido actualizado de una restricción por IP al envío una cabecera específica con el API-KEY generado para el producto/productos en cuestión.
La cabecera HTTP debe tener el siguiente nombre:
PAYCOMET-API-TOKEN
El valor de la cabecera debe ser la clave API-KEY generada a través del panel de control de cliente: “Configuración” -> “Desarrolladores” -> “API Keys”.
Una vez en el panel de gestión de API Keys debe crearse una nueva “Nueva API Key” en el botón superior derecho y asignarle un nombre.
En el siguiente panel debe copiarse la API KEY ya que solo aparecerá en una ocasión. Por motivos de seguridad, no volverá a mostrarse. Los permisos de las API KEYS pueden asignarse a uno o varios productos, e incluso a todos los de una cuenta mediante los selectores:
Para el producto que vaya a utilizarse para presentar las reservas de la OTA (Online Travel Agency) y donde quedarán tokenizadas las tarjetas será necesario asignarle permisos específicos de “Permiso de proxy”.
Una vez finalizadas las gestiones de API Keys, el valor generado a la API Key deberá enviarse en la cabecera como método de autenticación.
Entorno de desarrollo
Este desarrollo no cuenta con un sandbox en el que puedan realizarse llamadas con datos de prueba. Las llamadas al script son todas reales. Lo que debe hacerse para poder probar la integración es crear en Expedia hoteles y reservas de prueba que permitan verificar el proceso completo.