Por fin he conseguido integrar la pasarela de pago de 4b con mi tienda virtual OsCommerce.
Los archivos necearios para la instalación se pueden descargar de manera gratuita desde varios sitios. Son todos muy similares, pero pueden dar problemas con las variables de sesión o cosas parecidas.
Primero probé con la implementación de Zhenit, pero habÃa un problema con el paso de variables y no conseguÃa identificarme correctamente en la pasarela de 4b.
LOS ARCHIVOS QUE FUNCIONAN SON ESTOS:
ficheros pasarela de pago 4b de iproyectos
Veréis un archivo de texto en el que se explica como realizar la instalación. Básicamente, los pasos son:
- Descomprimir el archivo zip
- Subir los ficheros que contiene a la misma ubicación, pero en nuestro servidor
- En el panel de administración de OsCommerce -> Módulos -> Pago
- Veremos una opción nueva “Tarjeta de crédito (pasarela 4b)”. ATENCIÓN: Hay que seleccionar esta, aseguraros de que, al seleccionarla, en la descripción pone “implementada por iProyectos”. No confundir con la otra opción “Tarjeta de crédito (4b)” que viene por defecto con OsCommerce.
- Le damos a “Instalar” y después a “Editar” para configurarla. Tendremos que añadir la clave del comercio que nos ha dado 4b (es un código que empieza por PI…)
- Después habrá que entrar en el panel de configuración de 4b https://tpv.4b.es/config y poner las direcciones URL correspondientes a los ficheros que hemos subido. Los pasos detallados están en el fichero de ayuda del paquete que hemos descargado.
ERROR AL ACCEDER A LA PASARELA 4B: La página se queda en blanco cuando accedemos desde OsCommerce.
Cuando lo probemos, veremos que nos da un error. La página conecta con la pasarela, pero el sistema de 4b se queda esperando los valores del carrito, ya que llegan con error.
TENEMOS QUE CAMBIAR LO SIGUIENTE:
Abrir el archivo:
/includes/modules/payment/iproyectos4b.php
Poner comentarios ( // ) o borrar todas las referencias a la función dprint . Es una función que crea un archivo de texto para registrar los eventos ocurridos durante el paso de parámetros, pero hace que dé un error en el TPV de 4b, ya que éste espera una cadena de caracteres y, al parecer, encuentra las instrucciones de esa función.
Suerte con OsCommerce y paciencia, ya veréis como funciona. Si tenéis algún otro problema con estos archivos para 4b, escribid un comentario de lo que pasa o cómo lo habéis solucionado. Será de ayuda para mucha gente. Gracias.

Hola, lo siento, pero no se que referencias a dprint hay que comentar porque hay un huevo. Podrias ser un poquito mas explicito, te lo agradeceria un monton.
Rodolfo
Hola Rodolfo,
Hay que borrar TODAS las referencias a la función DPRINT que veas en el archivo /includes/modules/payment/iproyectos4b.php
Ya me cuentas.
Salud!
Vicent.
Hola y gracias por tu post. mi problema es que me sale el siguiente error:
Error:
Error de datos de la compra.
Póngase en contacto con el establecimiento
DALEALPAUSE.COM
si me puedes echar una mano seria de agradecer. un saludo.
Hola este el código que me funciono a mi despues de quitar todo..
code = ‘iproyectos4b’;
$this->title = MODULE_PAYMENT_IPROYECTOS4B_TEXT_TITLE;
$this->description = MODULE_PAYMENT_IPROYECTOS4B_TEXT_DESCRIPTION;
$this->sort_order = MODULE_PAYMENT_IPROYECTOS4B_SORT_ORDER;
$this->enabled = ((MODULE_PAYMENT_IPROYECTOS4B_STATUS == ‘True’) ? true : false);
}
//métodos de clase
function javascript_validation() {
$js = “”;
return $js;
}
function selection() {
global $order;
$selection = array(
‘id’ => $this->code,
‘module’ => $this->title,
‘fields’ => array(array(’title’ => MODULE_PAYMENT_IPROYECTOS4B_DESCRIPCION_PUBLICA, ‘field’ => ”)));
return $selection;
}
function pre_confirmation_check() {
global $HTTP_POST_VARS;
}
function confirmation() {
global $HTTP_POST_VARS;
$confirmation = array(
‘title’ => $this->title . ‘: ‘ . $this->cc_card_type,
‘fields’ => array(array(’title’ => MODULE_PAYMENT_IPROYECTOS4B_TEXT_AVISO_CONEXION_4B,
‘field’ => ”)));
return $confirmation;
}
function process_button() {
global $HTTP_POST_VARS;
global $order;
//generamos una semilla que identifica un pedido procesado (para evitar ocasiones
//excepcionales en que un cliente puede pagar el mismo pedido dos veces)
$process_button_string = tep_draw_hidden_field(’semi’, strtoupper(md5(
rand(10742390105897129287345223436,98127398127121934587023453987).time().microtime()
)));
return $process_button_string;
}
function before_process() {
global $HTTP_POST_VARS, $order, $HTTP_GET_VARS;
global $insert_id;
function e /*exists*/ ($str) {return (($str == “”) ? false : true);}
if ( //en este caso el cliente viene de una transacción aceptada
e($HTTP_GET_VARS['result']) &&
$HTTP_GET_VARS['result'] == “0″ &&
e($HTTP_GET_VARS['pszPurchorderNum']) &&
e($HTTP_GET_VARS['pszTxnDate']) &&
e($HTTP_GET_VARS['tipotrans']) &&
e($HTTP_GET_VARS['store']) &&
e($HTTP_GET_VARS['pszApprovalCode']) &&
e($HTTP_GET_VARS['pszTxnID'])
){
$ar_store = $HTTP_GET_VARS['store'];
$ar_order = $HTTP_GET_VARS['pszPurchorderNum'];
//comprobamos el código de comercio
if ($ar_store != MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO){
echo (”Error\n”);
die();
}
//comprobamos la referencia del pedido
$expreg = “^TUINF[0-9]+H[0-9A-F]{32,32}$”;
if (!ereg($expreg, $ar_order, $coincidencias)){
echo (”Error\n”);
die();
}
//extraemos el id de la referencia
$id = substr(substr ($ar_order, 5),0,strpos(substr ($ar_order, 5),”H”));
//todo ok
$pedido_a = tep_db_fetch_array (tep_db_query (”select pedido from iproyectos4b_pedidos where id = ‘$id’ limit 1″));
$pedido_s = urldecode($pedido_a['pedido']);
$order = unserialize($pedido_s);
} elseif ( //el cliente viene de una transacción fallida
e($HTTP_GET_VARS['result']) &&
$HTTP_GET_VARS['result'] == “2″ &&
e($HTTP_GET_VARS['pszPurchorderNum']) &&
e($HTTP_GET_VARS['pszTxnDate']) &&
e($HTTP_GET_VARS['tipotrans']) &&
e($HTTP_GET_VARS['store']) &&
e($HTTP_GET_VARS['coderror']) &&
e($HTTP_GET_VARS['deserror'])
){
$ar_store = $HTTP_GET_VARS['store'];
$ar_order = $HTTP_GET_VARS['pszPurchorderNum'];
//comprobamos el código de comercio
if ($ar_store != MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO){
echo (”Error\n”);
die();
}
//comprobamos la referencia del pedido
$expreg = “^TUINF[0-9]+H[0-9A-F]{32,32}$”;
if (!ereg($expreg, $ar_order, $coincidencias)){
echo (”Error\n”);
die();
}
//extraemos el id de la referencia
$id = substr(substr ($ar_order, 5),0,strpos(substr ($ar_order, 5),”H”));
//todo ok
$pedido_a = tep_db_fetch_array (tep_db_query (”select pedido from iproyectos4b_pedidos where id = ‘$id’ limit 1″));
$pedido_s = urldecode($pedido_a['pedido']);
$order = unserialize($pedido_s);
header(”Location: checkout_payment.php” .
(e($HTTP_GET_VARS['osCsid'])?”?osCsid=” . $HTTP_GET_VARS['osCsid'] :”") );
die();
} elseif ( //el cliente viene de una transaccion cancelada
e($HTTP_GET_VARS['result']) &&
$HTTP_GET_VARS['result'] == “1″ &&
e($HTTP_GET_VARS['pszPurchorderNum']) &&
e($HTTP_GET_VARS['pszTxnDate']) &&
e($HTTP_GET_VARS['tipotrans']) &&
e($HTTP_GET_VARS['store'])
){
$ar_store = $HTTP_GET_VARS['store'];
$ar_order = $HTTP_GET_VARS['pszPurchorderNum'];
//comprobamos el código de comercio
if ($ar_store != MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO){
echo (”Error\n”);
die();
}
//comprobamos la referencia del pedido
$expreg = “^TUINF[0-9]+H[0-9A-F]{32,32}$”;
if (!ereg($expreg, $ar_order, $coincidencias)){
echo (”Error\n”);
die();
}
//extraemos el id de la referencia
$id = substr(substr ($ar_order, 5),0,strpos(substr ($ar_order, 5),”H”));
//todo ok
$pedido_a = tep_db_fetch_array (tep_db_query (”select pedido from iproyectos4b_pedidos where id = ‘$id’ limit 1″));
$pedido_s = urldecode($pedido_a['pedido']);
$order = unserialize($pedido_s);
header(”Location: checkout_payment.php” .
(e($HTTP_GET_VARS['osCsid'])?”?osCsid=” . $HTTP_GET_VARS['osCsid'] :”") );
die();
} else {
$semilla = $HTTP_POST_VARS['semi'];
$sid = $HTTP_GET_VARS['osCsid'];
//comprobación para que no se realice el mismo pago dos veces sin k el usuario le de a Confirmar de nuevo
tep_db_query(”create table if not exists iproyectos4b_aceptados (ordernum text, date varchar(8), tipotrans char(3), store text, authcode text, idtrans text, hash char(32), pedido text, time int(20))”);
$arra2 = tep_db_fetch_array (tep_db_query (”select hash from iproyectos4b_aceptados where pedido = ‘” . urlencode(serialize($order)) . “‘ and hash = ‘” . $semilla . “‘ limit 1″));
if (e($arra2['hash'])){
echo (”Este pago ya ha sido procesado y aceptado. Haga click aquà para continuar\n”);
die();
}
//guardamos el código de comercio para que lo pueda leer la parte del módulo que da
//el desglose de la compra a passat
tep_db_query (”create table if not exists iproyectos4b_vars (id int(1) unique, clavecomercio text)”);
tep_db_query (”insert ignore into iproyectos4b_vars (id,clavecomercio) values (0,’”. MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO .”‘)”);
tep_db_query (”update iproyectos4b_vars set clavecomercio = ‘”. MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO .”‘ where id = 0″);
//registramos esta orden en la tabla de pedidos pendientes
$hash = strtoupper(md5(rand(187923463616427382374,983718172611471677741) . time() . microtime()));
tep_db_query (”insert into iproyectos4b_pedidos (pedido, hash, semilla, sid) values (’” . urlencode(serialize($order)) . “‘,’”. $hash . “‘,’” . $semilla . “‘,’” . $sid . “‘)”);
$arr = tep_db_fetch_array (tep_db_query (”select id from iproyectos4b_pedidos where pedido = ‘” . urlencode(serialize($order)) . “‘ and hash=’$hash’ and semilla=’$semilla’ order by id desc limit 1″));
$id = $arr['id'];
echo “” .
“Estableciendo conexión segura…Por favor, espere\n” .
”.
“\n\n”.
“\n”.
” \n”.
“Haga click si su navegador no soporta JavaScript o si no es redireccionado en 10 segundos.\n”.
“\n\n”;
die();
}
}
function after_process() {
global $insert_id;
}
function get_error() {
global $HTTP_GET_VARS;
$error = array(’title’ => MODULE_PAYMENT_IPROYECTOS4B_TEXT_ERROR,
‘error’ => stripslashes(urldecode($HTTP_GET_VARS['error'])));
return $error;
}
function check() {
if (!isset($this->_check)) {
$check_query = tep_db_query(”select configuration_value from ” . TABLE_CONFIGURATION . ” where configuration_key = ‘MODULE_PAYMENT_IPROYECTOS4B_STATUS’”);
$this->_check = tep_db_num_rows($check_query);
}
return $this->_check;
}
function install() {
tep_db_query(”CREATE TABLE if not exists iproyectos4b_pedidos (id INT (12) UNSIGNED NOT NULL AUTO_INCREMENT, pedido TEXT NOT NULL, hash CHAR(32) DEFAULT ” NOT NULL, semilla CHAR(32) DEFAULT ” NOT NULL, sid TEXT DEFAULT ” NOT NULL, PRIMARY KEY(id), UNIQUE(id), INDEX(id)) “);
//limpiamos la tabla de pedidos, la siguiente lÃnea se puede comentar si se desea mayor persistencia
tep_db_query(”delete from iproyectos4b_pedidos”);
tep_db_query(”insert into ” . TABLE_CONFIGURATION . ” (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values (’Activar módulo’, ‘MODULE_PAYMENT_IPROYECTOS4B_STATUS’, ‘True’, ‘Quiere activar este módulo?’, ‘6′, ‘0′, ‘tep_cfg_select_option(array(\’True\’, \’False\’), ‘, now())”);
tep_db_query(”insert into ” . TABLE_CONFIGURATION . ” (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values (’Preferencia ordinal al mostrar.’, ‘MODULE_PAYMENT_IPROYECTOS4B_SORT_ORDER’, ‘0′, ‘Preferencia ordinal en la lista de formas de pago. Un número menor indica mayor preferencia. ‘, ‘6′, ‘0′ , now())”);
tep_db_query(”insert into ” . TABLE_CONFIGURATION . ” (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values (’Clave de Comercio 4B’, ‘MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO’, ”, ‘La clave de comercio proporcionada por el sistema 4B (es necesaria para que funcione).’, ‘6′, ‘0′, now())”);
tep_db_query(”insert into ” . TABLE_CONFIGURATION . ” (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values (’Idioma’, ‘MODULE_PAYMENT_IPROYECTOS4B_IDIOMA’, ‘es’, ‘Indique un código de idioma de dos letras. El sistema 4B soporta los siguientes idiomas: es (Castellano), ca (Catalán), en (Inglés), fr (Francés), de (Alemán)’, ‘6′, ‘1′, now())”);
}
function remove() {
tep_db_query(”drop table if exists iproyectos4b_pedidos”);
tep_db_query(”delete from ” . TABLE_CONFIGURATION . ” where configuration_key in (’” . implode(”‘, ‘”, $this->keys()) . “‘)”);
}
function keys() {
return array(
‘MODULE_PAYMENT_IPROYECTOS4B_STATUS’,
‘MODULE_PAYMENT_IPROYECTOS4B_SORT_ORDER’,
‘MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO’,
‘MODULE_PAYMENT_IPROYECTOS4B_IDIOMA’);
}
}
//código que devuelve el desglose de la compra al sistema passat
//primero detectamos si el código está siendo llamado directamente y no incluido:
$tok1 = explode (”/”, __FILE__);
$tok2 = explode (”/”, $_SERVER['PHP_SELF']);
if ($tok1[count($tok1)-1] == $tok2[count($tok2)-1] && $tok2[count($tok2)-1] == “iproyectos4b.php”){
//incluÃmos la configuración de osCommerce y las funciones de DB, por compatibilidad
include (’../../../includes/configure.php’);
include (’../../../’ . DIR_WS_FUNCTIONS . ‘database.php’);
function normalizar ($precio){
//convertimos un precio “XX.XX” a “XXXX”
//si no hay . añadimos dos ceros al final
$precio2 = “”;
if (!strpos($precio,”.”)){
$precio2 = $precio . “00″;
} else {
$pos_punto = strpos($precio,”.”);
$decimales = substr($precio,1+$pos_punto);
$num_decimales = strlen($decimales);
$precio2 = substr($precio,0,$pos_punto) .
( $num_decimales info['total'] * $pedido->info['currency_value'];
// dprint (”total del pedido: $total objeto: $pedido .\nserie: “. $pedido_s);
//el precio iso es M (money) + el código del euro (978) + el precio normalizado
//(ver funcion normalizar)
$precioiso = “M978″ . normalizar($total);
$productos = count($pedido->products);
// dprint (”el precio es $precioiso y hay $productos productos en cesta”);
echo $precioiso . “\n”;
// dprint (”>>” . $precioiso);
echo $productos . “\n”;
// dprint (”>>” . $productos);
foreach ($pedido->products as $producto){
$id_producto = “”;
$arrid = tep_db_fetch_array (tep_db_query (”select products_id from products_description where products_name = ‘” . escapar($producto['name']) . “‘ limit 1″,$linktodb));
$id_producto = $arrid['products_id'];
if ($id_producto == “”) $id_producto = “VOID”;
echo “T”. $id_producto . “\n”;
// dprint (”>>” . “T”. $id_producto);
echo $producto['name'] . “\n”;
// dprint (”>>” . $producto['name']);
echo $producto['qty'] . “\n”;
// dprint (”>>” . $producto['qty']);
echo normalizar($producto['final_price']) . “\n”;
// dprint (”>>” . normalizar($producto['final_price']));
}
} elseif ( // registro de transacción fallida
exists($_REQUEST['result'])
&& exists($_REQUEST['pszPurchorderNum'])
&& exists($_REQUEST['pszTxnDate'])
&& exists($_REQUEST['tipotrans'])
&& exists($_REQUEST['store'])
&& exists($_REQUEST['coderror'])
&& exists($_REQUEST['deserror'])
){
/* dprint (”OPERACION DENEGADA:\n” .
$_REQUEST['result'] . “\n” .
$_REQUEST['pszPurchorderNum'] . “\n” .
$_REQUEST['pszTxnDate'] . “\n” .
$_REQUEST['tipotrans'] . “\n” .
$_REQUEST['store'] . “\n” .
$_REQUEST['coderror'] . “\n” .
$_REQUEST['deserror']); */
} elseif ( // registro de transacción aceptada
exists($_REQUEST['result'])
&& exists($_REQUEST['pszPurchorderNum'])
&& exists($_REQUEST['pszTxnDate'])
&& exists($_REQUEST['tipotrans'])
&& exists($_REQUEST['store'])
&& exists($_REQUEST['pszApprovalCode'])
&& exists($_REQUEST['pszTxnID'])
){
/* dprint (”OPERACION ACEPTADA:\n” .
$_REQUEST['result'] . “\n” .
$_REQUEST['pszPurchorderNum'] . “\n” .
$_REQUEST['pszTxnDate'] . “\n” .
$_REQUEST['tipotrans'] . “\n” .
$_REQUEST['store'] . “\n” .
$_REQUEST['pszApprovalCode'] . “\n” .
$_REQUEST['pszTxnID']); */
// dprint (”PROCEDIENDO A CONECTAR -> FILE, SELF(” . __FILE__ . “/” . $_SERVER['PHP_SELF'] . “)”);
//conectamos a la db
tep_db_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE, $linktodb);
tep_db_query(”create table if not exists iproyectos4b_aceptados (ordernum text, date varchar(8), tipotrans char(3), store text, authcode text, idtrans text, hash char(32), pedido text, time int(20))”,$linktodb);
//hash aquà se refiere a la semilla, no al hash que contienen las referencias de compra
//recuperamos la instancia de clase del pedido en la tabla de pedidos a partir de la referencia de compra
$torder = $_REQUEST['pszPurchorderNum'];
//comprobamos la referencia del pedido
$expreg = “^TUINF[0-9]+H[0-9A-F]{32,32}$”;
if (!ereg($expreg, $torder, $coincidencias)){
// dprint (”Referencia erronea”);
die();
}
//extraemos el id y el hash de la referencia
$tid = substr(substr ($torder, 5),0,strpos(substr ($torder, 5),”H”));
$thash = substr($torder,strpos($torder,”H”)+1);
// dprint (”id/hash/order = $tid $thash $torder”);
$arra = tep_db_fetch_array (tep_db_query (”select pedido, semilla from iproyectos4b_pedidos where id = ‘$tid’ and hash = ‘$thash’ limit 1″,$linktodb));
if ((!exists($arra['pedido'])) || (!exists($arra['semilla']))){
// dprint (”No se encontro pedido en tabla por referencia ( ” . $arra['pedido'] . ” ” . $arra['semilla'] . “)”);
die();
}
$arra2 = tep_db_fetch_array (tep_db_query (”select hash from iproyectos4b_aceptados where pedido = ‘” . $arra['pedido']. “‘ and hash = ‘” . $arra['semilla'] . “‘ limit 1″,$linktodb));
if (exists($arra2['hash'])){
// dprint (”COMPRA NOTIFICADA POR SEGUNDA VEZ”);
}
tep_db_query(”insert into iproyectos4b_aceptados (ordernum, date, tipotrans, store, authcode, idtrans, hash, pedido, time) values (’” . $_REQUEST['pszPurchorderNum'] . “‘,’” . $_REQUEST['pszTxnDate'] . “‘,’” . $_REQUEST['tipotrans'] .”‘,’” . $_REQUEST['store'] .”‘,’” . $_REQUEST['pszApprovalCode'] . “‘,’” . $_REQUEST['pszTxnID'] . “‘,’” . $arra['semilla'] . “‘,’” . $arra['pedido'] . “‘,’” . time() . “‘)”,$linktodb);
} elseif ( // registro de transacción cancelada
exists($_REQUEST['result'])
&& exists($_REQUEST['pszPurchorderNum'])
&& exists($_REQUEST['pszTxnDate'])
&& exists($_REQUEST['tipotrans'])
&& exists($_REQUEST['store'])
){
/* dprint (”OPERACION CANCELADA:\n” .
$_REQUEST['result'] . “\n” .
$_REQUEST['pszPurchorderNum'] . “\n” .
$_REQUEST['pszTxnDate'] . “\n” .
$_REQUEST['tipotrans'] . “\n” .
$_REQUEST['store']); */
}
} //if tok1==tok2…
?>
// FIN DEL CODIGO
Por un extraño motivo no han entrado las primeras lineas del archivo, asi que de la linea 1 a la 20 usad el del archivo original aun asi lo postearé por aqui a ver si ahora sale….
code = ‘iproyectos4b’;
Nada no sale….Lo dicho
Se puede adaptar a Zencart?
Hola,
me devuelve el error “URL de cesta errónea”. Sabes de que puede ser?
¿En qué momento aparece ese error? Supongo que te refieres a un error que devuelve 4b, no?
Repasa la configuración de 4b en el panel de control, donde ponemos la URL de los ficheros de la web que necesita 4b para leer los datos y para responder.
Hola vicent,
gracias por contestar. Pude arreglar el error de “URL de cesta erronea” dando permisos a los ficheros. El problema que tengo ahora es el siguiente:
Ya puedo comprar usando la pasarela, hasta aqui todo OK. Pero cuando me retorna a mi pagina se me queda toda en blanco. He comentado todas las funciones que hacen referencia a dprint de la “includes/modules/payment/iproyectos4b.php” pero me la sigue dejando en blanco. Sabes a que se puede deber? O debo comentar alguna mas?
Si como url para despues del procesado dejo checout_process me lo hace todo bien, pero claro, los usuarios que no tengan las cookies activadas tendran problemillas por lo que hay en el README.
Muchas gracias por contestar, te lo agradezco mucho.
Un saludo.
Solo como comentario, no soy el mismo “Javier” que figura más arriba
Para diferenciarme me pongo le “R” al final.
Un saludo.
Muchas gracias, funcionó perfectamente
Hola vicent,
Tengo un problema con la pasarela de pagos que habéis implementado para passat 4B.
El caso es que todo funciona correctamente, hago el pago y este se registra en el sistema 4B.
Sin embargo al darle a continuar (una vez aceptada la transacción) me redirije a iproyectos4b_back.php, de ahà a checkout_process.php y de ahà de nuevo a la página de pago con tarjeta del sistema 4b.
Alguna idea de cómo arreglarlo serÃa muy útil para nosotros.
Un saludo.
Creo que es un problema con los parámetros que no llegan a checkout_process.php pero no se porqué no llegan.
Hola Manuel,
He estado revisando los dos archivos, iproyectos4b_back.php y checkout_process.php, pero no veo nada que haya que configurar para que funcione el paso de parámetros.
De todas formas, te copio a continuación el código de iproyectos4b_back.php para que lo compares, por si acaso. Este proceso es el que utilizo yo y funciona. Repásalo a ver.
Supongo que ya habrás comprobado la configuración en el servidor de 4b y en el panel de OsCommerce. ¿Utilizáis un servidor seguro SSL? ¿Los dos archivos se encuentran en el mismo directorio?
iproyectos4b_back.php->
< ?php
/*
Módulo de págo de la pasarela 4B para osCommerce
Autor:
Daniel Alcántara de la Hoz ( daniel.alcantara@iproyectos.com )
iProyectos Desarrollos Tecnológicos
http://www.iproyectos.com
Copyright (c) 2003 iProyectos
Released under the GNU General Public License
*/
//incluimos la configuración de osCommerce y las funciones de DB, por compatibilidad
include (’includes/configure.php’);
include ( DIR_WS_FUNCTIONS . ‘database.php’);
function exists ($str) {return (($str == “”) ? false : true);}
if ( //el usuario vuelve de una transacción (todavÃa no sabemos el resultado)
exists($_REQUEST['result'])
&& exists($_REQUEST['pszPurchorderNum'])
&& exists($_REQUEST['pszTxnDate'])
&& exists($_REQUEST['tipotrans'])
&& exists($_REQUEST['store'])
){
//aquà se trata de ver si este usuario usaba cookies antes de conectar a passat
//guardamos las variables que pasa el sistema passat
$order = $_REQUEST['pszPurchorderNum'];
$store = $_REQUEST['store'];
//conectamos a la db
tep_db_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE, $linktodb);
//leemos la clave de comercio guardada
$arr = tep_db_fetch_array (tep_db_query (”select clavecomercio from iproyectos4b_vars where id = 0 limit 1″,$linktodb));
define (MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO, $arr['clavecomercio']);
//comprobaciones de seguridad e integridad:
//comprobamos el código de comercio
if ($store != MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO){
echo “Error
“; //no queremos dar mucha información aquà por seguridad
die();
}
//comprobamos la referencia del pedido
$expreg = “^TUINF[0-9]+H[0-9A-F]{32,32}$”;
if (!ereg($expreg, $order, $coincidencias)){
echo “Error
“; //no queremos dar mucha información aquà por seguridad
die();
}
//extraemos el id y el hash de la referencia
$id = substr(substr ($order, 5),0,strpos(substr ($order, 5),”H”));
$hash = substr($order,strpos($order,”H”)+1);
//todo ok
$sid_a = tep_db_fetch_array (tep_db_query(”select sid from iproyectos4b_pedidos where id = ‘$id’ and hash = ‘$hash’ limit 1″, $linktodb));
$sid = $sid_a['sid'];
//primero reunimos los parámetros que mandó passat para
//pasar al usuario a checkout_process
$requeststr = “”;
$requeststr .= “?”;
$pr=0;
foreach ($HTTP_GET_VARS as $key => $value){
if ($pr>0) $requeststr .= “&”;
$requeststr .= “$key=”.urlencode($value);
$pr++;
}
//si el usuario no usaba cookies añadimos el session id
if(exists($sid)) $requeststr .= “&osCsid=” . $sid;
header(”Location: checkout_process.php” . $requeststr);
}
?>
La configuración del panel de configuracion de 4b está tal y como viene descrita en el fichero readme.
No usamos SSL.
Los dos archivos se encuentran en el mismo directorio.
He probado a reemplazar el codigo que tenia de iproyectos4b_back.php con el código que me has posteado pero me da un error http 500 al darle a volver a la tienda en la misma página iproyectos4b_back.php. Supongo que es algún problema con los caracteres. Voy a ver si trato de depurar el codigo php haber si saco algo en claro.
Solucionado!. Sólo tenÃa que sustituir donde recorre el array de los parámetros $HTTP_GET_VARS por $_GET y ha funcionado.
Hola, acabo de instalar este modulo pero tengo una pequeña duda no se exactamente que permisos tengo dar ni a donde los tengo que dar. Haber si me podeis orientar un poco. El problema que tengo es que cuando se va a la direccion de pasat me sale el error de “URL de cesta errónea” y creo que va a ser por los permisos ya que no los he cambiado. Saludos y gracias.
Hola,
Me sale el siguiente error en http://tienda.melquiadesrodriguez.com/includes/modules/payment/iproyectos4b.php?order=TUINF21H050311354AC4099BDF5CF39B62BD843C&store=PI000xxxxx
Undefined variable: linktodb in …/iproyectos4b.php on line 330
Parece como si la variable no estuviera definida. Tengo el register_globals a On.
¿Alguna idea de lo que puede estar pasando?
Solucionado!, sólo tenÃa que declarar una variable linktodb (por alguna razón tal y como estaba en el código no funcionaba).
Después he sustituido en el código donde ponÃa MODULE_PAYMENT_IPROYECTOS4B_CLAVE_DE_COMERCIO por la clave de comercio.
Y ya está.