Get it on Google Play

Integrando nuestro eCommerce con Flywire para recibir pagos internacionales

30-03-2017
 
Flywire Logo

Flywire Logo

Flywire es lo que se conoce como un proveedor de métodos de pago, es decir, que a través de el nuestros clientes/usuarios podrán pagar mediante diferentes tipos de pago desde diferentes países.

Flywire es una excelente opción cuando vendemos a nivel internacional y lo que vendemos son productos de cierto valor, no todo el mundo tiene 6.000 Euros de margen en la tarjeta. En estos casos, Flywire nos facilitará que nuestros clientes nos transfieran dinero desde cualquier lugar del mundo.

Además, Flywire tiene una estupenda API para integrar nuestra plataforma de venta con ellos, y agilizar así, la gestión de pagos. La API es bien sencilla, aquí están los pasos(Los ejemplos son en Java):

Solicitar dinero

Para solicitar el dinero es bien sencillo, simplemente, hacemos una petición Rest a su API indicando el importe, la URL donde recibiremos las notificaciones, etc:

String callbackUrl = "https://<URL donde recibiré las notificaciones>";

JSONObject dinamicFields=JSONFactoryUtil.createJSONObject();
dinamicFields.put("student_id", "15");
dinamicFields.put("student_first_name", "Pepe");
dinamicFields.put("student_last_name", "Lee");

JSONObject params=JSONFactoryUtil.createJSONObject();
params.put("provider", "<provider>" );
params.put("payment_destination", "<payment_destination>" );
/* importe sin puntos ni comas, los dos últimos ceros son decimales */
params.put("amount", "4500" );
params.put("callback_url", callbackUrl );
params.put("callback_id", "<id de petición>" );
params.put("dynamic_fields", dinamicFields );
			
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest=new HttpPost( "https://gateway.demo.flywire.com/v1/transfers" );
			
String firma=computeSignature( params.toString(), “Mi clave secreta” );
postRequest.setHeader("X-Peertransfer-Digest", firma );

StringEntity input = new StringEntity( params.toString(), "UTF-8" );
input.setContentType("application/json; charset=utf-8");
postRequest.setEntity(input);
			
HttpResponse response = httpClient.execute(postRequest);
BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));

String o;
while ((o = br.readLine()) != null) output.append(o);
			
httpClient.getConnectionManager().shutdown();
			
StringBuilder sb=new StringBuilder();
Header[] hs=response.getAllHeaders();
for ( int i=0; i<hs.length; i++ ) {
	if ( hs[i].getName().equals("Location") ) {
		resp.sendRedirect( hs[i].getValue() );
		return;
		}
	}

La petición nos devuelve una redirección a la URL donde deberemos redirigir al usuario o un error.

Recibir ‘callback’ de un pago

Mientras el usuario hace el pago en los sistema de Flywire nosotros recibiremos una notificación POST por cada estado(“initiated”, “guaranteed”, “delivered” o “cancelled”) por el que pase el pago. Con este script lo podemos gestionar:

/* Leemos el cuerpo de la petición */
StringBuilder data=new StringBuilder();
String line=null;
BufferedReader reader = req.getReader();
while ((line = reader.readLine()) != null) {
	data.append(line);
	}
		    
JSONObject ret=JSONFactoryUtil.createJSONObject( data.toString() );
pid=ret.getString("callback_id");
		    
if ( ret.getString("status").equals("guaranteed") ) { /* Status valors: ["initiated", “guaranteed”, "delivered", "cancelled"] */
	System.out.println("El pago "+pid+" esta garantizado.");
	}

Autenticación del usuario

Os habréis fijado que en la petición hacemos uso de la función ‘computeSignature’. Esta función firma el mensaje, con una clave que solo nosotros conocemos, para certificar a Flywire que nosotros somos los autores de la petición:

private static String computeSignature(String baseString, String keyString) {
	try { 
	    byte[] keyBytes = keyString.getBytes();
	    SecretKey secretKey = new SecretKeySpec(keyBytes, "HmacSHA256");
	
	    Mac mac = Mac.getInstance("HmacSHA256");
	    mac.init(secretKey);
	
	    byte[] text = baseString.getBytes();

	    return new String(Base64.encode( mac.doFinal(text) )).trim();
	} catch (Exception ex) { ex.printStackTrace(); }
		
	return null;
	}	
 

Leave a Reply