在其他网站 (mercadopago.com) 上完成付款后 PHP 会话被破坏
Posted
技术标签:
【中文标题】在其他网站 (mercadopago.com) 上完成付款后 PHP 会话被破坏【英文标题】:PHP session destroyed after finishing payment on other site (mercadopago.com) 【发布时间】:2021-12-26 23:01:04 【问题描述】:我有一个使用 mercadopago 付款的网站(类似于 PayPal,来自南美)。
当用户完成付款并被重定向回我的网站时,我会得到一个新的会话 ID,但我无法读取旧的会话 ID,也无法读取之前设置的 cookie。
我的问题是我需要 cookie 或会话值来保持用户登录,如果没有,我需要再次询问用户和密码,而客户端不喜欢这样。
这是我用来设置 cookie 的代码,cmets 解释了我的问题:
<?php
session_start();
include("db-connection.php");
if(isset($_SESSION["id_alumno"]))
$sid=session_id();
if(isset($_COOKIE["user_token"]))
//just for debbuging
//echo "user_token is a " . $_COOKIE["user_token"];
else
//set cookie and update same value in database
setcookie("user_token", $sid, time()+2*24*60*60);
$id_alumno=$_SESSION["id_alumno"];
$sql="UPDATE `alumno` SET `login_token` = '$sid', `login_creado` = NOW() WHERE `alumno`.`id` = '$id_alumno'";
$res=mysqli_query($link, $sql); //this connection values are send in a db-connection.php already included.
else
$cookie_value=$_COOKIE["user_token"]; // here is my problem, I can't access this value, checking cookie information using chrome and the plugin web developer, I get 2 PHPSESSID (old which was used to set cookie with user_token, and also the user token value, and also this new PHPSESSID)
if(isset($cookie_value))
$sql="SELECT * FROM alumno where login_token='$cookie_value' and login_token!='no'";
$res=mysqli_query($link, $sql);
if($reg=mysqli_fetch_array($res))
//here I can login back the user
//mysql query
//if isset cookie value
?>
【问题讨论】:
【参考方案1】:您正在使用 session_start() 及其默认选项。一旦您离开您的网站,会话 cookie 就会过期。
试试手册中的example #3:
<?php
// This sends a persistent cookie that lasts a day.
session_start([
'cookie_lifetime' => 86400,
]);
?>
这会发送一个持续一天的持久性 cookie。
另见:How do I create persistent sessions in PHP?
【讨论】:
@SebastianOcaño 我不太确定你在说什么,但你的代码中的逻辑也有点不对劲。您永远不会设置$_SESSION["id_alumno"]
值,因此您永远无法设置 user_token
cookie。我不知道你对这些东西的意图是什么,所以我无法纠正。
谢谢,我试过了,我发现了问题,在支付网站上创建的重定向链接错误,我使用的是带有 www 的网站。关于重定向和之前的付款流程没有使用 www,所以改变它,它现在运行良好。非常感谢您的回答。
关于$_SESSION["id_alumno"],它是在用户登录成功后设置的,在不同的页面中,这里只是检查是否存在。以上是关于在其他网站 (mercadopago.com) 上完成付款后 PHP 会话被破坏的主要内容,如果未能解决你的问题,请参考以下文章