header跳转也算是经常用的,我一直知道它的特性是前边不能有输出,但是从来没注意过header后边有输出会发生什么。
这次是微信服务号的开发任务,领导给了两周时间,问题是仅有的两个php程序员都没有做过。任务包括:公司平台上的扫码登录,微信公众号的群发基本功能加上微场景、微官网,以及主站与微信平台的用户同步(数据和登录状态)。微信平台选用的是weiphp。
整个流程有四块:用户,腾讯,weiphp,平台。
规范是:用户只与平台、腾讯通信,平台只与用户、weiphp通信,weiphp只与平台、腾讯通信。相关通信均采用的curl
实施方案:
A:用户在平台选择微信登录,平台-》weiphp:带上(访客标识)参数请求oauth2.0网页授权二维码,得到后展示在页面上,用户微信扫码授权,页面跳转,登陆成功。
B:在微信里点击相关菜单链接到平台的微信页面,(是的,微官网主要页面在平台那里,可以当成平台手机页面),判断当前微信用户在平台上是否有对应帐号,如果有静默同步登录,没有则按照页面性质(是不是需要登录才能看得页面)要求用户绑定或则注册。
细节:这里有几点需要注意,具体接口对接和应用代码我就不阐述了,只说说个人遇到的一些问题
A.info:
1、二维码需要参数,必须,也就是说每次的二维码不一样,这个是用来区分用户的,用户在手机上授权,服务器就靠这个识别了,可以对比页面上的和授权过来的参数,来识别用户做相关操作;这里用到微信接口里的一个关键参数state,可以查相关文档,这里不再细说,
2、二维码展示在平台页面之后,前端需要问后端授权结果,程序需要不断检测用户授权结果,将处理结果反馈给前端。我们采用的是前端不断请求的方法,我看一些网站采用的是前端定时请求,后端不断扫描的方式,这块没来得及细化。
B.info:
1、从微信到平台页面的用户同步,我本来想的是在链接里加上用户的openid,平台的程序接到后对比一下数据库就行了(这就是惯性思维),事实上这样完全行不通,链接加在微信的菜单里,点击之后直接跳了,微信是给推送view事件了,但是完全不理会你返回的内容,直接跳转了。后来突然发现snsapi_base静默授权是可以直接获用户的openid,这个问题终于就诶决了
2、测试的时候一切正常,结果到上线的时候突然功能出问题了,什么问题呢?问题有两个:第一就是curl的过程中链接错误,我看了之后发现没错啊,链接放在地址栏是正常的。仔细排查发现链接前边多了“& # 65279;”;
3、第二就是程序要走好几次才能同步成功,这个问题问题困扰了我两天,我怀疑腾讯、怀疑curl。。。后来仔细反复测试,分析日志;发现第一同步都不成功;但是程序逻辑没错,参数每次,链接没错,从日志里把链接拿出来单独执行也没错,我终于怀疑到自认为完全没问题的header上面了,前后都排除了,不是它是谁。在header后加了exit;,果然好了
收获:header不只前边不能有输出,后边程序也要截断,否则会接着执行后边的程序,这时候就会出问题;