Modificar modulo pago Servired para CECA.

Roob

Nuevo usuario
Buenas,

Para conseguir que el modulo de pago de defcon2 (servired) funcione para CECA el archivo principal que hay que modificar es Standar.php que se encuentra en:

/app/code/local/Mage/Servired/Model

En este archivo se crean todos los parametros que luego se pasan al TPV de ceca asi que con modificar este es suficiento. Eso si, habra que pasarle pasametros directamente desde la pagina o modificar el formulario del fronted si se quiere evitar esto. Yo por ahora y como aun es fase de pruebas he modificado solo este archivo.

En el archivo mencionado lo primero es comentar la definicion del array $sArr y poner nuestro propio array. Ejemplo:
PHP:
$sArr = array('MerchantID'	=>	$MerchantID,
				'AcquirerBIN'	=>	$AcquirerBIN,
				'TerminalID'	=>	$TerminalID,
				'Num_operacion'	=>	$ord,
				'Importe'	=>	$Importe,
				'Tipomoneda'	=>	$Tipomoneda,
				'Exponente'	=>	$Exponente,
				'URL_OK'	=>	$URL_OK,
				'URL_NOK'	=>	$URL_NOK,
				'Firma'		=>	$Firma,
				'Idioma'	=>	$Idioma,
				'Pago_soportado'=>	$Pago_soportado);

Ahora, y claro esta antes que asignar todas estas variables hay que asignarlas. Ejemplo:

PHP:
		$MerchantID = "xxxxxxxxxx";
		$AcquirerBIN = "xxxxxxxxxx";
		$TerminalID = "00000003";
		$Num_operacion = $ord;
		$Importe = $order->getTotalDue() * 100;
		$Tipomoneda = 978;
		$Exponente = 2; 
		$URL_OK = "http://www.ceca.es";
		$URL_NOK = "http://www.ceca.es";
		$Idioma = 1;
		$Pago_soportado = "SSL";
		if ($this->getConfigData('urlservired') == '1') {
			$Clave = "xxxxxxx(clave produccion)";
		}else{
			$Clave = "xxxxxxx(clave desarrollo)";
		}

Y ahora la parte mas importante, la creacion de la clave cifrada para que ceca acepte los parametros.
Para ello hay que compilar el programa que nos pasan (a no ser que nos lo pasen compilado), y colocar el archivo resultante en un directorio de nuestro servidor. Luego hay que ejecutar el programa pasandole TODOS (y recalco todos porque sino no funcionara) los parametros que necesita.

PHP:
$string = "./calculo $Clave $MerchantID $AcquirerBIN $TerminalID $Num_operacion $Importe $Tipomoneda $Exponente \"\" ";


$Firma = exec($string);
Hay que rellenar algunos datos desde la configuración de servired (como la url de CECA y tal...)pero básicamente con esto y unos mínimos conocimientos de php ya se puede hacer funcionar correctamente.

Nota: PHP tiene que tener Safe_mode off o no funcionara el ejecutar comando.
Nota2: Gracias defcon2 :jeje:

Un saludo,
 

marcos.feijoo

Nuevo usuario
Siguiendo las instrucciones...

Hola Roob,
He seguido tus instrucciones y esto es lo que he conseguido, que me dices ¿tiene buena pinta?. Me da que no...
Por cierto ya consegui el manual de la CECA, se lo pedi a ellos por email y me lo enviaron.

Ahi va el codigo, (todavia no he cambiado las XXXXX por datos):

Insertar CODE, HTML o PHP:
<?php
/**
*
* Servired  Checkout Module
*
*/
class Mage_Servired_Model_Standard extends Mage_Payment_Model_Method_Abstract {
	//changing the payment to different from cc payment type ....
	const	PAYMENT_TYPE_AUTH	=	'AUTHORIZATION';
	const	PAYMENT_TYPE_SALE	=	'SALE';

	protected	$_code  = 'servired_standard';
	protected	$_formBlockType = 'servired/standard_form';
	protected	$_allowCurrencyCode = array(
	'ADP','ZWD'
	);

