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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值