偶尔无法在 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 文件中使用,因为我在同一台服务器上有另一个应用程序 运行,我不想触及它。
我的自定义支付页面的支付网关 (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 文件中使用,因为我在同一台服务器上有另一个应用程序 运行,我不想触及它。