微信公众号网页登录授权后 无法返回上一页 出现死循环?

背景:用户未登录,从A页面进入B页面,B页面进入C页面,C页面需要登录,微信授权登录成功回到B页面,点击返回会进入微信授权页。自动授权后再次进入B页面,在B页面点击返回没有回到A页面。


例子:未登录从商品列表页进入商品详情页,点击购买(购买需要登录),跳转到登陆页面,登录成功会自动返回到商品详情页。在商品详情页点击返回,会回到登录授权页重新授权。无法回到商品列表页。


期望:未登录状态从A => B => C(需要登陆),登陆成功后,在B页面点击返回能够直接回到A页面(例如:在商品详情页点击返回,能返回到商品列表页)


备注:微信授权使用的静默授权,尝试过的方案:监听手机物理返回键,监听返回按钮使用的方法是popstate与history。但是手机真机调试监听不到。


微信搜索公众号 :商城开发体验版 能够复现问题。


bug复现链接:https://mshow-cdn.01mshow.com/file/201/202007/15/20200715113544353577187.mp4


如果有需要请加微信:ahlp1012 或者 xiezhihao123


请问有没有什么方法能够解决这个问题。

navigateTo ,会有第一层 第二层 第三层 这样子,然后点返回 就是会 三退到 二 二退到一
但是重定向就不会发生这样的问题

不好意思啊。不是小程序。是微信公众号

https://developers.weixin.qq.com/community/develop/doc/0006a4e8154e88167bf90914b56c00
我知道了....你写重复了....B页面 应该有个状态
B页面 是不是只要进了 就去授权登录....
肯定死循环在这里了
如果是H5,那更好解决...你应该有session态...每次来 每次通过api去获取后台有没有登录状态,有就不操作...这样就行了

返回是微信自带的还是自己做的?

返回上一页历史记录是授权页没毛病,还有就是登录状态记录下来没有?

你用什么方法实现的?直接在页面做的判断还是用路由守卫?

授权是这样写的

返回上一页就会一直进入我圈出来的页面。

登陆状态在路由守卫里面记录的

我有一个登陆页面,要在登陆页面里点击按钮 才能去登录

点击 全部商品 三次 全都打不开。。

按照你说的 有俩可能的原因:

1.登录页面有问题 登录成功之后 没有取到登录信息 导致重新登录

2.返回的 可能是缓存 也就是登录之前的内容



不好意思啊 要点击公众号菜单栏的首页就可以进来

返回的页面是拼接在微信授权链接里面的重定向页面

location.replace使用location.href="";代替试试看

location.replace有一个特性 比如

进入A页面 然后使用location.replace替换成B页面 这个时候点击浏览器的返回 、

是回不到A页面的 就是说location.replace会删除A页面的浏览记录 换成B的记录

location.href不会这样做

还是一样的会回到授权回调的页面 就是这个

加判断

if(to.name=="订单页"){

window.location.href=newUrl

}else{

window.location.replace(newUrl)

}

你用路由 然后路由死循环了

判断我尝试过。就是判断to.path 是授权页 我就跳转到其他页面。但是在不同的页面登陆下 我想跳转的页面不一定是同一个。所以有没有什么方法可以记录下历史记录?


是的 是路由死循环了。但是我不知道怎么解决

https://blog.csdn.net/dianchou8532/article/details/101994999

首先两种判断情况

1、没有code(又分有session无session,无session重定向)

2、有code(有session,验证对否过期,过期用code换取session,无session用code换取session,就是调登录接口)

路由守卫那里贴一下代码

跟https://blog.csdn.net/dianchou8532/article/details/101994999这个不太一样。因为微信授权的回调页面已经在历史记录里面了


我点击手机的返回 跳转的地址是 https://wa1.devaqk.com/connect/oauth2/authorize?oldReferer=https%3A%2F%2Fmall-dzg.devaqk.com%2Flogin%2FwxEnd%3Frefer%3D%252Fproduct-detail%252F50731&code= 然后这个页面有一段JS代码

又跳转到了https://mall-dzg.devaqk.com/login/wxEnd?refer=%2Fproduct-detail%2F50731&code=这个地址

这里有俩问题:

1.点击返回跳转到 /connect/oauth2/authorize?oldReferer= 是否正确 注意参数是oldReferer 不是redirect_uri

2.从/connect/oauth2/authorize?oldReferer=跳转到 /login/wxEnd?refer=这个地址 逻辑是否正确?

路由守卫的代码


code丢失了?你没有记录code吗?

不好意思啊 我点击返回 没看到https://wa1.devaqk.com/connect/oauth2/authorize?oldReferer=https%3A%2F%2Fmall-dzg.devaqk.com%2Flogin%2FwxEnd%3Frefer%3D%252Fproduct-detail%252F50731&code=这个地址。请问怎么看啊



我看一下有没有记录啊。因为这个不是我写的,我没搞过授权 可能有点不太懂


就这里掉了一个接口



endLoginUrl这个地址是有问题的,你那个wxBegin那个方法哪里调用的?什么情况下调用


然后 begin 是这里调用的


这里有俩问题:

1.点击返回跳转到 /connect/oauth2/authorize?oldReferer= 是否正确 注意参数是oldReferer 不是redirect_uri(这个错了后面的全错)

2.从/connect/oauth2/authorize?oldReferer=跳转到 /login/wxEnd?refer=这个地址 逻辑是否正确?(这个错了 还可以修改)


就是说我点击返回 跳转的起始地址不是列表和详情 而是一个貌似授权的地址

一个授权的地址 跳到了/login/wxEnd?refer= 这个另一个授权的地址。。

那请问是不是从登录开始其实就有问题了?

你有没有存code的?对code做判断?

code是授权返回的是吗。我在代码里面没看见存


在上面跳转的网址里有code参数 。。

我问那个问题的原因是怕 一开始返回的地址就是错的 那后面的处理逻辑 也就都错了

我只是想确定 是开始返回的地址就是错的 还是中间跳转的过程中错了

对,拿code做判断

开始返回的地址是指 redirect_uri 这个吗。


可以做判断。但是比如我a => b , c=>d 这个时候我就不知道我要返回 a 还是返回 c

code: this.$route.query.code

code1:localStorage.getItem('code')

//两者做比较

if (!this.code && !this.code1) {

let url = ``

window.location.replace(url)

} else if(!this.code){

localStorage.setItem('code', this.code1)

history.back()

}

就是多个场景进入的话 返回的页面不一样。我不知道什么时候返回哪个页面

重定向的时候你带个参数 让你的重定向页面知道 是登录后的页面...不再去启动登录事件 不就好了吗

不是 开始返回的地址是指 点击返回按钮的时候 你期望跳转的地址是什么 ??跟我上面的一样不一样?

如果不一样的话 你知道为什么 我点击返回 跳转的是上面那个地址吗?那个地址在哪配置的?

返回跳转到的页面就是授权页。自动就重新授权了。。

那我看下是不是期望的


钉钉18061904250 说了半天 我远程给你看吧

好的 我电脑没钉钉 我先下一个

解决没有,没有加我微信dear-151指导你

授权成功回退上一个页面,然后在回退

你应该好好看一下..
wx.navigateTo
和wx.redirectTo
这两个方法
了解这两种方法的调用环境之后,你这个问题不是问题
也就是说...当你完成登录时.应该重定向..而不应该navigateBack
如果你想记录用户打开页面的历史,你可以存在wx.Storage里.
小程序很好玩的