微信公众平台session无效的原因及实现思路

Nokia 发表于 2016/5/16 00:03 | 显示全部楼层 |阅读模式
微信公众平台session不能正常使用,每次的session id都不一样,是因为微信用户发送的消息经由微信服务器上载到公众号服务器,公众号服务器发出的消息又经由微信服务器转发到微信用户的客户端(手机、平板、电脑……)中,在这个过程中,微信服务器没有传递cookie信息,session会话离不开session id(会话ID),正常情况下,session id以cookie的形式保存在用户的客户端(比如浏览器)中,cookie名字因服务器软件而存在差异,PHP默认存储session id的cookie名称是PHPSESSID,服务器根据session id来判断两次请求是否是同一会话,也就是说,只要session id保持不变,并且session还在有效期,服务器就认为是同一次会话。
针对PHP而言,可以在调用session_start();之前调用session_id($sessionId)手动修改session id,只要能够保证session id不变,就能够实现会话控制,需要注意的是session id的值有一定的限制,比如文件会话管理器只允许session id包含a-z A-Z 0-9 和英文状态的逗号和减号,所以,如果对于具体的某个用户,它的某个属性值是固定不变的,就可以以这个属性值为依据生成session id,为了保证session id有效,可以md5()这个属性值,将md5()返回的字符串作为session id.

具体到微信公众号,每个微信用户的open id是固定不变的,并且每次微信服务器转发消息过来的时候都会带上用户的open id.

需要注意的是,如果需要手动设置session id,session_id()必须在session_start()前调用,否则每次请求都会自动产生一个新的session id,session_id()不带参数会返回当前session id,带参数是手动设值。
在设置session.use_cookies为0以后,PHP不会将session id保存在cookie中,但是我们可以通过程序代码手动设置一个值为session id的cookie,这样就可以在没有经过微信服务器的地方得到用户的session信息了。
  1. <?php
  2.         ini_set('session.use_cookies', 0);//禁止通过cookie传递session id
  3.         //获取open id比较简单,就不再赘述了……        
  4.         //微信公众号scywzh,假设$openId为从微信服务器得到的用户open id.
  5.         $sessionId = md5($openId);
  6.         session_id($sessionId);
  7.         session_start();
  8.         //下面就可以像平常一样该干嘛干嘛了...
  9. ?>
复制代码

手机版|轻松E站

E-mail: OHCC@163.COM

快速回复 返回顶部 返回列表