	/**
	* Get Servired session namespace
	*
	* @return Mage_Servired_Model_Session
	*/
	public function getSession() {
		return	Mage::getSingleton('servired/session');
	}

	/**
	* Get checkout session namespace
	*
	* @return Mage_Checkout_Model_Session
	*/
	public function getCheckout() {
		return	Mage::getSingleton('checkout/session');
	}

	/**
	* Get current quote
	*
	* @return Mage_Sales_Model_Quote
	*/
	public function getQuote() {
		return	$this->getCheckout()->getQuote();
	}

	/**
	* Using internal pages for input payment data
	*
	* @return bool
	*/
	public function canUseInternal() {
		return	false;
	}

	/**
	* Using for multiple shipping address
	*
	* @return bool
	*/
	public function canUseForMultishipping() {
		return	true;
	}

	public function createFormBlock($name) {
		$block	=	$this->getLayout()->createBlock('servired/standard_form', $name)
			->setMethod('servired_standard')
			->setPayment($this->getPayment())
			->setTemplate('servired/form.phtml');

		return	$block;
	}

	/*validate the currency code is avaialable to use for servired or not*/
	public function validate() {
		parent::validate();
		$currency_code = $this->getQuote()->getBaseCurrencyCode();
		if(!in_array($currency_code,$this->_allowCurrencyCode)) {
			Mage::throwException(Mage::helper()->__('El codigo de moneda seleccionado (%s) no es compatible con Servired',$currency_code));
		}
		return	$this;
	}

	public function onOrderValidate(Mage_Sales_Model_Order_Payment $payment) {
		return	$this;
	}

	public function onInvoiceCreate(Mage_Sales_Model_Invoice_Payment $payment) {
	}

	public function canCapture() {
		return true;
	}

	public function getOrderPlaceRedirectUrl() {
		return Mage::getUrl('servired/standard/redirect');
	}

	//
	// Convert from Magento currency to Servired currency
	//
	public function convertToServiredCurrency($cur) {
		switch ($cur) {
			case "ADP": return "020";
		
			case "ZWD": return "716";
		}
		return "";
	}

	function calcLanguage($lan) {
		$res = "";
		switch($lan) {
			case "da_DK": return "1";
			case "de_CH": return "7";
			case "de_DE": return "7";
			case "en_AU": return "2";
			case "en_GB": return "2";
			case "en_US": return "2";
			case "sv_SE": return "3";
			case "nn_NO": return "4";  
		}
		return "1";
	}

	public function getStandardCheckoutFormFields() {
		$a = $this->getQuote()->getShippingAddress();
		//getQuoteCurrencyCode

		$order = Mage::getModel('sales/order');
		$order->loadByIncrementId($this->getCheckout()->getLastRealOrderId());

		$convertor = Mage::getModel('sales/convert_order');
		$invoice = $convertor->toInvoice($order); 

		$amount = $order->getTotalDue() * 100;
		$ord = $this->getCheckout()->getLastRealOrderId();

		$code = $this->getConfigData('merchantnumber');
		$currency = $this->convertToServiredCurrency($order->getOrderCurrency());
		$clave = $this->getConfigData('merchantpassword');

		if($this->getConfigData('signaturetype') == 2){
			$merchurl = $this->getConfigData('merchanturl');
			$transtype = (int)$this->getConfigData('merchanttransactiontype');
			$message = "$amount$ord$code$currency$transtype$merchurl$clave"; //formula sha-1 completo ampliado ...... 
		} else {
			$message = "$amount$ord$code$currency$clave";						// para sha-1 completo
		}
		$signature = sha1($message);

[B]// <CODIGO CECA>
	$sArr = array('MerchantID'    =>    $MerchantID,
                'AcquirerBIN'    =>    $AcquirerBIN,
                'TerminalID'    =>    $TerminalID,
                'Num_operacion'    =>    $ord,
                'Importe'    =>    $Importe,
                'Tipomoneda'    =>    $Tipomoneda,
                'Exponente'    =>    $Exponente,
                'URL_OK'    =>    $URL_OK,
                'URL_NOK'    =>    $URL_NOK,
                'Firma'        =>    $Firma,
                'Idioma'    =>    $Idioma,
                'Pago_soportado'=>    $Pago_soportado);  



  $MerchantID = "xxxxxxxxxx";
        $AcquirerBIN = "xxxxxxxxxx";
        $TerminalID = "00000003";
        $Num_operacion = $ord;
        $Importe = $order->getTotalDue() * 100;
        $Tipomoneda = 978;
        $Exponente = 2; 
        $URL_OK = "http://www.ceca.es";
        $URL_NOK = "http://www.ceca.es";
        $Idioma = 1;
        $Pago_soportado = "SSL";
        if ($this->getConfigData('urlservired') == '1') {
            $Clave = "xxxxxxx(clave produccion)";
        }else{
            $Clave = "xxxxxxx(clave desarrollo)";
        }               
	
	$string = "./calculo $Clave $MerchantID $AcquirerBIN $TerminalID $Num_operacion $Importe $Tipomoneda $Exponente \"\" ";
	$Firma = exec($string); 
	
// </CODIGO CECA>	[/B]	
	
	
	
		//
		// Make into request data
		//
		$sReq = '';
		$rArr = array();
		foreach ($sArr as $k=>$v) {
			/* replacing & char with and. otherwise it will break the post */
			$value =  str_replace("&","and",$v);
			$rArr[$k] =  $value;
			$sReq .= '&'.$k.'='.$value;
		}

		return $rArr;
	}

