微信公众平台 session 不起作用,无法正常使用 session 保存微信公众号的会话状态,微信公众号每次的 session id 都不一样,是因为微信用户发送的消息经由微信服务器上载到公众号服务器,公众号服务器发出的消息又经由微信服务器转发到微信用户的客户端(手机、平板、电脑……)中,在这个过程中,微信服务器没有传递 cookie 信息,session 会话离不开 session id(会话ID)。
正常情况下,session id 以 cookie 的形式保存在用户的客户端(比如浏览器)中,session cookie 的名称因服务器软件而存在差异,PHP 默认存储 session id 的 cookie 名称是 PHPSESSID,服务器根据 session id 来判断两次请求是否是同一会话,也就是说,只要 session id 保持不变,并且 session 还在有效期,服务器就认为是同一次会话。
对 PHP 而言,可以在调用 session_start() 开启会话之前调用 session_id($sessionId) 手动将 session id 设置为 $sessionId,只要 session id 不变,就能够实现会话控制,需要注意的是 session id 的值有一定的限制,比如文件会话管理器只允许 session id 包含 a-z A-Z 0-9 和英文状态的逗号和减号,所以,如果对于具体的某个用户,它的某个属性值是固定不变的,就可以以这个属性值为依据生成session id,为了保证 session id 有效,可以使用 md5 或者 sha1 等加密函数将这个属性值加密转码,将转码后的字符串作为 session id.
具体到微信公众号,每个微信用户对于指定的公众号来说,他的 open id 是固定不变的,并且每次微信服务器转发消息过来的时候都会带上用户的 open id.
需要注意的是,如果需要手动为请求设置 session id,必须关闭 PHP session 的严格模式,即将 session.use_strict_mode 设置为 0,并且在 session_start() 前调用 session_id() 手动设置 session id,否则每次请求都会自动产生一个新的 session id,session_id() 不带参数会返回当前 session id,带参数是手动设值。
在设置 session.use_cookies 为 0 以后,PHP不会将 session id 保存在 cookie 中,但是我们可以通过程序代码手动设置一个值为 session id 的 cookie,这样就可以在没有经过微信服务器的地方得到用户的 session 信息了。
- <?php
- ini_set('session.use_strict_mode', 0);//关闭严格模式
- ini_set('session.use_cookies', 0);//禁止通过cookie传递session id
- //获取open id比较简单,就不再赘述了……
- //微信公众号scywzh,假设 $openId 为从微信服务器得到的用户 open id.
- $sessionId = md5($openId);
- session_id($sessionId);
- session_start();
- //下面就可以像平常一样该干嘛干嘛了...
- ?>
复制代码 |
|