Jump to content

[Solucionado ] Modulo TPV Unicaja


durdi

Recommended Posts

Hola a todos,

 

Estoy buscando informacion para instalar un modulo que me sirva para el pago con tarjeta de Unicaja (TPV Virtual). Oficialmente no hay modulo, pues Unicaja ya no funciona con el de CECA. Es mas hay que crearselo uno mismo y solo te facilitan un manual para ello. He buscado informacion y hay poca la verdad. Aunque mis conocimientos de programacion son limitados, me he propuesto crear dicho modulo. Y si es posible me gustaria que me hecharais una mano a crearlo. Por supuesto, dicho modulo se subiria una vez terminado, al banco de modulos gratis del foro.

 

Bueno, vamos al lio.

Como no sabia por donde empezar, la verdad, mi intencion ha sido usar el modulo de CECA como base para la modificacion al de Unicaja. y uno que hay para oscommerce.

 

Lo que pide Unicaja es que una vez pulsado el boton de pago con tarjeta, es decir una vez elegida esa forma de pago en el paso 4, el programa debe hacer una llamada a una URL de Unicaja, pasando 3 variables por POST (tienda, referencia y fecha). A su vez el TPV llamará a una URLVerificacion residente en nuestro PS, mandandonos por GET 2 variables (referencia y fecha). Por ultimo debemos enviar de nuevo una cadena con 8 variables (tienda, referencia, importe, divisa, fecha, idioma, URLOK*, URLKO**).

 * URLOK, es la url de nuestro PS, donde enviará Unicaja al cliente una vez finalizado satisfactoriamente el pago.

** URLOK, es la url de nuestro PS, donde enviará Unicaja al cliente una vez finalizado NO satisfactoriamente el pago.

 

y desde aqui se enviará directamente al cliente a la pagina de Unicaja para hacer el pago.

 

Por ultimo, si queremos ser informados del resultado de la operacion, el TPV, llamará a una URLconfir, residente en nuestro PS, que nos pasará por GET 13 variables en el caso de que la compra haya sido OK y/o 5 variables si el resultado es KO.

 

 

La primera parte seria:

<p class="payment_module">
    <a href="javascript:$('#unicajatpv_form').submit();" title="{l s='Conectar con el TPV' mod='unicajatpv'}">
        <img src="{$module_dir}unicaja-banner.jpg" alt="{l s='Conectar con el TPV' mod='unicajatpv'}" />
        {l s='Pago con tarjeta (Conexión segura con TPV Virtual Unicaja)' mod='unicajatpv'}
    </a>
</p>

<form action="{$urltpv}" method="post" id="unicajatpv_form" class="hidden" enctype="application/x-www-form-urlencoded">    
    <input type="hidden" name="tienda"       value="{$tienda}" />
    <input type="hidden" name="referencia"   value="{$referencia}" />
    <input type="hidden" name="fecha"        value="{$fecha}" />
    
</form>

Mi primer problema seria ver como recibimos las varibles por GET exactamente:

$referencia=$_GET['referencia'];
$fecha=$_GET['fecha'];

....... sigo en el siguiente post....

 

 

PD: Si lo moderadores piensan que este post no da a lugar o es necesario modificarlo, decirmelo y se elimina.

Edited by durdi (see edit history)
Link to comment
Share on other sites

Hola a todos,

 

Estoy buscando informacion para instalar un modulo que me sirva para el pago con tarjeta de Unicaja (TPV Virtual). Oficialmente no hay modulo, pues Unicaja ya no funciona con el de CECA. Es mas hay que crearselo uno mismo y solo te facilitan un manual para ello. He buscado informacion y hay poca la verdad. Aunque mis conocimientos de programacion son limitados, me he propuesto crear dicho modulo. Y si es posible me gustaria que me hecharais una mano a crearlo. Por supuesto, dicho modulo se subiria una vez terminado, al banco de modulos gratis del foro.

 

Bueno, vamos al lio.

Como no sabia por donde empezar, la verdad, mi intencion ha sido usar el modulo de CECA como base para la modificacion al de Unicaja. y uno que hay para oscommerce.

 

Lo que pide Unicaja es que una vez pulsado el boton de pago con tarjeta, es decir una vez elegida esa forma de pago en el paso 4, el programa debe hacer una llamada a una URL de Unicaja, pasando 3 variables por POST (tienda, referencia y fecha). A su vez el TPV llamará a una URLVerificacion residente en nuestro PS, mandandonos por GET 2 variables (referencia y fecha). Por ultimo debemos enviar de nuevo una cadena con 8 variables (tienda, referencia, importe, divisa, fecha, idioma, URLOK*, URLKO**).

 * URLOK, es la url de nuestro PS, donde enviará Unicaja al cliente una vez finalizado satisfactoriamente el pago.

** URLOK, es la url de nuestro PS, donde enviará Unicaja al cliente una vez finalizado NO satisfactoriamente el pago.

 

y desde aqui se enviará directamente al cliente a la pagina de Unicaja para hacer el pago.

 

