durdi Posted January 19, 2014 Share Posted January 19, 2014 (edited) 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 March 19, 2014 by durdi (see edit history) Link to comment Share on other sites More sharing options...
Feliz Garcia Posted January 19, 2014 Share Posted January 19, 2014 (edited) 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 January 19, 2014 by Feliz Garcia (see edit history) Link to comment Share on other sites More sharing options...
durdi Posted January 20, 2014 Author Share Posted January 20, 2014 (edited) 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 January 20, 2014 by durdi (see edit history) Link to comment Share on other sites More sharing options...
Feliz Garcia Posted January 20, 2014 Share Posted January 20, 2014 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 More sharing options...
durdi Posted January 20, 2014 Author Share Posted January 20, 2014 (edited) 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...... 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 January 20, 2014 by durdi (see edit history) Link to comment Share on other sites More sharing options...
durdi Posted January 21, 2014 Author Share Posted January 21, 2014 (edited) 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 January 21, 2014 by durdi (see edit history) Link to comment Share on other sites More sharing options...
isi09 Posted January 22, 2014 Share Posted January 22, 2014 lo has probado ya? funciona? Link to comment Share on other sites More sharing options...
durdi Posted January 25, 2014 Author Share Posted January 25, 2014 Pues la verdad es que no. Sigo leyendo sobre programacion a ver si lo saco.....o alguien nos echa una mano ¡¡¡ Link to comment Share on other sites More sharing options...
durdi Posted January 27, 2014 Author Share Posted January 27, 2014 (edited) 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 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 January 27, 2014 by durdi (see edit history) Link to comment Share on other sites More sharing options...
maxxis Posted January 28, 2014 Share Posted January 28, 2014 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 More sharing options...
isi09 Posted January 29, 2014 Share Posted January 29, 2014 he desistido de seguir buscando informacion. Lo voy a comprar (el modulo), sale por 71 con iva quereis que vayamos a medias? http://addons.prestashop.com/es/pagos-prestashop-modulos/9096-tpv-virtual-unicaja.html Link to comment Share on other sites More sharing options...
durdi Posted January 31, 2014 Author Share Posted January 31, 2014 (edited) 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 January 31, 2014 by durdi (see edit history) Link to comment Share on other sites More sharing options...
isi09 Posted January 31, 2014 Share Posted January 31, 2014 pues animooo¡¡¡ jajaj si quereis comprar ese que es mas barato contad conmigo. Link to comment Share on other sites More sharing options...
isi09 Posted January 31, 2014 Share Posted January 31, 2014 (edited) yo ya lo he comprado. si no encontrais nada mandadme privado Edited January 31, 2014 by isi09 (see edit history) Link to comment Share on other sites More sharing options...
durdi Posted March 19, 2014 Author Share Posted March 19, 2014 Bueno, pues finalmente ya tengo activo el modulo de unicaja. Saludos Link to comment Share on other sites More sharing options...
Paula Martinez Posted March 19, 2014 Share Posted March 19, 2014 Bueno, pues finalmente ya tengo activo el modulo de unicaja. Saludos ¿Es posible que subas al foro, el módulo que has desarrollado? Gracias ! Link to comment Share on other sites More sharing options...
benavictor Posted June 28, 2014 Share Posted June 28, 2014 yo ya lo he comprado. si no encontrais nada mandadme privado Link to comment Share on other sites More sharing options...
Recommended Posts