外部付款 POST 请求后购物车会话已清除 - 付款失败时如何重新加载购物车?

问题描述 投票:0回答:1

我正在使用 Laravel-10.32.1 和 Mindscms/laravelshoppingcart- 2.1 包,在集成外部支付提供商时遇到了购物车持久性问题。 在我的 Laravel 应用程序中,我将订单总额发送给外部支付提供商进行处理。付款成功后,购物车才会被清空。但是,当用户与付款表单交互时(例如,通过单击“返回”或付款失败),购物车会意外清除。 外部支付提供商将 POST 请求发送回我的服务器,这会启动一个新会话(可能是由于请求来自外部源)。即使我在控制器中成功付款后才清除购物车,但由于 POST 请求触发的会话重置,购物车消失了,而没有调用 ::destroy。

$validPayment = $this->verifyResponse($request);

    // get the basket
    $orderId = ltrim($request->ORDER, '0');
    $order = Order::find($orderId);

    // If borica payment is successful
    if ($validPayment) {
        // update paid price
        $order->amount_paid = $request->AMOUNT;
        $order->save();

        $this->orderService->finish($order);
        $this->orderMailService->sendNotifications($order);
        // Cart is destroyed
        Cart::destroy();
        // redirect to success
        return redirect(URL::signedRoute('checkout.success', ['order' => $order->number]));
    }

    // redirect with errors
    $message = '......';
    if ($request->has('STATUSMSG')) {
        $message = $request->STATUSMSG;
    } else {
        if (array_key_exists($request->RC, $this->errorMessages)) {
            $message = $this->errorMessages[$request->RC];
        }
    }
    // Cart should not be destroyed but it is
    // redirect
    return redirect()->route('checkout.index')->withErrors([$message]);

我正在考虑的一种方法是创建一个单独的表来临时存储购物车,然后再将用户发送给支付提供商。该表将按订单号跟踪购物车内容。付款失败或会话重置后,我可以检查此表并在必要时重新加载购物车。 在处理由外部支付提供商重定向引起的会话重置时,是否有更好或更标准化的方法来处理 Laravel 中的购物车持久性?我正在寻求有关如何避免在付款过程中丢失购物车数据的建议。

php laravel session
1个回答
0
投票

此问题是由于新的浏览器 cookie 规则造成的。浏览器现在将没有 Samesite= 属性的 Cookie 声明为 samsite=LAX,而不是旧的 Samesite=None 行为

这会导致您所表现出的行为,当您通过 POST 离开一个网站到另一个网站时,为了安全起见,Cookie 会自动清除。

您需要更改代码,以便将创建的所有 cookie 创建为 samesite=None,以便在此事件发生时保留 cookie。

对于 PHP 会话 cookie(如果您使用 PHP 本身作为会话 cookie),您需要编辑 PHP.ini 并确保这 2 个选项设置如下:

session.cookie_secure = On
session.cookie_samesite = "None"
© www.soinside.com 2019 - 2024. All rights reserved.