Por ultimo, si queremos ser informados del resultado de la operacion, el TPV, llamará a una URLconfir, residente en nuestro PS, que nos pasará por GET 13 variables en el caso de que la compra haya sido OK y/o 5 variables si el resultado es KO.

 

 

La primera parte seria:

<p class="payment_module">
    <a href="javascript:$('#unicajatpv_form').submit();" title="{l s='Conectar con el TPV' mod='unicajatpv'}">
        <img src="{$module_dir}unicaja-banner.jpg" alt="{l s='Conectar con el TPV' mod='unicajatpv'}" />
        {l s='Pago con tarjeta (Conexión segura con TPV Virtual Unicaja)' mod='unicajatpv'}
    </a>
</p>

<form action="{$urltpv}" method="post" id="unicajatpv_form" class="hidden" enctype="application/x-www-form-urlencoded">    
    <input type="hidden" name="tienda"       value="{$tienda}" />
    <input type="hidden" name="referencia"   value="{$referencia}" />
    <input type="hidden" name="fecha"        value="{$fecha}" />
    
</form>

Mi primer problema seria ver como recibimos las varibles por GET exactamente:

$referencia=$_GET['referencia'];
$fecha=$_GET['fecha'];

....... sigo en el siguiente post....

 

 

PD: Si lo moderadores piensan que este post no da a lugar o es necesario modificarlo, decirmelo y se elimina.

 

No tengo ni idea de como funciona Unicaja, pero por si te sirve de ayuda, supongo que puedes bajar el oficial de Redsys para Prestashop: http://www.redsys.es/wps/portal/redsys/publica/areadeserviciosweb/descargaDeDocumentacionYEjecutables y  cambiar las lineas de codigo que sean necesarios. (Supongo que el funcionamiento debe ser parecido a excepción de la url donde manda el tpv, y quizas de la generación de la firma, pero la base de enviar datos y recibir, esta desarrollado en ese módulo, que al final y al cabo se podra adaptar por si se envian mas datos  y se reciben datos distintos)

 

¿El pdf que te da unicaja lo puedes adjuntar al foro?

Edited by Feliz Garcia (see edit history)
Link to comment
Share on other sites

Gracias Feliz Garcia. Conocia la existencia de ese modulo. Es muy parecido al de CECA que utilizo como base.

 

....seguimos.

 

He generado ya los archivos:

* pago_ok.tpl (he modificado la extension para poder subirlos)

* pago_ko.tpl (he modificado la extension para poder subirlos)

* pago_ko.php

* config.xml

* unicajatpv.tpl (indicado en el post anterior)(he modificado la extension para poder subirlos)

 

que adjunto por si quiere alguien echarles un vistazo por si hay algun error.

config.xml

pago_ko.php

unicajatpv.tpl.php

pago_ko.tpl.php

pago_ok.tpl.php

Edited by durdi (see edit history)
Link to comment
Share on other sites

Gracias Feliz Garcia. Conocia la existencia de ese modulo. Es muy parecido al de CECA que utilizo como base.

 

....seguimos.

 

He generado ya los archivos:

* pago_ok.tpl (he modificado la extension para poder subirlos)

* pago_ko.tpl (he modificado la extension para poder subirlos)

* pago_ko.php

* config.xml

* unicajatpv.tpl (indicado en el post anterior)(he modificado la extension para poder subirlos)

 

que adjunto por si quiere alguien echarles un vistazo por si hay algun error.

 

Gracias por el aporte.

 

¿Lo has podido probar?

 

PD: Por cierto, si lo comprimes todo en un fichero zip, te ahorras el subir los ficheros por separados.

 

Saludos,

Link to comment
Share on other sites

no los he probado aun.

 

me queda el grueso del modulo realmente (que serán el unicajaTPV.php y el respuestatpv.php). Esto que he puesto es lo facil de hacer. Lo dificil es donde necesito ayuda...... :unsure:

 

 

este es el codigo del archivo unicajatpv.php, con el que partimos del modulo de CECA

<?php
class unicajatpv extends PaymentModule{
	
	private $_html = '';
	private $_postErrors = array();
	
