www.chakray.com Implementación del servicio de pagos con TPV y Paypal contra el ESB. Ivan Fontanals En este documento se explica con detalle el proceso de pagos usando el ESB de WSO2 como intermediador. El ejemplo acepta pagos a través de TPV de Sermepa y pagos a través de Paypal
En este documento se explica con detalle el proceso de pagos usando el ESB de WSO2 como intermediador. El ejemplo acepta pagos a través de TPV de Sermepa y pagos a través de Paypal
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
w w w . c h a k r a y . c o m
Implementación del servicio de
pagos con TPV y Paypal contra el
ESB. Ivan Fontanals En este documento se explica con detalle el proceso de pagos usando el ESB de WSO2
como intermediador. El ejemplo acepta pagos a través de TPV de Sermepa y pagos a
2. Proxy para los pagos ............................................................................................... 4
3. Validaciones ............................................................................................................. 5 Validación de la petición TPV ..................................................................................... 7 Validación de la petición Paypal ................................................................................. 8
4. Encolar una validación de pago ............................................................................... 9
5. Flujo de negocio para procesar el pago ................................................................. 10
Lo primero que se hace es invocar al message store AuditMessageStore, que cogerá
la petición original, la encolará en la cola JMS y se procesará posteriormente para
5
Por Ivan Fontanals IT Consultant
registrar en BD la traza a modo de LOG. No explicaremos este paso puesto que no es
relevante para el proceso de pagos, pero si es una buena práctica guardar todas las
peticiones recibidas por si tenemos un problema en un futuro.
Tal y como se muestra en el código XML, si la petición viene de tpv, se acaba
invocando al EndPoint TpvValidation_EP, mientras que si se trata de paypal, a
PaypalValidation. Ambos EndPoints, tal y como veremos, acaban devolviendo un
XML con el estado del pago, el ID de transacción y el importe que se ha recibido. Es
precisamente esta respuesta la que sirve para encolar la petición a la cola JMS y que
se procese posteriormente de forma automática.
3. Validaciones Las validaciones de las peticiones, se van a realizar a través de un servicio REST publicado con Apache CXF y Spring, quien recibirá la petición con todos sus parámetros (en el estricto orden en el que se reciben) y devolverá un XML con la siguiente estructura: <response> <status>SUCCESS</status> <amount>1500</amount> <txnId>EEDD3212343</txnId> </response>
La configuración de spring que se necesitará para el ejemplo, es la siguiente:
</beans> Estos servicios REST se publicarán en el AS de WSO2, requeriendo el contexto de Spring correspondiente pero que no comento en este tutorial por no ser lo relevante a comentar. En los siguientes puntos podremos ver cómo hacer la validación para cada uno de los tipos de petición existentes.
7
Por Ivan Fontanals IT Consultant
Validación de la petición TPV
La verificación de la petición TPV, consiste en validar que la firma digital enviada en la
petición es correcta, lo que nos permitirá asegurar que no se ha modificado y que
viene directamente del servidor de Sermepa.
@Path("/tpv") public class TpvPaymentValidationImpl { final protected transient Logger logger = LoggerFactory.getLogger(this.getClass()); @Path("/validate") @POST @Produces("application/xml") public String validateTpvRequest(MultivaluedMap<String, String> queryParams) throws Exception { TpvResponse response = createTpvResponse(queryParams); //Convierte los parametros al DTO PaymentStatus status = PaymentStatus.ERROR; try { Boolean verified =verifyTpvResponse(response); status = verified ? PaymentStatus.SUCCESS : PaymentStatus.ERROR; } catch (Exception e) { status = PaymentStatus.ERROR; } Float amount = response.getDs_Amount(); return "<response><status>" + status + "</status>” + “<amount>" + amount + "</amount>” + ”<txnId>" + response.getDs_Order() + "</txnId>” + ”</response>"; } public boolean verifyTpvResponse(TpvResponse response) throws Exception { String secretKey = “xxxxxxxxxxxxxxxxxxxx” //Algoritmo de validación del TPV // Digest=SHA-1(Ds_ Amount + Ds_ Order + Ds_MerchantCode + // Ds_ Currency + Ds _Response + CLAVE SECRETA) StringBuffer msgToDigest = new StringBuffer(); msgToDigest.append(response.getDs_Amount()); msgToDigest.append(response.getDs_Order()); msgToDigest.append(response.getDs_MerchantCode()); msgToDigest.append(response.getDs_Currency()); msgToDigest.append(response.getDs_Response()); msgToDigest.append(secretKey); //Generamos SHA1