Foros del Web » Programando para Internet » PHP »

Tienda online - Notificacion URL se ejecuta varias veces en una sola compra!!

Estas en el tema de Tienda online - Notificacion URL se ejecuta varias veces en una sola compra!! en el foro de PHP en Foros del Web. Buenos días: A ver si me podeis ayudar con una cosa, estoy actualizando el codigo de un par de TPV que tenemos y después de ...
  #1 (permalink)  
Antiguo 28/01/2014, 02:44
 
Fecha de Ingreso: mayo-2010
Mensajes: 19
Antigüedad: 13 años, 11 meses
Puntos: 0
Tienda online - Notificacion URL se ejecuta varias veces en una sola compra!!

Buenos días:

A ver si me podeis ayudar con una cosa, estoy actualizando el codigo de un par de TPV que tenemos y después de leer y hablar con los de ruralvía he decidido cambiar una cosa.

Los clientes dueños de la TPV se "quejaron" de que una ventana emergente "La operación se esta procesando" tapaba el contenido de la aceptación de pago con tarjeta, las 2 ventanas son generadas por ruralvía por lo que poco se podía hacer, al tapar el contenido hacía que compras no se finalizaran al usuario no ver el botón aceptar de atrás.

Antiguamente la web le cedia el control a la TPV pasandole los datos necesarios para efectuar el pago, y esta a su vez retornaba con la información de si el pago había sido exitoso o no a confirmacion_TPV que era la pagina que recogía los datos , envíaba el correo al cliente con el resultado y demás. Al taparse la ventana de aceptar un % muy alto de veces esta página nunca llegaba a ejecutarse por lo que era un problema bastante grande.

Bien, desde caja rural me dijeron que para eliminar esa ventana emergente, debería programar una pagina llamada notificacion_TPV ésta se ejecutaría automaticamente nada más efectuar el pago y que este archivo .php estaría oculto para el user, en esta ventana lo que se haría sería hacer lo que se hacia antiguamente en confirmacion_TPV (marcar pedido en la base de datos, enviar correo y demás), por lo que confirmacion_TPV (si visible por el usuario) simplemente sería una página de informacion de cara al usuario, pero que a nivel operacional no haría nada.


Todo esto te lo cuento porque en una de las 2 tiendas online todo fué perfecto, pero hay una de las 2 que por algún motivo la página notificacion_TPV se me "buclea" unas 3-4 veces, siempre ese número exacto y es que es imposible porque no hay ningún for, while ni ninguna sentencia de bucle, esto conlleva el problema de que envía 3-4 correos, intenta meter el producto 3-4 veces en la base de datos etc etc, he hablado con los de ruralvia pero me dicen que esa página no tiene nada de especial para tener ese comportamiento, me he asegurado de quitar todo lo que tenga que ver con flujo de salida de datos ya que es una página oculta para el usuario, pero así se me buclea..

Había pensando que igual el usuario le diera varias veces al botón de comprar, pero es que pase siempre.. nose.. aparte si fuera así no sabría decirle que sólo lo haga una vez, con una variable global booleana.. o como porque tengo miedo que se ponga a comprar justo detrás en la misma sesion y no le funcione.

Se que hace el bucle porque tengo salidas a un fichero de texto con eventos a modo de checkpoint para saber una traza de por donde va, y se que se llega a ejecutar hasta el final del codigo , pero por algún motivo cuando acaba vuelve a ejecutar el php entero.

El codigo le he quitado llamadas y funciones a demas para dejarlo todo en el mismo archivo .php

¿Alguien puede saber el motivo?

El codigo de notificacion_TPV

