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日志在线上调试可以帮你轻松定位问题;


猜你喜欢

转载自blog.csdn.net/Uniquelike/article/details/65631036