Integración BankStore JET/XML

La integración JET (Javascript Encryption Technology) / XML permite la tokenización de datos de tarjeta mediante javascript directamente sobre los servidores de PAYTPV; por lo tanto, la información nunca será procesada en los servidores del cliente.

Los datos viajan encriptados mediante algoritmo rsa, basado en la generación de claves pública y privada. La encriptación se realiza con la clave pública (conocida) y se desencripta con la clave privada (solamente conocida por PAYTPV)

  1. Introducción
  2. Configuración de producto
  3. Formulario de tokenización
  4. Respuesta obtenida
  5. Devolución de la llamada
  6. Ejemplos de uso

Introducción

La integración JET forma parte de la solución BankStore y realiza las tokenizaciones previas a poder ejecutar operaciones de cobro. Es independiente del interfaz de usuario y especialmente recomendada para integraciones para dispositivos móviles.

Configuración de producto

Para poder utilizar el servicio BankStore JET en tu comercio deberás estar en posesión de los parámetros de configuración necesarios. Éstos pueden obtenerse a través del panel de control de cliente (nueva versión)

Una vez dentro de la plataforma, puedes revisar la configuración del producto mediante el menú Mis productos -> Configurar producto

Tras pulsar en el botón “Editar” del producto elegido, aparecerá un panel con la información básica del producto bajo el apartado “Configuración técnica del producto”. En concreto los datos necesarios durante el proceso de integración son:

  • JET ID

Si tu JET ID aún no ha sido generado, puedes hacer click en el enlace Generar JET ID

En ese momento se generará tu JET ID. Con este identificador podrás realizar las llamadas que explicamos en los siguientes apartados.

Formulario de tokenización

Elementos que deberán estar presentes en la página de llamada: Formulario con los siguientes datos:


					
<form action="(callBackScript)" method="POST" id="paytpvPaymentForm" onsubmit="return takingOff();">
	<input type="text" data-paytpv="cardHolderName">
	<input type="text" data-paytpv="paNumber">
	<input type="text" data-paytpv="cvc2">
	<input type="text" data-paytpv="dateMonth">
	<input type="text" data-paytpv="dateYear">
	<button type="submit">Pagar 2,02 € con PAYTPV</button>
</form>
				

Llamada al servidor PAYPTV con el identificador JET ID. El lenguaje es opcional, si no se envía, por defecto los textos aparecerán en español.


					<script src="https://secure.paytpv.com/gateway/jet-paytpv.js?id=(yourJETID)&language=es"></script>				

Un espacio en página por si existen errores


					<span style="color:red;font-weight:bold;" id="paymentErrorMsg"></span>				

Script que maneje la respuesta obtenida y muestre el error o envíen la petición con el token recibido.


					
<script type="text/javascript">
	function takingOff() {
		var x = new PAYTPV.Tokenizator();
		x.getToken(document.forms["paytpvPaymentForm"], boarding);
		return false;
	};

	function boarding(passenger) {
		document.getElementById("paymentErrorMsg").innerHTML = "";
		if (passenger.errorID !== 0 || passenger.paytpvToken === "") {
			document.getElementById("paymentErrorMsg").innerHTML = passenger.errorText;
		} else {
			var newInputField = document.createElement("input");

			newInputField.type = "hidden";
			newInputField.name = "paytpvToken";
			newInputField.value = passenger.paytpvToken;

			var paytpvPaymentForm = document.forms["paytpvPaymentForm"];
			paytpvPaymentForm.appendChild(newInputField);

			paytpvPaymentForm.submit();

		}
	}
</script>
				

Respuesta obtenida

La respuesta obtenida al enviar los datos de tarjeta, si la información es correcta, será un token, de un único uso, que representará la información de la tarjeta. En caso de error, se mostrará el mismo en el elemento identificado como paymentErrorMsg

Con ese token, podrá realizarse la conversión al par idUser/tokenUser, necesarios para las posteriores operaciones. Los tokens tienen una vida útil de 5 minutos desde su generación; una vez pasado ese tiempo no podrán utilizarse.


					Tokenizator {errorID: 0, errorText: "", paytpvToken: "7fd86dc537dcad68b5f9f755...a34a1e0a5c795b862fe12"}				

Al recibir el token, se inserta en los datos del formulario y se realizar la llamada al script de la action del formulario.

Devolución de la llamada

