我正在使用 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 中的购物车持久性?我正在寻求有关如何避免在付款过程中丢失购物车数据的建议。
此问题是由于新的浏览器 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"