	public function __construct(){
		$this->name = 'unicajatpv';
		$this->tab = 'payments_gateways';
		$this->version = 1.0;
				
		// Array config con los datos de configuración
		$config = Configuration::getMultiple(array(
			'CECATPV_URLTPV',
			'CECATPV_tienda', 
			'CECATPV_ACQUIRERBIN', 
			'CECATPV_TERMINALID', 
			'CECATPV_EXPONENTE', 
			'CECATPV_TIPOMONEDA',
			'CECATPV_ERRORACTION',
			'CECATPV_DEBUGMODE',
			'CECATPV_DEBUGEMAIL'));
		
		// Establecer propiedades según los datos de configuración
		
		if (isset($config['CECATPV_URLTPV']))
			$this->urltpv = $config['CECATPV_URLTPV'];	

		if (isset($config['CECATPV_tienda']))
			$this->tienda = $config['CECATPV_tienda'];	
				
		if (isset($config['CECATPV_ACQUIRERBIN']))
			$this->AcquirerBIN = $config['CECATPV_ACQUIRERBIN'];
			
		if (isset($config['CECATPV_TERMINALID']))
			$this->TerminalID = $config['CECATPV_TERMINALID'];
						
		if (isset($config['CECATPV_EXPONENTE']))
			$this->Exponente = $config['CECATPV_EXPONENTE'];
						
		if (isset($config['CECATPV_TIPOMONEDA']))
			$this->TipoMoneda = $config['CECATPV_TIPOMONEDA'];

		if (isset($config['CECATPV_ERRORACTION']))
			$this->ErrorAction = $config['CECATPV_ERRORACTION'];

		if (isset($config['CECATPV_DEBUGMODE']))
			$this->DebugMode = $config['CECATPV_DEBUGMODE'];		

		if (isset($config['CECATPV_DEBUGEMAIL']))
			$this->DebugEMail = $config['CECATPV_DEBUGEMAIL'];									

		parent::__construct();
				
		$this->page = basename(__FILE__, '.php');
		$this->displayName = $this->l('Unicaja TPV');
		$this->description = $this->l('Aceptar pagos con tarjeta vía CECA');
		
		// Mostrar aviso en la página principal de módulos si faltan datos de configuración.
		if (
			!isset($this->urltpv) 
			OR !isset($this->tienda)
			OR !isset($this->AcquirerBIN) 
			OR !isset($this->TerminalID) 
			OR !isset($this->Exponente) 
			OR !isset($this->TipoMoneda) 
			OR !isset($this->ErrorAction)
			OR !isset($this->DebugMode)
			OR !isset($this->DebugEMail)
		)
			$this->warning = $this->l('Te faltan datos a configurar el módulo CECA TPV.');
	}

	public function install()	{
		// Valores por defecto al instalar el módulo
		if (
			!parent::install()  
			OR !Configuration::updateValue('CECATPV_URLTPV', 'https://www.unicaja.es/cgi-bin/tpv/ServletTPVM')
			OR !Configuration::updateValue('CECATPV_TERMINALID', '00000003')
			OR !Configuration::updateValue('CECATPV_EXPONENTE', '2')
			OR !Configuration::updateValue('CECATPV_TIPOMONEDA', '978') 
			OR !Configuration::updateValue('CECATPV_ERRORACTION', '0') 
			OR !Configuration::updateValue('CECATPV_DEBUGMODE', '0') 
			OR !Configuration::updateValue('CECATPV_DEBUGEMAIL', Configuration::get('PS_SHOP_EMAIL') ) 
			OR !$this->registerHook('payment')
		)
			return false;

		return true;
	}

	public function uninstall()	{
		 // Valores a quitar si desinstalamos el módulo
		if (
			!Configuration::deleteByName('CECATPV_URLTPV') 
			OR !Configuration::deleteByName('CECATPV_tienda')
			OR !Configuration::deleteByName('CECATPV_ACQUIRERBIN') 
			OR !Configuration::deleteByName('CECATPV_TERMINALID') 
			OR !Configuration::deleteByName('CECATPV_EXPONENTE')
			OR !Configuration::deleteByName('CECATPV_TIPOMONEDA') 
			OR !Configuration::deleteByName('CECATPV_ERRORACTION')
			OR !Configuration::deleteByName('CECATPV_DEBUGMODE') 
			OR !Configuration::deleteByName('CECATPV_DEBUGEMAIL') 
			OR !parent::uninstall()
		)
			return false;
			
		return true;
	}

	private function _postValidation(){
			// Si al enviar los datos del formulario de configuración hay campos vacios, mostrar errores.
		if (isset($_POST['btnSubmit'])){			
			if (empty($_POST['urltpv']))
				$this->_postErrors[] = $this->l('Se requiere la URL de llamada del entorno.');		
			if (empty($_POST['tienda']))
				$this->_postErrors[] = $this->l('Se requiere identificado de tienda.');					
			if (empty($_POST['acquirerbin']))
				$this->_postErrors[] = $this->l('Se requiere Acquirer BIN.');	
			if (empty($_POST['terminalid']))
				$this->_postErrors[] = $this->l('Se requiere Terminal ID.');					
			if (empty($_POST['exponente']))
				$this->_postErrors[] = $this->l('Se requiere Exponente.');										
			if (empty($_POST['tipomoneda']))
				$this->_postErrors[] = $this->l('Se requiere el Tipo de moneda.');			
		}
	}

	private function _postProcess(){
			// Actualizar la configuración en la BBDD
		if (isset($_POST['btnSubmit']))
			{
			Configuration::updateValue('CECATPV_URLTPV',      $_POST['urltpv']);	
			Configuration::updateValue('CECATPV_tienda',      $_POST['tienda']);
			Configuration::updateValue('CECATPV_ACQUIRERBIN', $_POST['acquirerbin']);
			Configuration::updateValue('CECATPV_TERMINALID',  $_POST['terminalid']);
			Configuration::updateValue('CECATPV_EXPONENTE',   $_POST['exponente']);
			Configuration::updateValue('CECATPV_TIPOMONEDA',  $_POST['tipomoneda']);
			Configuration::updateValue('CECATPV_ERRORACTION', $_POST['erroraction']);
			Configuration::updateValue('CECATPV_DEBUGMODE',   $_POST['debugmode']);
			Configuration::updateValue('CECATPV_DEBUGEMAIL',  $_POST['debugemail']);
			}

		$this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('ok').'" /> '.$this->l('Configuración actualizada').'</div>';
	}

