1. 程式人生 > >ECShop微信端SESSION丟失問題排查

ECShop微信端SESSION丟失問題排查

前段時間微信公眾號上線,使用的是ECShop二次開發,上線後幾天,一個BUG在老闆出差住的酒店被發現,點選任何頁面都會返回到個人中心。

我們趕快自己測試發現使用公司網路訪問沒問題,4G訪問沒有問題,使用家用wifi訪問也沒有問題,唯獨老闆出差的酒店訪問有問題,真讓人費解,我猜測可能是酒店網路使用NAT的原因,網路地址轉換導致cookie丟失?或者是酒店使用代理導致cookie丟失?但是cookie丟失應該訪問註冊頁面才對啊

然後去看日誌,發現只有網路請求日誌,沒有debug日誌,只好自己重寫debug日誌了。

在日誌中發現微信內建遊覽器使用了代理,獲取不到原地址

而且代理IP地址每次都在變化,裡面有個touch_id(會話ID)每次也在變化

然而發現ECShop使用了原地址會話機制,導致只要IP更換SESSION認證就失效

因為酒店的網路非靜態IP每次請求都在改變IP就導致了SESSION失效,我們使用的家用網路和4G網路都是靜態IP所以沒有問題。

下面是請求認證方法

WechatController.class.php 裡面的一段程式碼

public static function snsapi_base(){
    if(is_wechat_browser() && ($_SESSION['user_id'] === 0 || empty($_SESSION['openid']))){
        $_SESSION['openid'] = isset($_COOKIE['openid']) ? addslashes($_COOKIE['openid']) : '';
        $wxinfo = model('Base')->model->table('wechat')->field('token, appid, appsecret, status')->find();

IP會話建立的類方法 EcsSession.calss.php
// 初始化session
self::$sess = new EcsSession(self::$db, self::$ecs->table('sessions'), self::$ecs->table('sessions_data'), C('COOKIE_PREFIX').'touch_id');
define('SESS_ID', self::$sess->get_session_id());

臨時解決方法:

獲取Cookie中的openId認證

總結

不要在複雜的網路環境中使用IP會話;

debug日誌在線上除錯可以幫你輕鬆定位問題;