PHP - Variables de sesion se pierden luego de ejecutar script

 
Vista:
sin imagen de perfil
Val: 79
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion se pierden luego de ejecutar script

Publicado por Jonathan (40 intervenciones) el 24/03/2021 07:47:23
Estimados, tengo el siguiente proglema, estoy realizando pruebas para realizar ventas por intenet mediante Transbank (Chile), mi inconveniente es que luego de ejecutar el script que procesa la venta, se pierden las variables de sesion, deslogenado automaticamente al usuario al ser retornado a la pagina que muestra los reusltados de la venta o en ocaciones esto sucede en 2-3 minutos. Tengo un php llamado verify.php que comprueba que el usuario este logeado, de lo contrario se cierra la sesion. el error desaparece si no incluyo dicho archivo, pero no se porque motivo ocurre.

procesarventa.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
 
require_once '../vendor/autoload.php';include '../logica/conexion.php';
$con = new Conexion;
 
use Transbank\Webpay\Webpay;
use Transbank\Webpay\Configuration;
use Transbank\Webpay\WebPayNormal;
 
$urlRepository = "https://raw.githubusercontent.com/TransbankDevelopers/transbank-webpay-credenciales/master/";
$dirFiles = "integracion/Webpay%20Plus%20-%20CLP/597020000540";
$contentPublicCert = file_get_contents($urlRepository . $dirFiles . ".crt");
$contentPrivateKey = file_get_contents($urlRepository . $dirFiles . ".key");
$configuration = new Configuration();
$configuration->setCommerceCode(597020000540);
$configuration->setEnvironment("INTEGRACION");
$configuration->setPrivateKey($contentPrivateKey);
$configuration->setPublicCert($contentPublicCert);
$webpay = new Webpay($configuration);
$transaction = $webpay->getNormalTransaction();
 
$tokenWs = filter_input(INPUT_POST,'token_ws');
$result = $transaction->getTransactionResult($tokenWs);
$output = $result->detailOutput;
$comercio = 'WebPay';
$total = $output->amount;
$query_cantidad = $con->obtenerdatos("cantidad","escala_creditos","total = ?",array($total));
$cantidad = $query_cantidad[0]['cantidad'];
$fechaautorizacion = DateTime::createFromFormat('Y-m-d\TH:i:s.uT',$result->transactionDate);
$fechaautorizacion->setTimezone(new DateTimeZone('America/Santiago'));
$fecha = $fechaautorizacion->format('Y-m-d H:i:s');
$ordencompra = $output->buyOrder;
$codigoautorizacion = $output->authorizationCode;
$numerotarjeta = str_pad($result->cardDetail->cardNumber, 16, "X", STR_PAD_LEFT);
$idusuario = 'USER10001'
if($output->sharesNumber == 0){
	$numerocuotas = 0;
	$montocuotas = 0;
}else{
	$numerocuotas = $output->sharesNumber;
	$montocuotas = $output->sharesAmount;
}
if($output->paymentTypeCode == 'VD'){
	$tipoventa = 'Débito';
}elseif($output->paymentTypeCode == 'VN'){
	$tipoventa = 'Normal';
}elseif($output->paymentTypeCode == 'VC'){
	$tipoventa = 'En Cuotas';
}elseif($output->paymentTypeCode == 'SI' or $output->paymentTypeCode == 'S2' or $output->paymentTypeCode == 'NC'){
	$tipoventa = 'Cuotas S/I';
}elseif($output->paymentTypeCode == 'VP'){
	$tipoventa = 'Prepago';
}else{
	$tipoventa = '';
}
if ($output->responseCode == 0) {
 
	echo '	<script>
				window.localStorage.clear();
        		window.localStorage.setItem("result",JSON.stringify('.json_encode($result).'));
			</script>';
 
 
 
	$query = $con->insertar("?,?,?,?,?,?,?,?,?,?,?,?,?","creditos",array($ordencompra,$codigoautorizacion,$numerotarjeta,$numerocuotas,$montocuotas,$tipoventa,$total,$cantidad,$fecha,"Aprobada","123",$comercio,$idusuario));
 
	$query_creditos = $con->actualizar("creditos = creditos + ?","usuarios","idusuario = ?",array($cantidad,$idusuario));
}
?>
<?php if($output->responseCode == 0){?>
<form action="<?php echo $result->urlRedirection?>" method="post" id="return-form">
	<input type="hidden" name="token_ws" value="<?php echo $tokenWs;?>">
</form>
 
 
<script>
	document.getElementById('return-form').submit();
</script>
<?php }?>

ventafinal.php donde se redirige al usuario luego de aceptar la venta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php $raiz = "../"; include $raiz.'logica/verify.php'; $titulo = "Portal - Comprar Creditos"; $titulo2 = "PORTAL CRÉDITOS";include $raiz.'header2.php';?>
<div class="row">
	<div class="col-lg-6">
		<table class="table tablas table-borderless table-sm tabla_5 m-0" cellspacing="0" width="100%">
			<tbody>
				<tr><td>Orden de Compra</td><td id="precio"></td></tr>
				<tr><td>Código de Autorización</td><td id="codigoautorizacion"></td></tr>
				<tr><td>Orden de Compra</td><td id="precio"></td></tr>
				<tr><td>Orden de Compra</td><td id="precio"></td></tr>
			</tbody>
		</table>
 
		<p>Tarjeta  <span id="numerotarjeta"></span></p>
		<p>N° Orden  <span id="ordencompra"></span></p>
		<p>Tipo Pago  <span id="tipopago"></span></p>
		<p>Fecha Transacción  <span id="fechatransaccion"></span></p>
	</div>