	private function _displayunicajatpv()
	{
		// Aparición el la lista de módulos
		$this->_html .= '<img src="../modules/cecatpv/unicaja-banner.jpg" style="float:left; margin-right:15px;"><b>'.$this->l('Este módulo te permite aceptar pagos con tarjeta.').'</b><br /><br />
		'.$this->l('Si el cliente elije este modo de pago, podrá pagar de forma automática.').'<br /><br /><br />';
	}

	private function _displayForm(){
		// Mostar formulario
		$this->_html .=
		'<form action="'.$_SERVER['REQUEST_URI'].'" method="post">
			<fieldset>
			<legend><img src="../img/admin/contact.gif" />'.$this->l('Configuración del TPV').'</legend>
				<p class="clear">'.$this->l('Por favor completa la información requerida que te proporcionará tu caja').'.</p>
					<label>'.$this->l('URL del TPV').'</label>
						<div class="margin-form"><input type="text" name="urltpv" value="'.
						Tools::getValue('urltpv', $this->urltpv).
						'" style="width: 330px;" /></div>
					<label>'.$this->l('Código comercio (tienda)').'</label>
						<div class="margin-form" style="height: 35px;"><input type="text" name="tienda" value="'.
						Tools::getValue('tienda', $this->tienda).
						'" style="width: 330px;" /></div>
					<label>'.$this->l('Código entidad (AcquirerBIN)').'</label>
						<div class="margin-form" style="height: 35px;"><input type="text" name="acquirerbin" value="'.
						Tools::getValue('acquirerbin', $this->AcquirerBIN).
						'" style="width: 330px;" /></div>
					<label>'.$this->l('TerminalID').'</label>
						<div class="margin-form"><input type="text" name="terminalid" value="'.
						Tools::getValue('terminalid', $this->TerminalID).
						'" style="width: 330px;" /></div>
					<label>'.$this->l('Exponente').'</label>
						<div class="margin-form"><input type="text" name="exponente" value="'.
						Tools::getValue('exponente', $this->Exponente).
						'" style="width: 330px;" /></div>
					<label>'.$this->l('Tipo Moneda').'</label>
						<div class="margin-form"><input type="text" name="tipomoneda" value="'.
						Tools::getValue('tipomoneda', $this->TipoMoneda).
						'" style="width: 330px;" /></div>
					<label>'.$this->l('Acción ante pago incorrecto').'</label>
					<div class="margin-form">
						<input type="radio" name="erroraction" id="erroraction_nochange" value="0" '.($this->ErrorAction==0 ? 'checked="checked" ' : '').'/>
						<label class="t" for="debugmode_nochange">'.$this->l('Dejar el carrito sin modificar y mostrarlo de nuevo para que el cliente pueda completar el pedido escogiendo otro medio de pago').'</label><br />
						<input type="radio" name="erroraction" id="erroraction_ordererror" value="1" '.($this->ErrorAction==1 ? 'checked="checked" ' : '').'/>
						<label class="t" for="erroraction_ordererror">'.$this->l('Cancelar el pedido, cambiando su estado a "Error de pago", vaciando en carrito y mostrar el historial de sus pedidos al cliente').'</label>
					</div>
					<label>'.$this->l('Activar modo depuración').'</label>
					<div class="margin-form">
						<input type="radio" name="debugmode" id="debugmode_on" value="1" '.(Tools::getValue('debugmode', $this->DebugMode) ? 'checked="checked" ' : '').'/>
						<label class="t" for="debugmode_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Activado').'" /></label>
						<input type="radio" name="debugmode" id="debugmode_off" value="0" '.(!Tools::getValue('debugmode', $this->DebugMode) ? 'checked="checked" ' : '').'/>
						<label class="t" for="debugmode_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Desactivado').'" /></label>
						<p class="clear">'.$this->l('Envía un e-mail con información cada vez que CECA TPV valida<br />un pago, con información útil para encontrar errores').'</p></div>
					<label>'.$this->l('Correo de depuración').'</label>
						<div class="margin-form"><input type="text" name="debugemail" value="'.
						Tools::getValue('debugemail', $this->DebugEMail).
						'" style="width: 330px;" />
						<p class="clear">'.$this->l('Correo electrónico para depuración. Por defecto el correo de la tienda').'</p></div>
					<center><input class="button" name="btnSubmit" value="'.$this->l('Guardar configuración').'" type="submit" /></center>
			</fieldset>
		</form>';


		
	}	