	//
	// Simply return the url for the Servired Payment window
	//
	public function getServiredUrl() {
		if ($this->getConfigData('specificurl') != '') {
			return $this->getConfigData('specificurl');
		}
		
		if ($this->getConfigData('urlservired') == '1') {
			return "https://sis.sermepa.es/sis/realizarPago";  // entorno real......
		}else{
			return "https://sis-t.sermepa.es:25443/sis/realizarPago";   // esta es url de pruebas.....
		}
	}
}
 
Upvote 0

Roob

Nuevo usuario
Buenas,

Lo primero es que las asignaciones de las variables tienes que hacerlas antes de meterlas en el array. Vamos, que tienes el bloque al reves.
Y lo mas importante es comprobar que tu clase genera bien la clave. Para ello simplemente haz un print_r de $firma tras hacer el exec ($Firma = exec($string);) y mira que lo que te devuelve es una larga cadena de caracteres en vez de un error.
Si no funciona comprueba que le pasas todos los parámetros y que Safe_mode esta en OFF.
Si aún asi sigue sin funcionar y estas seguro de haber compilado bien su script de calculo comprueba que esta en la carpeta correcta y con permisos de ejecución.

Un saludo, Rob.
 
Upvote 0

marcos.feijoo

Nuevo usuario
Avanzando con el modulo de pago de la CECA

He vuelto a retomar el modulo de la CECA y parece que empieza a vivir. He conseguido enviar ya pedidos y que sean aceptados, ya me funciona (solo en Windows) el generador de firmas, pero he llegado a otro escollo.

Al enviar el pago no recibo (o no se como hacerlo) respuesta de la CGI diciendo si la operacion se ha realizado o no. Alguna idea?

Ocurre tambien que el formulario que ofrece la CECA no tiene nada de diseño y me gustaria integrarlo en el entorno magento, aunque tampoco se como hacerlo.

Seguire investigando, si mientras tanto alguien aporta alguna sugerencia será bien recibida.

Hasta la proxima Magenteros y Magenteras, (si es que existís).
 
Upvote 0

vesvello

Nuevo usuario
servired para CECA

Yo tambien estoy trabajando sobre esta modificacion y he conseguido que me funcione pero el problema que tengo es que al regresar a magento... me da como notificado pero no consigo que me envie el email al cliente.... os encontrasteis vosotros tambien con este problema?
 
Upvote 0

boogie

Nuevo usuario
Pues no, no lo añade. Sólo descomprime el tgz desde /downloads/..../.../...
(No estoy en estos momentos en mi pc ni tengo acceso ftp, y no me acuerdo exactamente de las carpetas)
Me da la sensación de que no lo instala bien... hay alguna forma de ver si está instalado o se puede ver alguna funcionalidad?
 
