VINX Programació Web, Barcelona
669 344 302   vinx@vinx.info

Dilluns, 24 de Abril de 2017

Com desenvolupar un sistema de subscripcions o pagaments recurrents via web

Utilitzant el principal TPV virtual del mercat espanyol, el de RedSys, amb la seva api i el seu webservice

Com desenvolupar un sistema de subscripcions o pagaments recurrents via web

En internet existeix molta informació sobre com integrar el TPV virtual de RedSys, no obstant això la majoria fan referència a la seva forma més senzilla i utilitzada: la del cobrament instantani d'un determinat import. Això és el que habitualment precisen la majoria de pàgines webs eCommerce: l'usuari fa la seva comanda a la web, i per finalitzar-la ho enviem a la pàgina del TPV virtual que haurem contractat amb el nostre banc perquè allí es realitzi el pagament, evitant-nos haver d'emmagatzemar qualsevol informacion sensible com les dades de la targeta, ja que d'això justament s'encarrega el TPV virtual. A nosaltres tan sols ens queda recollir la resposta del TPV i marcar eventualment la comanda com pagada.

Avui anem a fer-li un volt de rosca més i veurem com desenvolupar un sistema de subscripcions o pagaments recurrents, és a dir pagaments que ja no precisen de la interacció de l'usuari.

Primer de tot, en sol·licitar el TPV virtual en l'oficina del vostre banc de confiança, tu o el teu client haureu de sol·licitar dues opcions addicionals que habitualment no s'activen per defecte amb el TPV:

  1. Activació del "Pagament per referència": això ens permetrà obtenir, durant el primer pagament, una clau única per identificar posteriorment la targeta de l'usuari, i així poder processar nous cobraments.
  2. Activació del "Doble pagament (operacions segures i insegures)": les operacions que l'usuari realitza introduint ell mateix les dades de la seva targeta, i que inclouen el CVC, es consideren segures. No obstant això si posteriorment realitzarem un cobrament automàtic a la mateixa targeta, sense que l'usuari intervingui, aquesta es considerarà una operació insegura, per defecte no permesa pel TPV.

Aquestes opcions, encara que per defecte no estiguin activades en el "entorn real", sempre ho estan en el "entorn de proves" així que podreu començar a provar-les de seguida.

El procés consta de 2 parts: primer sol·licitarem a l'usuari que realitzi un primer pagament, per poder obtenir l'identificador de la seva targeta per als pagaments posteriors. Val també el pagament simbòlic d'1 cèntim.

Als paràmetres que habitualment enviaríem al TPV, haurem d'afegir un de nou: "DS_MERCHANT_IDENTIFIER" el valor del qual serà la cadena de text "REQUIRED". D'aquesta manera, estarem sol·licitant al TPV que ens retorni l'esmentat identificador de la targeta. A la pàgina encarregada de processar la resposta del TPV, o sigui la que haurem indicat en la variable "DS_MERCHANT_MERCHANTURL", i sempre que la resposta del TPV sigui que el pagament s'ha realitzat correctament, podrem llavors recollir més variables: "Ds_Merchant_Identifier" ens arribarà valoritzat amb una cadena que guardarem per identificar la targeta de l'usuari; també tindrem accés a "Ds_ExpiryDate" que ens indicarà la data de caducitat de la mateixa, bàsic per saber fins a quan podem processar pagaments amb ella.

Per al segon pas, el de realitzar el cobrament automàtic quan arribi el moment, us deixo un codi php d'exemple que cridarà la api normalment proporcionada amb la documentacion del TPV virtual, i que interactuarà amb el webservice de RedSys:

<?php
require_once("apiRedsysWs.php"); // Conté la classe RedsysAPIWs. Si no us la proporcionen, sol·liciteu-la al banc.
$TPV = new RedsysAPIWs;

$DATOS_ENTRADA = "<DATOSENTRADA>";
$DATOS_ENTRADA .= "<DS_MERCHANT_MERCHANTCODE>$IDCOMERCIO</DS_MERCHANT_MERCHANTCODE>";
$DATOS_ENTRADA .= "<DS_MERCHANT_TERMINAL>$TERMINAL</DS_MERCHANT_TERMINAL>";
$DATOS_ENTRADA .= "<DS_MERCHANT_TRANSACTIONTYPE>A</DS_MERCHANT_TRANSACTIONTYPE>";
$DATOS_ENTRADA .= "<DS_MERCHANT_AMOUNT>$IMPORTE</DS_MERCHANT_AMOUNT>";
$DATOS_ENTRADA .= "<DS_MERCHANT_CURRENCY>978</DS_MERCHANT_CURRENCY>";
$DATOS_ENTRADA .= "<DS_MERCHANT_ORDER>$CODIGO_PEDIDO</DS_MERCHANT_ORDER>";
$DATOS_ENTRADA .= "<DS_MERCHANT_IDENTIFIER>$IDENTIFICADOR_OBTENIDO_PREVIAMENTE</DS_MERCHANT_IDENTIFIER>";
$DATOS_ENTRADA .= "</DATOSENTRADA>";

$XML = "<REQUEST>";
$XML .= $DATOS_ENTRADA;
$XML .= "<DS_SIGNATUREVERSION>HMAC_SHA256_V1</DS_SIGNATUREVERSION>";
$XML .= "<DS_SIGNATURE>'.$TPV->createMerchantSignatureHostToHost($CLAVETPV, $DATOS_ENTRADA)."</DS_SIGNATURE>";
$XML .= "</REQUEST>";

$CLIENTE = new SoapClient("https://sis.redsys.es/sis/services/SerClsWSEntrada?wsdl"); // Entorno real
$CLIENTE = new SoapClient("https://sis-t.redsys.es:25443/sis/services/SerClsWSEntrada?wsdl"); // Entorno de prueba
$RESPONSE = $CLIENTE->trataPeticion(array("datoEntrada"=>$XML));

if(isset($RESPONSE->trataPeticionReturn)) {
	$XML_RETORNO = new SimpleXMLElement($RESPONSE->trataPeticionReturn);
	if(isset($XML_RETORNO->OPERACION->Ds_Response)) {
		$RESPUESTA = (int) $XML_RETORNO->OPERACION->Ds_Response;
		if(($RESPUESTA >= 0) && ($RESPUESTA <= 99)) { 
			// Procesamos el cobro aceptado
		}
	}
}
?>

 

« Veure tots els articles

Deixa'ns la teva opinió:






Comparteix-ho


De què es parla en aquesta web?

Fem servir cookies pròpies i de tercers per analitzar els teus hàbits de navegació. Si continues navegant considerem que acceptes el seu ús. OK | més detalls