	public function getContent()
	{
		// Recoger datos
		$this->_html = '<h2>'.$this->displayName.'</h2>';
		if (!empty($_POST))
		{
			$this->_postValidation();
			if (!sizeof($this->_postErrors))
				$this->_postProcess();
			else
				foreach ($this->_postErrors AS $err)
					$this->_html .= '<div class="alert error">'. $err .'</div>';
		}
		else
			$this->_html .= '<br />';
		$this->_displayunicajatpv();
		$this->_displayForm();
		return $this->_html;
	}

	public function enviar_mail_debug($asunto, $mensaje){
		if(Configuration::get('CECATPV_DEBUGMODE')==1){
			$para      = Configuration::get('CECATPV_DEBUGEMAIL');
			$cabeceras = 'From: ' . Configuration::get('PS_SHOP_EMAIL') . "\r\n";
			mail($para, $asunto, $mensaje, $cabeceras);
		}
	}

	public function calculaFirma($stringFirma){
		return sha1($this->clavetpv.$stringFirma);
	}
	
	public function hookPayment($params){
		global $smarty, $cookie, $cart;
		
		//Generamos para $Descripcion en $productos una lista de los articulos indicando cantidad 

		$products = $params['cart']->getProducts();
		$productos = '';
		foreach ($products as $product) {
			$productos .= $product['quantity'].' '.$product['name'].'<br />';
		}
		$productos = substr($productos, 0, 1000);


		//Calculo para $Importe de la compra en $cantidad 
		//BUG Da por supuesto que PS esta configurado en la misma moneda que TipoMoneda
		$id_currency = intval(Configuration::get('PS_CURRENCY_DEFAULT'));			
		$currency = new Currency(intval($id_currency));
		/* @Cart.php function getOrderTotal($withTaxes = true, $type = 3)
		 *  $withTaxes true == con impuestos incluidos 
		 *  $type 3 == total del carrito, productos y descuentos
		*/ 
		$cantidad = number_format(
			Tools::convertPrice($params['cart']->getOrderTotal(true, 3), $currency), 
			2, '.', ''
		);
		$cantidad = str_replace('.','',$cantidad);    

		$urltpv           = Tools::getValue('urltpv', $this->urltpv);
		$tienda           = Tools::getValue('tienda', $this->tienda);
		$AcquirerBIN      = Tools::getValue('acquirerbin', $this->AcquirerBIN);
		$TerminalID       = Tools::getValue('terminalid', $this->TerminalID);
		$Exponente        = Tools::getValue('exponente', $this->Exponente);
		$TipoMoneda       = Tools::getValue('tipomoneda', $this->TipoMoneda);
		$url_OK           = 'http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/cecatpv/back.php?id='.$params['cart']->id.'&ok=1';
		$url_NOK          = 'http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/cecatpv/back.php?id='.$params['cart']->id.'&ok=0';
		$Num_operacion    = $params['cart']->id;
		$Importe          = $cantidad;
		$Idioma           = '1';
		$Pago_soportado   = 'SSL';
		$Descripcion      = $productos;
		$Cifrado		  = 'SHA1';
 
		$Firma=$this->calculaFirma($tienda.$AcquirerBIN.$TerminalID.$Num_operacion.$Importe.$TipoMoneda.$Exponente.$Cifrado.$url_OK.$url_NOK);

		$smarty->assign(array(
			'urltpv'          => $urltpv,
			'tienda    '      => $tienda,
			'acquirerbin'     => $AcquirerBIN,
			'terminalid'      => $TerminalID,
			'exponente'       => $Exponente,
			'tipomoneda'      => $TipoMoneda,
			'url_ok'          => $url_OK,
			'url_nok'         => $url_NOK,
			'num_operacion'   => $Num_operacion,
			'importe'         => $Importe,
			'idioma'          => $Idioma,
			'pago_soportado'  => $Pago_soportado,
			'descripcion'     => $Descripcion,
			'firma'           => $Firma,
			'cifrado'		  => $Cifrado,

			'titular' => ($cookie->logged ? $cookie->customer_firstname.' '.$cookie->customer_lastname : false),			

			'this_path' => $this->_path
		));
		return $this->display(__FILE__, 'unicajatpv.tpl');
		}
}
?>
Edited by durdi (see edit history)
Link to comment
Share on other sites

Modificado el archivo.

Se han renombrado las variables y eliminado las que no necesitamos.

Tambien eliminado configuraciones y opciones no necesarias.

<?php

class unicajaTPV extends PaymentModule{
    
    private $_html = '';
    private $_postErrors = array();
    