Upvote 0

boogie

Nuevo usuario
Lo he instalado en local y me pasa lo mismo. !!!!

La dirección correcta era /downloader/pearlib/download/Payment_Servired-1.028.tgz.

Este archivo al ejecutarse en el instalador de magento connect parece que lo descomprime a mí al menos solo en ese mismo directorio, sacando las carpetas:
ca_ES, es_ES, frontend, js, mage y modules.
Como parecía que son las mismas carpetas que debería haber instalado en
/app/code/local/Mage/ las he copiado directamente a mano.

No tengo ni idea de se esto puede estar bien, o si puedo comprobar algo de la funcionalidad del módulo; si alguien me puede decir como comprobarlo le estaría muy agradecido.

Gracias y salu2 al foro
 
Upvote 0

George_Spain

Nuevo usuario
Buenos días, por favor que algún supermoderador le eche un vistazillo rápido a este hilo que estamos estancados y no damos con esto último que pregunta boogie.

Gracias por vuestro apoyo incondicional :ok:
 
Upvote 0

boogie

Nuevo usuario
Gracias George... ;)

Lo he vuelto a desinstalar e instalar en local, y no me mete nada en \app\code\local ....

Seguro que estoy haciendo algo mal y es fácil, porque a nadie parece que le ocurra!
 
Upvote 0

George_Spain

Nuevo usuario
Creo que el problema que tenemos es debido a incompatibilidades entre el modulo SERVIRED y ciertas versiones antiguas, como es la 1.20 que es la que estamos usando. Nos hemos dado cuenta de que este módulo es para versiones 1.3+.
Puede ser este el problema?
Entiendo que lo correcto sería instalar la version Magento más actualizada y no me atrevo a preguntar si podría hacerlo sin que repercuta en el trabajo ya realizado, con el 80% del producto metido.

Avecina tormenta :maldia:

gracias vesvello por la info que me enviaste, pero debido a este problema estamos parados, llenando el tiempo con otras cosas, aunque me preocupa que nadie comente nada. Lo mismo es que a nadie le había pasado antes.

saludos, soy nuevo en el foro, busqué algun hilo de presentaciones pero no lo vi.
 
Upvote 0

George_Spain

Nuevo usuario
Disculpad, rectifico, no es la version 1.2.0 la que estamos usando, si no la 1.3.2.2., por lo que la opción de incompatibilidad queda desechada.

Ahora ya sí que estoy loose del todo. :niidea:
 
Upvote 0

Ksumiwue

Nuevo usuario
Ceca

HOla George y compañía.

Gracias por la respuesta del otro hilo, y que me ha traído aquí.

He hecho todo tal y como indicáis, aunque me he perdido con lo de comentar el $rArr. NO sé si tengo que comentar sólo la línea de definición o todo lo que viene después también.

El caso es que he modificado todo el array, he puesto los datos correspondientes, he instalado el módulo y he configurado el correspondiente apartado en la administración, pero no funciona.

Cuando llego a la parte de la forma de pago y selecciono el pago con tarjeta "Servired", al cual he cambiado el nombre y pulso continuar, se va a presentarme el carrito, con sus productos y el total a pagar, pero no se va a la pasarela de pago, como indica el módulo.

Qué estoy haciendo mal???
Acaso he puesto alguna dirección mal???

Alguna idea o pista de cómo seguir???

Gracias de antemano.
 
Upvote 0

Ksumiwue

Nuevo usuario
Acabo de seguir un poquito hacia adelante y es posible que esto nos de alguna luz al tema.

El módulo indica que cuando pulses continuar te derivará a la pasarela de pago de "La Caixa", aunque si modificamos las url, y ponemos las de la CECA, lo arreglamos.

El caso es que esto no es así, hasta que no validas del todo el carrito, pero tampoco es que funcione, ya que cuando lo validas, te manda a: index.php/servired/standard/redirect/ pero no hace nada, se queda ahí. No hace la redirección correspondiente a la pasarela de pago.