</div>
<script>
	document.addEventListener("DOMContentLoaded", function(e) {
		let result = JSON.parse(window.localStorage.getItem("result"));
		document.getElementById('precio').innerText = result.detailOutput.amount;
		document.getElementById('codigoautorizacion').innerText = result.detailOutput.authorizationCode;
		document.getElementById('numerotarjeta').innerText = result.cardDetail.cardNumber;
		document.getElementById('ordencompra').innerText = result.detailOutput.buyOrder;
		document.getElementById('tipopago').innerText = result.detailOutput.paymentTypeCode;
		document.getElementById('fechatransaccion').innerText = result.transactionDate;
	});
</script>
<?php include $raiz.'footer2.php';?>

login.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
include 'conexion.php';
$con = new Conexion();
session_set_save_handler(new \SessionHandler());
session_start();
$error = '';
if (isset($_POST['submit'])) {
    if (empty($_POST['usuario']) || empty($_POST['clave'])) {
        $error = "Por favor ingrese un usuario y contraseña validos";
    }else{
        $usuario = $_POST['usuario'];
		$clave = $_POST['clave'];
		$datos = $con->obtenerdatos("correo,clave,nombre,apellido,sid,idusuario","usuarios","correo = ?",array($usuario));
        if (count($datos) > 0){
			$fila = $datos[0];
			$clave = $fila['clave'];
			if(password_verify($_POST['clave'],$clave)){
				date_default_timezone_set("America/Santiago");
				$_SESSION['fecha'] = date("Y-m-d G:i:s");
				$_SESSION['correo'] = $fila['correo'];
				$_SESSION['nombre'] = $fila['nombre'];
				$_SESSION['apellido'] = $fila['apellido'];
				$_SESSION['idusuario'] = $fila['idusuario'];
				$_SESSION['sesion-start'] = time();
				$_SESSION['sesion-expire'] = $_SESSION['sesion-start'] + (15 * 60);
				$sessionID = $fila['sid'];
				$actualizar = $con->actualizar("sesion_expira = ?,sid = ?","usuarios","CURRENT_TIMESTAMP > sesion_expira",array(NULL,NULL));
				(new \SessionHandler())->destroy($sessionID);
				$_SESSION['sid'] = session_id();
				$sid = $con->actualizar("sesion_inicia = ?,sesion_expira = ?,sid = ?","usuarios","correo = ?",array(date('Y-m-d H:i:s',$_SESSION['sesion-start']), date('Y-m-d H:i:s',$_SESSION['sesion-expire']), $_SESSION['sid'], $_SESSION['correo']));
				header("location: ../profile");
				exit();
			}else{
				$error = 'La contraseña ingresada no es valida';
			}
		}else{
            $error = "El usuario ingresado no existe";
        }
    }
}
?>

vefify.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
session_start();
setlocale(LC_ALL,"es_ES");
include "conexion.php";
$con = new Conexion();
if(!isset($_SESSION['correo'])){
	$con->desconectar();
	header('Location: '.$raiz.'login');
}else{
	$ahora = time();
	if($ahora > $_SESSION['sesion-expire']){
		$liberar = $con->actualizar("sid = ?","usuarios","correo = ?",array(NULL,$_SESSION['correo']));
		unset($_SESSION['fecha']);
		unset($_SESSION['nombre']);
		unset($_SESSION['apellido']);
		unset($_SESSION['sesion-start']);
		unset($_SESSION['sesion-expire']);
		$con->desconectar();
		session_regenerate_id();
		session_destroy();
		header('Location: '.$raiz.'login');
	}else{
		date_default_timezone_set("America/Santiago");
		$_SESSION['sesion-expire'] = time() + (15 * 60);
		$actualizar = $con->actualizar("sesion_expira = ?","usuarios","correo = ?",array(date('Y-m-d H:i:s',$_SESSION['sesion-expire']), $_SESSION['correo']));
		$inactivos = $con->actualizar("sesion_expira = ?,sid= ?","usuarios","CURRENT_TIMESTAMP > sesion_expira",array(NULL,NULL));
	}
}
 
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion se pierden luego de ejecutar script

Publicado por joel (1269 intervenciones) el 24/03/2021 08:27:38
Hola Jonathan, lo único que veo es que si el usuario no tiene correo, o la variable de sesión del correo esta vacía, elimina las variables de sesión del usuario.
Puede ser que el usuario que estas utilizando no tanga correo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 79
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion se pierden luego de ejecutar script

Publicado por Jonathan (40 intervenciones) el 24/03/2021 22:40:40
El usuario si tiene correo, ya que se solicita al hacer login en la página
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion se pierden luego de ejecutar script

Publicado por Jefferson (211 intervenciones) el 24/03/2021 23:05:04
Hola amigo

revisa si esta condición cumple con los formatos correctos

1
if($ahora > $_SESSION['sesion-expire'])

ambos formatos deben coincidir para poder validarse

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 79
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion se pierden luego de ejecutar script

Publicado por Jonathan (40 intervenciones) el 25/03/2021 03:20:14
Lo curioso es que en el archivo verify.php si borro todas las líneas de código y dejo solo session_start(), el problema persiste y se dejó el archivo sin nada, desaparece el error y no se pierden las variables
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar