偶尔无法在 cURL 后检索会话值

Not able to retrieve session values after cURL once in a while

我的自定义支付页面的支付网关 (Etisalat) 有一个奇怪的问题(这只发生在极少数人身上 - ~2%)。

这是一个小表格,客户输入金额并进行付款。

一旦用户提交了表单,就会进行支付初始化(使用 JSON)并检索交易 ID(从远程 API)。交易 ID 添加到隐藏字段,表单已完全提交。

付款过程完成后(从远程站点),它 returns 最终确定 URL 表示找不到 Session 变量。我找不到它迷路的地方。发生这种情况的浏览器不同(win10,chrome/android,chrome/win,firefox等)

我把过程放在下面。不是完整的代码。

服务器Ubuntu18,PHP7.3

//索引。 php

<form> name, email, phone amount etc. 
<input type="hidden" transactionId, uniqueId etc./>
</form>

<script>
 event.preventDefault();  

 $.ajax({ url:"PaymentInitiation.php"
 method:"POST",
 dataType:"JSON",
          success:function(data)
          $TransactionID.val(data.Transaction.TransactionID);
          $Form.attr('action', $SubmitURL).submit(); // to the paymentgateway page

</script>

//支付启动。 php

ob_start();
session_start();
checkValidation;
$_POST values
PDOConnection -> insert initial data to a new row in MySQL table. 

curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Accept:text/xml-standard-api'));
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_PORT, 2443);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonRequest ); /// An json_encode array
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/certificates/GTE CyberTrust Root.cer"); /* Location in same folder as this file */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response_curl = curl_exec($ch);
$json = json_decode($response_curl, true);

$_SESSION['TransactionID'] = $json['Transaction']['TransactionID'];
// and many lot of other values are also stored in sessions
//mail sent to admin for payment initiation notice - phpmailer

$PDOConnection = null; 

//支付完成。 php

curl_exec for Finalization with $_SESSION['TransactionID'] 

但是TransactionID为空

感谢您的关注。

原来是 SameSite cookie 的处理方式。该问题过去主要出现在 Chrome 的最新版本中,但我在其他浏览器中也看到过(尚未检查全部)。

可以通过设置PHP变量来解决, session.cookie_samesite 到“None” 和 session.cookie_secure 为真

您可以在 php.ini 或 .htaccess 或 PHP 文件中相应地设置它。我在我的 PHP 文件中使用,因为我在同一台服务器上有另一个应用程序 运行,我不想触及它。