微信中须要获取openid,为了安全起见,采用服务器端静默受权方式,最终过程是:前端
前端页面(获取openid) -> 指定服务器端地址 -> 服务器端跳转到微信受权页 -> 微信受权页跳回服务器端 -> 服务器端跳回前端页面浏览器
在这里会存在一个问题,即微信受权返回死循环问题,由于这边前端跳转所有都是使用replace跳转,因此不会在history上再增长1一个页面,后来觉得是咱们服务器的问题,而后撇开微信直接让服务器端返回一个假的openid发现是能够返回的,因此问题出在微信的受权问题上,即:不管前端跳转是否采用replace,使用微信受权,微信自动会在浏览器增长一条页面,即跳转微信受权前的一个页面,这样的话,当用户点击返回按钮的时候,天然是返回到没有受权页,而后没有受权页根据业务逻辑再继续发起受权请求,就这样陷入了无线循环之中。安全
也思考过一些解决方式,好比使用iframe来获取openid,好比使用XMLHttpRequest来代替服务器端跳转,这些所有都行不通,因此只能在请求受权页作手脚,即判断 是否应该去获取受权页,若是是由于返回进入该页面的 则执行history.back(),不然则进入微信受权模式,可是这种方式仍是存在一个问题,即若是请求受权页自己就是首页怎么办,执行history.back()也不会让微信浏览器自动关闭,这个时候就会卡在这里,固然是可使用微信JSSDK的closeWindow()方法,可是这种方式须要等待wx.config()完成,这里涉及到从服务器端获取签名等流程,具备明显的延时状况,形成一种很糟糕的用户体验,因此最终的解决方式是:服务器
1:若是请求受权页是首页,当用户点击返回按钮的时候,仍是走受权页,即陷入无限循环套路,微信
2:若是请求受权页不是首页,则执行higtory.back() 返回上一页url
后记:接口
可是我在调查公众号返回状况的时候,依然看到不少公众号在获取到openid后能够实现完美返回,最终获得结果以下:事件
微信静默受权分为客户端静默受权和服务器端静默受权,客户端静默受权是指首先打开一个网页,而后在网页内部调用微信静默受权获取到微信openid,服务器端静默受权是指点击微信菜单按钮,而后按钮事件为click,这个时候会通知到对应分服务器端,服务器端在使用静默受权方式拿到openid后,在返回真正的客户端页面,这个时候客户端页面已经拿到了openid,iframe
在微信的菜单中博包含click和view事件,其中click是与用户交互的,好比接收用户文本消息 返回模板消息等等,而view是绑定一个url地址,click与view的不一样之处在于,点击click按钮是调用服务器端接口与服务器端进行通讯的,同时服务器端必须返回指定格式信息,而view则是直接打开绑定在菜单上的url,因此这个时候会存在三种状况打开页面it
1:用户在输入框输入地址,而后点击发送,而后点击对话框里的地址打开
2:用户点击菜单 打开url
3:用户点击模板消息里的详情打开url
第二种状况,用户点击菜单,这个时候若是菜单绑定的是服务器端接口,则服务器端接口在使用静默受权方式拿到openid后,而后跳转到真正的客户端页面同时带上openid
第三种状况,用户点击模板消息,由于模板消息属于交互,因此模板消息里面的url应该是带上openid的
第一种状况,这种状况属于非正常进入,应该给与友情提示,同时若是但愿更加友好,则可使用客户端静默受权模式获取到用户openid,而后便可正常显示页面,这个时候会存在返回循环问题,能够先跳转到首页,而后首页有进入指定页面入口,而后在指定页面会进行客户端静默受权,而后在返回的时候,判断一下,若是是返回进入的请求受权页 则执行hsitory.back()。