Sabéis alguno por qué sucede esto???
 
Upvote 0

Roob

Nuevo usuario
Modulo

Buenas,

Pongo esto por si alguno os encontráis con el mismo problema.

Tras instalar el modulo que podéis encontrar en http://www.magentocommerce.com/exte...v-confederacion-espanola-de-cajas-de-ahorros- me encontre con que no me generaba bien el código.
Al final lo solucione metiendo en el código directamente un par de datos por los que fallaba, que son:

Insertar CODE, HTML o PHP:
$currency = 978;
 $Exponente = 2;
El archivo a modificar es:

Insertar CODE, HTML o PHP:
/app/code/local/Mage/Ceca/ModelStandard.php
Y hay que añadirlo justo antes de la línea:
Insertar CODE, HTML o PHP:
$string = "$calculo $clave $code $AcquirerBIN $TerminalID $ord $amount $currency $Exponente \"\"  ";

Un saludo.
 
Upvote 0

bajolagua

Nuevo usuario
Hola.

Estoy tratando de usar este módulo para Cajamar, pero me falta un dato y la verdad es que no sé de donde sacarlo. Me piden el TITULAR, que no está contemplado en ningún apartado, supongo que podré llamarlo de la base de datos, pero ¿como?

¿Alguna idea?

Gracias por adelantado.

PD.- No es exactamente este el módulo que he utilizado, es el de Caja Rural, pero deben ser muy parecidos en cuanto a funcionamiento porque la información de este post me ha ayudado.
 
Última edición:
Upvote 0

bajolagua

Nuevo usuario
Bueno pues al final no hacía falta este dato, fallaba la generación de firma. Lo he probado con el servidor de pruebas y funciona perfectamente. Para Cajamar el código queda así:

Desde $fecha = date("ymdHis");

He cambiado todo hasta el final con lo siguiente:
--------------------------------------------------------
// $firma = sha1("$amount.$order.$code.$currency.$clave"); // formula sha-1 para caja rural

$message = $amount.$ord.$code.$currency.$clave; // formula sha-1 para cajamar

$signature = sha1($message);


$sArr = array (
'Ds_Merchant_Amount' => $amount,
'Ds_Merchant_Order' => $ord,
'Ds_Merchant_Currency' => $currency,
'Ds_Merchant_MerchantCode' => $this->getConfigData('merchantnumber'),
'Ds_Merchant_ConsumerLanguage' => '0', // correponde a el idioma Castellano
'Ds_Merchant_Terminal' => $this->getConfigData('merchantterminal'),

'Ds_Merchant_MerchantSignature' => $signature,
'Ds_Merchant_MerchantURL' => '$merchantUrl',
'Ds_Merchant_MerchantName' => 'xxxxxxxxxxx',
'Ds_Merchant_TransactionType' => '0',
'Ds_Merchant_ProductDescription' => '0',



'windowstate' => $this->getConfigData('windowstate'),
);


//
// Make into request data
//
$sReq = '';
$rArr = array();
foreach ($sArr as $k=>$v) {
/* replacing & char with and. otherwise it will break the post */
$value = str_replace("&","and",$v);
$rArr[$k] = $value;
$sReq .= '&'.$k.'='.$value;
}

return $rArr;
}

//
// Simply return the url for the Cajarural Payment window
//
public function getCajaruralUrl() {
if ($this->getConfigData('specificurl') != '') {
return $this->getConfigData('specificurl');
}

if ($this->getConfigData('urlcajarural') == '1') {
return "https://tpv01.cajarural.com/nuevo_tpv/tpv/jsp/tpvjp_validaComercio.jsp"; // entorno real...... ESTO NO LO USO PORQUE LO TOMA DEL FRONTEND
}else{
return "https://tpv01.cajarural.com/nuevo_tpv/tpv/jsp/tpvjp_validaComercio.jsp"; // esta es url de pruebas.....
}
}
}

----------------------------------

Ahora me queda averiguar que url´s hay que usar para el UrlOK y el UrlKO.

Saludos
 
Última edición:
Upvote 0
Arriba