重定向到外部网站时,Laravel 会话不持久

Posted

技术标签:

【中文标题】重定向到外部网站时,Laravel 会话不持久【英文标题】:Laravel Session is not persisting when redirecting to external website 【发布时间】:2014-08-17 20:50:53 【问题描述】:

我将以下数组分配给 transactionInfo。

        $transactionDetails=[
            'amount' => $total,
            'description'=>$description,
            'notify_url'=>'http://url.com/paypal/log',
            'headerImageUrl'=>'http://url.com/img/bhi_logo.png',
            'brandName'=>'Name',
            'encodedTestIDs' => serialize($payForTestID),
            'returnUrl' => 'http://url.com/payment/return', 
            'cancelUrl' => 'http://url.com/payment/cancel' 
        ];
        Session::put('transactionInfo',$transactionDetails);

如果我重定向到网站上的另一个页面,我可以使用

拉取数组
Session::get('tranactionInfo');

但是,如果我重定向到 PayPal 以收取付款,然后 PayPal 将用户重定向回我的站点,则会话变量为空。

这是 PayPal 返回的路线:

Route::any('/payment/return',function()
  if(Session::has('transactionInfo'))
      echo 'what is happening?';
  
    //Session::flush();
    dd(Session::get('transactionInfo')); die;
    );

【问题讨论】:

您是否在您的 PayPal 账户中设置了即时付款通知? IPN Information 这与 IPN 无关,虽然我已经设置了。我的问题是在 Laravel 中,我正在为会话分配一个数组,将买家发送到贝宝,一旦他们被贝宝返回,无论出于何种原因,该会话数组为空。 【参考方案1】:

我不确定为什么 Laravel 不会持久化会话数据。

不过,解决此问题的另一种方法是在重定向到 PayPal 之前将交易数据存储在您的数据库中。你可以在你的 returnUrl 中引用 transactionId,就像我在这里描述的那样:

CodeIgniter custom value with omnipay

【讨论】:

【参考方案2】:

只是一个快速提示:使用 Laravel 自己的重定向方法代替 $response->redirect() 在重定向响应之前设置会话数据。

简而言之:线索是Omnipay\Common\Message\AbstractResponse 中的redirect() 方法,由Omnipay\PayPal\Message\Response 扩展。它使用 HttpResponse 和 POST 和 HttpRedirectResponse 和 GET。通过HttpResponse,您的会话将在重定向之前存储,但官方 PayPal 网关使用 GET,因此您必须转移它。

Laravel 4:return Redirect::url($response->getRedirectUrl()) Laravel 5:return redirect()->url($response->getRedirectUrl())

【讨论】:

以上是关于重定向到外部网站时,Laravel 会话不持久的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.8 中会话过期时重定向到其他路由

作者会话的 Laravel 更改重定向部分过期

当用户会话处于活动状态时使用 Laravel 5.7 中的 Auth 重定向到页面的方法

使用Laravel 5.7中的Auth激活用户会话时重定向到页面的方法

laravel 4.2在重定向时重新生成会话

如何在laravel 5.5中会话时自动重定向到登录页面