    public function __construct(){
        $this->name = 'unicajaTPV';
        $this->tab = 'payments_gateways';
        $this->version = 1.0;
                
        // Array config con los datos de configuración. se configura en el panel de modulos
        $config = Configuration::getMultiple(array(
            'UNICAJATPV_URLTPV',       // direccion de enlace con Unicaja.
            'UNICAJATPV_TIENDA',       // ID que nos lo facilita Unicaja el solicitar el servicio.
            'UNICAJATPV_DIVISA',       // por defect en mi tienda es 'EUR' .
            'UNICAJATPV_ERRORACTION',  // accion ante pago incorrecto.dejar carrito o anular pedido.
            'UNICAJATPV_DEBUGMODE',    // Envía un e-mail con información cada vez que UnicajaTPV valida un pago.
            'UNICAJATPV_DEBUGEMAIL')); // Correo electrónico para depuración. Por defecto el correo de la tienda.
        
        // Establecer propiedades según los datos de configuración
        
        if (isset($config['UNICAJATPV_URLTPV']))
            $this->urltpv = $config['UNICAJATPV_URLTPV'];    

        if (isset($config['UNICAJATPV_TIENDA']))
            $this->tienda = $config['UNICAJATPVV_TIENDA'];    
                        
        if (isset($config['UNICAJATPV_DIVISA']))
            $this->TipoMoneda = $config['UNICAJATPV_DIVISA'];

        if (isset($config['UNICAJATPVV_ERRORACTION']))
            $this->ErrorAction = $config['UNICAJATPV_ERRORACTION'];

        if (isset($config['UNICAJATPV_DEBUGMODE']))
            $this->DebugMode = $config['UNICAJATPV_DEBUGMODE'];        

        if (isset($config['UNICAJATPV_DEBUGEMAIL']))
            $this->DebugEMail = $config['UNICAJATPV_DEBUGEMAIL'];                                    

        parent::__construct();
                
        $this->page = basename(__FILE__, '.php');
        $this->displayName = $this->l('Unicaja TPV');
        $this->description = $this->l('Aceptar pagos con tarjeta vía UNICAJATPV');
        
        // Mostrar aviso en la página principal de módulos si faltan datos de configuración.
        if (
            !isset($this->urltpv)
            OR !isset($this->tienda)
            OR !isset($this->Divisa)
            OR !isset($this->ErrorAction)
            OR !isset($this->DebugMode)
            OR !isset($this->DebugEMail)
        )
            $this->warning = $this->l('Te faltan datos a configurar el módulo UNICAJATPV.');
    }

    public function install()    {
        // Valores por defecto al instalar el módulo
        if (
            !parent::install()  
            OR !Configuration::updateValue('UNICAJATPV_URLTPV', 'https://www.unicaja.es/cgi-bin/tpv/ServletTPVM')
            OR !Configuration::updateValue('UNICAJATPV_TIENDA', '0000000000')
            OR !Configuration::updateValue('UNICAJATPV_DIVISA', '978')
            OR !Configuration::updateValue('UNICAJATPV_ERRORACTION', '0')
            OR !Configuration::updateValue('UNICAJATPV_DEBUGMODE', '0')
            OR !Configuration::updateValue('UNICAJATPV_DEBUGEMAIL', Configuration::get('PS_SHOP_EMAIL') )
            OR !$this->registerHook('payment')
        )
            return false;

        return true;
    }

    public function uninstall()    {
         // Valores a quitar si desinstalamos el módulo
        if (
            !Configuration::deleteByName('UNICAJATPV_URLTPV')
            OR !Configuration::deleteByName('UNICAJATPV_TIENDA')
            OR !Configuration::deleteByName('UNICAJATPV_DIVISA')
            OR !Configuration::deleteByName('UNICAJATPV_ERRORACTION')
            OR !Configuration::deleteByName('UNICAJATPV_DEBUGMODE')
            OR !Configuration::deleteByName('UNICAJATPV_DEBUGEMAIL')
            OR !parent::uninstall()
        )
            return false;
            
        return true;
    }

    private function _postValidation(){
            // Si al enviar los datos del formulario de configuración hay campos vacios, mostrar errores.
        if (isset($_POST['btnSubmit'])){            
            if (empty($_POST['urltpv']))
                $this->_postErrors[] = $this->l('Se requiere la URL de llamada del entorno.');        
            if (empty($_POST['tienda']))
                $this->_postErrors[] = $this->l('Se requiere el identificador de tienda.');                                                        
            if (empty($_POST['divisa']))
                $this->_postErrors[] = $this->l('Se requiere el Tipo de moneda.');            
        }
    }

    private function _postProcess(){
            // Actualizar la configuración en la BBDD
        if (isset($_POST['btnSubmit']))
            {
            Configuration::updateValue('UNICAJATPV_URLTPV',      $_POST['urltpv']);    
            Configuration::updateValue('UNICAJATPV_TIENDA',      $_POST['tienda']);
            Configuration::updateValue('UNICAJATPV_DIVISA',      $_POST['divisa']);
            Configuration::updateValue('UNICAJATPV_ERRORACTION', $_POST['erroraction']);
            Configuration::updateValue('UNICAJATPV_DEBUGMODE',   $_POST['debugmode']);
            Configuration::updateValue('UNICAJATPV_DEBUGEMAIL',  $_POST['debugemail']);
            }

        $this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('ok').'" /> '.$this->l('Configuración actualizada').'</div>';
    }

    private function _displayunicajatpv()
    {
        // Aparición el la lista de módulos
        $this->_html .= '<img src="../modules/UnicajaTPV/unicaja-banner.jpg" style="float:left; margin-right:15px;"><b>'.$this->l('Este módulo te permite aceptar pagos con tarjeta.').'</b><br /><br />
        '.$this->l('Si el cliente elije este modo de pago, podrá pagar de forma automática.').'<br /><br /><br />';
    }

