【问题标题】:Chrome loses my session data when returning from the payment gateway从支付网关返回时,Chrome 丢失了我的会话数据
【发布时间】:2020-12-18 22:01:59
【问题描述】:

自 8 月初以来,我的用户目前在使用 Chrome 向 Moneris 付款时都会丢失会话。它在 Firefox 下运行良好。代码几年来一直没有改变,一切都是自动开始的。

支付“summary.php”页面首先调用网关URL,然后在交易完成后返回“return.php”页面。此返回页面仅包含一个表单,该表单获取交易密钥并将其发送回网关以进行验证:

<?php
    session_start();
?>
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <script>
            function verify_transaction() {
                document.getElementById('verify').submit();
            }
        </script>
    </head>
    
    <body onload="verify_transaction()">
        <form id="verify"  name="verify" action="https://www.gateway.com/verify.php" method="post">
            <input type="hidden" name="ps_store_id" value="abcdef">     
            <input type="hidden" name="hpp_key" value="abcdef">
            <input type="hidden" name="transactionKey" value="<?php echo $_POST['transactionKey'] ?>">
        </form>
    </body>
</html>

这里的问题是调用此页面时所有会话数据都消失了。我也无法将会话存储在任何地方,因为网关无法将我开始发送的信息发回给我。

恐怕这可能与 Chrome 的 7 月版本有关,该版本在 cmets 中有以下内容: “Same Site Cookie 政策更改再次开始推出”

8 月版本也是如此: “拒绝不安全的 SameSite=None cookie”,但我不知道如何/在哪里解决这个问题。

网站托管在 CPANEL 上,我确保用户一直使用 HTTPS。

有人有什么建议吗?

编辑:

我刚刚注意到,当我登录和退出网站时,我会收到很多这样的信息:

“与https://google.com/ 处的跨站点资源关联的 cookie 被设置为没有 SameSite 属性。它已被阻止,因为 Chrome 现在只提供带有跨站点请求的 cookie,如果它们设置为 SameSite=NoneSecure。您可以在开发者工具中的Application>Storage>Cookies 下查看cookie,并在https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032." 上查看更多详细信息

【问题讨论】:

  • $_POST['transactionKey'] 实际上不是会话变量,而是来自 POST 请求的属性,它会将用户发送到此页面。您能否在您的 Chrome 开发人员工具中检查请求(在网络选项卡下)并查看发送至 return.php 的请求的确切详细信息?
  • 也启用错误报告。
  • 很抱歉,我错误地说 POST 是会话的一部分!所以在这种情况下,我实际上能够从网关获取 transactionKey 并将其发送回,但此时对用户会话的任何引用都消失了。
  • 也许您在往返支付网关时也会发送会话 ID。 (虽然你应该可以解决cookie问题,但还没有真正开始自己调查问题)
  • 我能够使用 Chrome 在 3 个使用 2 个独立支付网关的独立站点上完全重现这一点。当支付网关在成功/拒绝回发后返回站点时,就好像会话丢失了。似乎只影响 Chrome

标签: javascript php forms session payment-gateway


【解决方案1】:
<?php
session_start();
if(isset($_POST['transactionKey'])) {
    $_SESSION['transKey'] = $_POST['transactionKey']; 
}
?>

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <script>
            function verify_transaction() {
                document.getElementById('verify').submit();
            }
        </script>
    </head>
    
    <body onload="verify_transaction()">
        <form id="verify"  name="verify" action="https://www.gateway.com/verify.php" method="post">
            <input type="hidden" name="ps_store_id" value="abcdef">     
            <input type="hidden" name="hpp_key" value="abcdef">
            <input type="hidden" name="transactionKey" value="<?php echo $_SESSION['transKey']; ?>">
        </form>
    </body>
</html>

验证后销毁会话。

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2020-07-14
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多