El script de vuelta, recibirá el token. En ese momento, deberá realizarse la llamada al método add_user_token del web service xml-bankstore para recibir el idUser/tokenUser


					

$endPoint		= "https://secure.paytpv.com/gateway/xml-bankstore?wsdl";
$merchantCode	= "*****";
$terminal		= "*****";
$password		= "*****";
$jetID			= "*****";

$signature		= sha1($merchantCode.$token.$jetID.$terminal.$password);
$ip				= $_SERVER["REMOTE_ADDR"];

$clientSOAP = new SoapClient($endPoint);

$addUserResponse = $clientSOAP->add_user_token($merchantCode, $terminal, $token, $jetID, $signature, $ip);
				

Ejemplos de uso

En las siguientes pestañas se muestra un ejemplo completo. Deberá tener asignado un JETID para su terminal.

<!-- PAYTPV JET Form Example -->

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
	input {width:150px;}
	input.min {width:30px;}
</style>
</head>

<body>

<form action="jet_landing.php" method="POST" id="paytpvPaymentForm" onsubmit="return takingOff();">
	<label>Titular de la Tarjeta:</label>
	<input type="text" data-paytpv="cardHolderName" maxlength="50" required="required" title="máximo 50 caracteres"/><br/>
	<label>Número de tarjeta:</label>
	<input type="text" data-paytpv="paNumber" maxlength="16" required="required" placeholder="1234 5678 9012 3456" pattern="[0-9]{15,16}" title="15/16 caracteres numéricos" /><br/>
	<label>CVC2:</label>
	<input type="text" data-paytpv="cvc2" maxlength="4" required="required" placeholder="123" pattern="[0-9]{3,4}" title="3 o 4 caracteres" class="min" /><br/>
	<label>Fecha de caducidad:</label>
	<input type="text" data-paytpv="dateMonth" maxlength="2" placeholder="mm" required="required" pattern="(0[1-9]|1[012])" title="2 números de 01 a 12" class="min"/>
	<input type="text" data-paytpv="dateYear" maxlength="2" placeholder="aa" required="required" pattern="[1-9]{2}" title="2 números desde año actual" class="min"/><br/>
	<button type="submit">Pagar 2,02 € con PAYTPV</button>
</form>

<span style="color:red;font-weight:bold;" id="paymentErrorMsg"></span>

<script type="text/javascript" src="https://secure.paytpv.com/gateway/jet-paytpv.js?id=insertHereYourJETID&language=es"></script>

<script type="text/javascript">
	function takingOff() {
		var x = new PAYTPV.Tokenizator();
		x.getToken(document.forms["paytpvPaymentForm"], boarding);
		return false;
	};

	function boarding(passenger) {
		document.getElementById("paymentErrorMsg").innerHTML = "";
		if (passenger.errorID !== 0 || passenger.paytpvToken === "") {
			document.getElementById("paymentErrorMsg").innerHTML = passenger.errorText;
		} else {
			var newInputField = document.createElement("input");

			newInputField.type = "hidden";
			newInputField.name = "paytpvToken";
			newInputField.value = passenger.paytpvToken;

			var paytpvPaymentForm = document.forms["paytpvPaymentForm"];
			paytpvPaymentForm.appendChild(newInputField);

			paytpvPaymentForm.submit();

		}
	}
</script>

</body>
</html>

/**
 * PAYTPV JET callback
 * Tracking ID: SSX-7MS-JX3J
 *
 * @author PAYTPV ONLINE, S.L.
 * @copyright Copyright (c) 2016, PAYTPV ONLINE, S.L.
 * @version 1.0 2016-05-01
 */

	date_default_timezone_set("Europe/Madrid");

	$token = $_POST["paytpvToken"];

	if ($token && strlen($token) == 64) {

		$endPoint		= "https://secure.paytpv.com/gateway/xml-bankstore?wsdl";
		$merchantCode	= "************";
		$terminal		= "************";
		$password		= "************";
		$jetID			= "************";

		$signature		= sha1($merchantCode.$token.$jetID.$terminal.$password);

		$ip				= $_SERVER["REMOTE_ADDR"];

		try {

			$clientSOAP = new SoapClient($endPoint);

			$addUserTokenResponse = $clientSOAP->add_user_token($merchantCode, $terminal, $token, $jetID, $signature, $ip);

			var_dump($addUserTokenResponse);

		} catch(SoapFault $e){
			var_dump($e);
		}

	} else {
		var_dump("Error, no se ha obtenido token");
	}

	die();