    private function _displayForm(){
        // Mostar formulario
        $this->_html .=
        '<form action="'.$_SERVER['REQUEST_URI'].'" method="post">
            <fieldset>
            <legend><img src="../img/admin/contact.gif" />'.$this->l('Configuración del TPV').'</legend>
                <p class="clear">'.$this->l('Por favor completa la información requerida que te proporcionará tu caja').'.</p>
                    <label>'.$this->l('URL del TPV').'</label>
                        <div class="margin-form"><input type="text" name="urltpv" value="'.
                        Tools::getValue('urltpv', $this->urltpv).
                        '" style="width: 330px;" /></div>
                    <label>'.$this->l('Código comercio (tienda)').'</label>
                        <div class="margin-form" style="height: 35px;"><input type="text" name="tienda" value="'.
                        Tools::getValue('tienda', $this->tienda).
                        '" style="width: 330px;" /></div>
                    <label>'.$this->l('Tipo Moneda').'</label>
                        <div class="margin-form"><input type="text" name="Tipomoneda" value="'.
                        Tools::getValue('divisa', $this->divisa).
                        '" style="width: 330px;" /></div>
                    <label>'.$this->l('Acción ante pago incorrecto').'</label>
                    <div class="margin-form">
                        <input type="radio" name="erroraction" id="erroraction_nochange" value="0" '.($this->ErrorAction==0 ? 'checked="checked" ' : '').'/>
                        <label class="t" for="debugmode_nochange">'.$this->l('Dejar el carrito sin modificar y mostrarlo de nuevo para que el cliente pueda completar el pedido escogiendo otro medio de pago').'</label><br />
                        <input type="radio" name="erroraction" id="erroraction_ordererror" value="1" '.($this->ErrorAction==1 ? 'checked="checked" ' : '').'/>
                        <label class="t" for="erroraction_ordererror">'.$this->l('Cancelar el pedido, cambiando su estado a "Error de pago", vaciando en carrito y mostrar el historial de sus pedidos al cliente').'</label>
                    </div>
                    <label>'.$this->l('Activar modo depuración').'</label>
                    <div class="margin-form">
                        <input type="radio" name="debugmode" id="debugmode_on" value="1" '.(Tools::getValue('debugmode', $this->DebugMode) ? 'checked="checked" ' : '').'/>
                        <label class="t" for="debugmode_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Activado').'" /></label>
                        <input type="radio" name="debugmode" id="debugmode_off" value="0" '.(!Tools::getValue('debugmode', $this->DebugMode) ? 'checked="checked" ' : '').'/>
                        <label class="t" for="debugmode_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Desactivado').'" /></label>
                        <p class="clear">'.$this->l('Envía un e-mail con información cada vez que UNICAJA TPV valida<br />un pago, con información útil para encontrar errores').'</p></div>
                    <label>'.$this->l('Correo de depuración').'</label>
                        <div class="margin-form"><input type="text" name="debugemail" value="'.
                        Tools::getValue('debugemail', $this->DebugEMail).
                        '" style="width: 330px;" />
                        <p class="clear">'.$this->l('Correo electrónico para depuración. Por defecto el correo de la tienda').'</p></div>
                    <center><input class="button" name="btnSubmit" value="'.$this->l('Guardar configuración').'" type="submit" /></center>
            </fieldset>
        </form>';


        
    }    

    public function getContent()
    {
        // Recoger datos
        $this->_html = '<h2>'.$this->displayName.'</h2>';
        if (!empty($_POST))
        {
            $this->_postValidation();
            if (!sizeof($this->_postErrors))
                $this->_postProcess();
            else
                foreach ($this->_postErrors AS $err)
                    $this->_html .= '<div class="alert error">'. $err .'</div>';
        }
        else
            $this->_html .= '<br />';
        $this->_displayunicajatpv();
        $this->_displayForm();
        return $this->_html;
    }

    public function enviar_mail_debug($asunto, $mensaje){
        if(Configuration::get('UNICAJATPV_DEBUGMODE')==1){
            $para      = Configuration::get('UNICAJATPV_DEBUGEMAIL');
            $cabeceras = 'From: ' . Configuration::get('PS_SHOP_EMAIL') . "\r\n";
            mail($para, $asunto, $mensaje, $cabeceras);
        }
    }

    public function calculaFirma($stringFirma){
        return sha1($this->clavetpv.$stringFirma);
    }
    