Código PHP:
Ver original
  1. <?php session_start();
  2.     ini_set('arg_separator.output', '&amp;');
  3.     ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,input=src,fieldset=');
  4.    
  5.     @include_once("inc/funciones.inc.php");
  6.     @include_once("inc/declaraciones.php");
  7.    
  8.     //Variables generales
  9.     $error=0;                          
  10.     $mensaje="";   
  11.     $file = fopen("logTPV.txt", "a+");  //fichero donde se guardará
  12.  
  13.     /********************** GESTION TRANSFERENCIA ******************************/
  14.     // Valores constantes del comercio 
  15.     $fuc=xxxxx;
  16.     $idterminal=xxx;
  17.     $idioma=x;
  18.     $CIP=xxxxxxx;
  19.     $moneda=978;   
  20.     $name='xxxxxxxxxxxxxxx';
  21.     $url='http://xxxxx/confirmacion_tpv.php'; //URL destino
  22.  
  23.     //Valores recibidos
  24.     $importe = $_GET['importe'];
  25.     $compra = $_GET['compra'];
  26.     $moneda = $_GET['moneda'];
  27.     $numpedido = $_GET['numpedido'];
  28.     $fecha = $_GET['fecha'];
  29.     $fentrega = $_GET['fentrega'];
  30.     $firma = $_GET['firma'];
  31.  
  32.     $mensaje = $_GET['Ds_Amount'].$_GET['Ds_Order'].$_GET['Ds_MerchantCode'].$_GET['Ds_Currency'].$_GET['Ds_Response'].$clave;
  33.    
  34.     $sha = new SHA;
  35.  
  36.     fwrite($file, "CODIGO PAGO: ".$numpedido."\r\n");      
  37.     fwrite($file, "FECHA PAGO PEDIDO: ".$fecha."\r\n");
  38.     fwrite($file, "FECHA ENTREGA: ".$fentrega."\r\n");
  39.     fwrite($file, "IMPORTE: ".$importe."\r\n");
  40.     fwrite($file, "ESTADO PEDIDO A NO PAGADO POR DEFECTO \r\n");
  41.     $sql = "UPDATE tienda_pedidos SET estado ='3' WHERE num_pedido = '".$numpedido."'";
  42.     ejecutarSQL($sql);
  43.        
  44.    
  45.     if ($compra=="si"){
  46.         fwrite($file, "COMPRA = SI, ponemos estado a PAGADO \r\n");
  47.         $cadena = '0'.$CIP.$numpedido.$importe.$fecha;
  48.         $digest1 = $sha->hash_string($cadena);
  49.         $calculo_firma = $sha->hash_to_string( $digest1 );
  50.        
  51.         $sql = "UPDATE tienda_pedidos SET estado ='2' WHERE num_pedido = '".$numpedido."'";
  52.         ejecutarSQL($sql);
  53.        
  54.         // DESCONTAR STOCK
  55.         $id_pedido = dame_valor("id","tienda_pedidos",1,1, " AND num_pedido LIKE '".$numpedido."'");   
  56.         $_SESSION["id_pedido"] = $id_pedido;
  57.        
  58.         $lineas = new objeto("id,entidad,identificador,titulo,precio,cantidad,imagen","tienda_pedidos_lineas",1,1,"AND id_pedido='".$id_pedido."'");
  59.  
  60.         $total_precio = 0;
  61.        
  62.    
  63.        
  64.     }
  65.     else{
  66.         if ($compra=="no"){
  67.             fwrite($file, "COMPRA = NO \r\n");
  68.             $cadena = '1'.$CIP.$numpedido.$importe.$fecha;
  69.             $digest1 = $sha->hash_string($cadena);
  70.             $calculo_firma = $sha->hash_to_string( $digest1 ); //firma generada no fraudulenta tiene que coincidir con $firma (esto se hace para evitar que introduzcan la URL de compra exitosa directamente sin pagar)           
  71.         }
  72.         else{
  73.             fwrite($file, "COMPRA = INDETERMINADO \r\n");
  74.             $error=1;
  75.         }
  76.     }
  77.    
  78.     /***************** FIN GESTION TRANSFERENCIA ******************************/
  79.        
  80.  
  81. //Comprobamos si la firma es valida => respuesta del tpv del banco autentica
  82. if ($calculo_firma==$firma){
  83.     fwrite($file, "CALCULO FIRMA = FIRMA, OK \r\n");
  84.     if ($compra == "si") {
  85.         fwrite($file, "COMPRA = SI, DENTRO DE FIRMA, OK \r\n");
  86.    
  87.        
  88.         if(!$error){
  89.            
  90.             //Destruimos la variable carrito de sesión
  91.            include("apps/carrito/resumen_mail.php");
  92.            
  93.        
  94.            
  95.            
  96.            /*FIN ENVIO CORREO */
  97.            
  98.             //unset($_SESSION['carrito']);                                     
  99.             //unset($_SESSION["id_pedido"]);
  100.             fwrite($file, "TODO OK,ENVIAMOS CORREO \r\n");                         
  101.         }
  102.     }else{
  103.             fwrite($file, "COMPRA = NO, DENTRO DE LA FIRMA, FALLO \r\n");
  104.             //unset($_SESSION['carrito']);                                     
  105.             //unset($_SESSION["id_pedido"]);
  106.            
  107.     }
  108. }else{
  109.     fwrite($file, "CALCULO FIRMA NO COINCIDE CON FIRMA, FALLO \r\n");
  110.  echo "Error calculo firma";
  111.  }
  112.  
  113. //$carro = new carrito("carrito");
  114. //$carro->vaciar();
  115. //unset($_SESSION["id_pedido"]);
  116. fwrite($file, "CERRAMOS LA COMPRA \r\n");
  117. fclose($file);
  118. exit();
  119.  
  120. //Implementacion de la clase SHA
  121. ?>

Gracias.

Saludos

Última edición por alfredo49; 28/01/2014 a las 03:05
  #2 (permalink)  
Antiguo 28/01/2014, 06:38
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 9 meses
Puntos: 27
Respuesta: Tienda online - Notificacion URL se ejecuta varias veces en una sola compr

para mi el problema esta en la pagina que hace el llamado a notificacion_TPV.

veo que guardas en un archivo los pasos de la operacion.
Como se guardan?

PASO1
PASO2
PASO3
PASO4
PASO1
PASO2
PASO3
PASO4

O

PASO1
PASO1
PASO2
PASO2
PASO3
PASO3
PASO4
PASO4
  #3 (permalink)  
Antiguo 29/01/2014, 10:27
 
Fecha de Ingreso: mayo-2010
Mensajes: 19
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Tienda online - Notificacion URL se ejecuta varias veces en una sola compr

No no, se guardan
PASO 1
PASO 2
PASO 3
PASO 4
PASO 1
PASO 2
PASO 3
PASO 4
..........

Se ejecuta la pagina entera recursivamente

Etiquetas: ejecuta, tienda, url, variable, veces
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:00.