微信小程序使用Laravel的SESSION

现在我们有一个很现实的问题,小程序的数据存储必须通过你自己服务器的HTTPS的接口存储到你自己的服务器(基于HTTPS的第三方服务器API,下面统称第三方接口)上面,但是小程序不支持cookie,这就意味着服务器不能识别每一个客户端,SESSION也随之失效。

也就是说,用户登陆小程序通过第三方接口将资料提交之后,即使第三方接口在服务器端配置了SESSION,也是没有用的,因为服务器的SESSION是通过用户提交的时候头部(header)携带的PHPSESSID来区分用户的,而PHPSESSID是存储在cookie里面的。

小程序不支持cookie,就必须找一个途径来解决这个问题。官方API文档给出了一个说明,通过第三方接口将sessionid(PHPSESSID)传给小程序客户端(一般会包含在header里面的Set-Cookie里面),然后使用wx.setStorageSync()存储到本地,然后每次发起请求(wx.request)的时候,将这个sessionid,放在header的Cookie里面提交给第三方接口。

Laravel的实现

在Laravel中,抛弃了PHP原生的SESSION,也就没有PHPSESSID,不过取而代之Laravel使用了一个等同的变量laravel_session。

所以当你在小程序登陆后,使用wx.request请求第三方接口让第三方服务器获取登陆登陆状态之后,第三方接口在返回的Response Header里面会有一个Set-Cookie值,里面包含了laravel_session,你可以使用正则表达获取(res.header["Set-Cookie"].match(/laravel_session=(.*?);/)[1])到laravel_session然后存储到本地。然后在以后的每次wx.request请求里面都添加header,携带参数laravel_session="你存储的值"。

这样就解决了小程序使用第三方接口的登陆问题。

有人说,同一个session的路由要放在同一个路由group里面:

Route::group(['middleware' => ['web']], function(){
  Route::any('login', 'LoginController@login');
  Route::get('account/info', 'AccountController@info');  
});

我是用的是Laravel 5.4,好像没有这个问题。

如果还有疑问可以 联系我

您的赞助将会支持作者创作及本站运维

评论

共3条
  1. Nixus 2018-01-18 16:34

    如果不使用session呢?
    在获取到openid、session_key后,openid保存到数据库,session_key保存到的redis,生成的session也保存到redis,用户每次操作,就延长session、session_key的有效期
    这种方式可行吗?感觉太简单,而且很不laravel

  2. mukti 2018-01-23 15:06

    直接用微信的session_key,感觉也是一种不错的思路

  3. 温远斌 2018-09-18 09:07

    谢谢楼主,laravel 后端几乎不需要做什么,前端自己构造cookie就行了

发表评论


TOP