    public function hookPayment($params){
        global $smarty, $cookie, $cart;
        
        //Generamos para $Descripcion en $productos una lista de los articulos indicando cantidad

        $products = $params['cart']->getProducts();
        $productos = '';
        foreach ($products as $product) {
            $productos .= $product['quantity'].' '.$product['name'].'<br />';
        }
        $productos = substr($productos, 0, 1000);


        //Calculo para $Importe de la compra en $cantidad
        //BUG Da por supuesto que PS esta configurado en la misma moneda que TipoMoneda
        $id_currency = intval(Configuration::get('PS_CURRENCY_DEFAULT'));            
        $currency = new Currency(intval($id_currency));
        /* @Cart.php function getOrderTotal($withTaxes = true, $type = 3) */
        /*  $withTaxes true == con impuestos incluidos                    */
        /*  $type 3 == total del carrito, productos y descuentos          */
        
        $cantidad = number_format(Tools::convertPrice($params['cart']->getOrderTotal(true, 3), $currency), 2, '.', '');
        $cantidad = str_replace('.','',$cantidad);
        $cantidad = floatval($cantidad);  
        // El número de pedido es  los 8 ultimos digitos del ID del carrito + el tiempo MMSS. Cogido del modulo de redsys
        $referencia     = str_pad($params['cart']->id, 8, "0", STR_PAD_LEFT) . date(is);

        $urltpv         = Tools::getValue('urltpv', $this->urltpv);
        $tienda         = Tools::getValue('tienda', $this->tienda);
        $divisa         = Tools::getValue('divisa', $this->divisa);   //cambiamos la variable &Tipomoneda a divisa
        $url_OK         = 'http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/unicajaTPV/pago_ok.tpl';
        $url_NOK        = 'http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/unicajaTPv/pago_ko.php';
        $Importe        = $cantidad;
        $Idioma         = 'es';
        //$Pago_soportado = 'SSL';
        //$Descripcion    = $productos;
        //$Cifrado        = 'SHA1';
        //$Firma=$this->calculaFirma($tienda.$Num_operacion.$Importe.$TipoMoneda.$Cifrado.$url_OK.$url_NOK);

        $smarty->assign(array(
            'tienda    '      => $tienda,
            'referencia   '   => $referencia,          //cambiamos el nombre de la variable &Num_operacion a referencia
            'importe'         => $Importe,
            'urltpv'          => $urltpv,
            'divisa'          => $divisa,              //cambiamos la variable &Tipomoneda a divisa
            'fecha'           => $fecha,
            'idioma'          => $Idioma,
            'url_ok'          => $url_OK,
            'url_nok'         => $url_NOK,
            //'pago_soportado'  => $Pago_soportado,
            //'descripcion'     => $Descripcion,
            //'firma'           => $Firma,
            //'cifrado'            => $Cifrado,
            //'titular'         => ($cookie->logged ? $cookie->customer_firstname.' '.$cookie->customer_lastname : false),            

            'this_path' => $this->_path
        ));
        return $this->display(__FILE__, 'unicajatpv.tpl');
        }
}
?>


Edited by durdi (see edit history)
Link to comment
Share on other sites

Bueno pues sigo atascado:

 

1º- Lo que pide Unicaja es que una vez pulsado el boton de pago con tarjeta, es decir una vez elegida esa forma de pago en el paso 4, el programa debe hacer una llamada a una URL de Unicaja, pasando 3 variables por POST (tienda, referencia y fecha). Eso ya está. Eso es el archivo unicajatpv.tpl

 

2º- A su vez el TPV llamará a una URLVerificacion residente en nuestro PS, mandandonos por GET 2 variables (referencia y fecha). Aqui es donde me quedo :unsure:

include(dirname(__FILE__).'/unicajaTPV.php');

if (!empty($_GET)){

	// Recoger datos de respuesta
	$referencia   = $_GET["referencia"];
	$fecha        = $_GET["fecha"];

3º- Por ultimo debemos enviar de nuevo una cadena con 8 variables como texto plano(tienda, referencia, importe, divisa, fecha, idioma, URLOK*, URLKO**), siendo:

 * URLOK, la url de nuestro PS, donde enviará Unicaja al cliente una vez finalizado satisfactoriamente el pago.

** URLOK, la url de nuestro PS, donde enviará Unicaja al cliente una vez finalizado NO satisfactoriamente el pago.

que deberia ser algo asi:

 echo "valor1=".$valor1&"valor2="$valor2&........."valor8=".$valor8;  

y desde aqui se enviará directamente al cliente a la pagina de Unicaja para hacer el pago.

Edited by durdi (see edit history)
Link to comment
Share on other sites

Yo estoy buscando módulos de pago de Unicaja en otras plataformas para ver como funcionan, pero por lo que veo la exclusividad de la pasarela de Unicaja hace que muy poca gente la use, y el negocio en prestashop es vender módulos y no precisamente baratos para los que estamos empezando. Como suele decirse, el que algo quiere, algo le cuesta.

 

Si localizo algo te aviso durdi. Gracias por tu esfuerzo.

Link to comment
Share on other sites

Hola de nuevo,

 

Sigo con ello, aunque ahora no tengo mucho tiempo.

 

maxxis eso hice yo. Encontré uno de Oscommerce, pero no tiene mucho que ver la verdad.

 

isi09 Te lo agradezco y estoy tentado de decirte que si, puesto que entre los 3 saldria barato, pero ya me he encabezonado jajaja. Hay mas incluso mas baratos http://moduleshop.obsolutions.es/es/33-tpv-virtual-unicaja-modulo-para-prestashop.html

 

Saludos

Edited by durdi (see edit history)
Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...
Guest
This topic is now closed to further replies.
×
×
  • Create New...