微信静默授权返回问题

微信中需要获取openid,为了安全起见,采用服务器端静默授权方式,最终过程是:

前端页面(获取openid) -> 指定服务器端地址 -> 服务器端跳转到微信授权页 -> 微信授权页跳回服务器端 -> 服务器端跳回前端页面

在这里会存在一个问题,即微信授权返回死循环问题,因为这边前端跳转全部都是使用replace跳转,所以不会在history上再增加1一个页面,后来以为是我们服务器的问题,然后撇开微信直接让服务器端返回一个假的openid发现是可以返回的,所以问题出在微信的授权问题上,即:无论前端跳转是否采用replace,使用微信授权,微信自动会在浏览器增加一条页面,即跳转微信授权前的一个页面,这样的话,当用户点击返回按钮的时候,自然是返回到没有授权页,然后没有授权页根据业务逻辑再继续发起授权请求,就这样陷入了无线循环之中。

也思考过一些解决方式,比如使用iframe来获取openid,比如使用XMLHttpRequest来代替服务器端跳转,这些全部都行不通,所以只能在请求授权页做手脚,即判断 是否应该去获取授权页,如果是因为返回进入该页面的 则执行history.back(),否则则进入微信授权模式,但是这种方式还是存在一个问题,即如果请求授权页本身就是首页怎么办,执行history.back()也不会让微信浏览器自动关闭,这个时候就会卡在这里,当然是可以使用微信JSSDK的closeWindow()方法,但是这种方式需要等待wx.config()完成,这里涉及到从服务器端获取签名等流程,具有明显的延时情况,造成一种很糟糕的用户体验,所以最终的解决方式是:

1:如果请求授权页是首页,当用户点击返回按钮的时候,还是走授权页,即陷入无限循环套路,

2:如果请求授权页不是首页,则执行higtory.back() 返回上一页

 

后记:

但是我在调查公众号返回情况的时候,依然看到很多公众号在获取到openid后可以实现完美返回,最终得到结果如下:

微信静默授权分为客户端静默授权和服务器端静默授权,客户端静默授权是指首先打开一个网页,然后在网页内部调用微信静默授权获取到微信openid,服务器端静默授权是指点击微信菜单按钮,然后按钮事件为click,这个时候会通知到对应分服务器端,服务器端在使用静默授权方式拿到openid后,在返回真正的客户端页面,这个时候客户端页面已经拿到了openid,

在微信的菜单中博包含click和view事件,其中click是与用户交互的,比如接收用户文本消息 返回模板消息等等,而view是绑定一个url地址,click与view的不同之处在于,点击click按钮是调用服务器端接口与服务器端进行通信的,同时服务器端必须返回指定格式信息,而view则是直接打开绑定在菜单上的url,所以这个时候会存在三种情况打开页面

1:用户在输入框输入地址,然后点击发送,然后点击对话框里的地址打开

2:用户点击菜单 打开url

3:用户点击模板消息里的详情打开url

 

第二种情况,用户点击菜单,这个时候如果菜单绑定的是服务器端接口,则服务器端接口在使用静默授权方式拿到openid后,然后跳转到真正的客户端页面同时带上openid

第三种情况,用户点击模板消息,因为模板消息属于交互,所以模板消息里面的url应该是带上openid的

第一种情况,这种情况属于非正常进入,应该给与友情提示,同时如果希望更加友好,则可以使用客户端静默授权模式获取到用户openid,然后即可正常显示页面,这个时候会存在返回循环问题,可以先跳转到首页,然后首页有进入指定页面入口,然后在指定页面会进行客户端静默授权,然后在返回的时候,判断一下,如果是返回进入的请求授权页 则执行hsitory.back()。

你可能感兴趣的:(微信静默授权返回问题)