微信公众平台可以通过接口获取用户的openid,但是获取用户信息的时候需要做一次跳转。
我在后台有一张用户表,用户如果关注了公众平台就将他的信息录入到数据库,包括openid。现在要做一个简单的系统,用户参加某些活动可以获得积分,积分可以兑换成金币,所以在页面中需要使用openid来标识每一个用户。
现在的问题是,活动有好几个页面,每个页面都需要用到openid,并且无法限定用户从哪个页面进入,想请问有没有办法将用户openid存储起来,在不同页面之间传递?
ps: session这种方式是不行的,微信浏览器对session的支持有问题,我抓包做过测试
微信对session的支持没有任何问题,session也不是存在微信上面的。真正有问题的是微信对cookie的支持,微信上面保存的所有cookie信息都是临时的,退出微信再重新打开就会导致cookie丢失,自然会导致session失效。
在一次会话内完全可以使用session保存用户的openID,如果是在多个域名之间跳转的话最好是在一个主域名的不同二级域名下,写cookie的时候设置好domain参数就可以;跨主域名的话会比较麻烦,一般也没有必要。
放redis这种缓存里
获取用户信息的时候需要网页授权,网页授权有静默授权(snsapi_base)和用户可感知的授权(snsapi_userinfo)
你只要openid的话用静默授权就可以了
静默授权流程:
用户打开你的页面-》跳转到微信授权页面-》跳转到你设定的页面并能够拿到code-》根据code拿到OpenId
拿到openid之后你可以保存到session,这个是绝对没问题的~
你先做一下检查:
1.确定下否真的拿到了OpenId
2.查看下服务端是否有保存session数据?
3.页面跳转比较多,最后session是保存在哪个域,这个要确定!
可能出现的问题:
因为PHP的session需要客户端的cookies来配合(保存PHPSESSID),如果客户端禁用了cookies,你可以把PHPSESSID放到URL里面进行传递或者写到html的header里面
如果活动人数不是很多,可以使用网页授权的方式去获取OpenId
以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的
无论用户从哪个页面进来,你都可以通过这种方式获取用户的OpenId。如果你需要在用户进入页面之后,将用户的openId在各个页面中传递,我记得PHP有个全局变量_global,各个页面贡献该变量,或者放在redis
不过在java中可以将变量放在ThreadLocal中,这样可以唯一确定是哪个用户,不知道PHP有没有类似的方法。如果多个用户同时进入,你要实现OpenId在各个页面传递,怎么标识唯一的用户
session是没问题的,可能是你哪出错了,还有另一种解决方案是用HTML5的本地存储localstorage,存Cookie也是一种办法
很奇怪你说的最后那句,微信内置浏览器对session支持有问题,那这么多跑在微信里的网站都是怎么工作的。
微信支持session没问题的**
通过一条图文回复,然后url连接里带上OPENID,这样连接到页面就可以了.
来,拿好:https://github.com/thenbsp/wechat/blob/master/example/oauth.php