前段时间微信公众号上线,使用的是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日志在线上调试可以帮你轻松定位问题;