收藏
回答

微信网页重定向之后,为什么重定向前的地址还存在还能退回重定向前的地址

      if (!code) {
        console.log('获取token,没有code去授权')
        // 本地路径
        let local = window.location.href
        let appid = 'xxxxxxx'
        // 不存在就打开下面的地址进行授权
        window.location.replace('https://open.weixin.qq.com/connect/oauth2/authorize?appid=' +
          appid +
          `&redirect_uri=${encodeURIComponent(local)}&response_type=code&scope=snsapi_base&state=type#wechat_redirect`)
      } else {
        console.log('这里是有code的')
          }
回答关注问题邀请回答
收藏

1 个回答

  • H1HAO 🇨🇳
    H1HAO 🇨🇳
    05-10
    replace在微信浏览器是和href差不多的,页面路由其实是从a跳转b(新的窗口),然后在b返回就会又回到a,而不是你设想的b直接覆盖a,这个问题我以前也研究了很久,特别的阴间
    
    当a跳转b的时候在b的页面获取到code是先重定向当前页面地址因为如果你项目的路由方式是hash的话,微信的回调地址是拼接异常的所以需要改成你正常的页面路径
    // 页面重定向
    				function pageRedirection() {
    					var path = location.href
    					const list = path.split( "#" );
    					if ( list.length > 1 ) {
    						const path = list[ 0 ];
    						const secondUrl = list[ 1 ];
    						let returnUrl = path.includes( '?' ) ? path.split( "?" )[ 0 ] : path;
    						returnUrl += '#' + secondUrl;
    						var url = returnUrl
    					} else {
    						var url = path
    					}
    					console.log( url, "授权回调,重定向页面" )
    					window.history.pushState( {}, 0, url )
    				}
    
    这一步是无感并且不会刷新页面的,然后这你可以继续执行你的code到服务器请求操作,当请求完成服务器用户注册/登录完成,然后跳转或者返回,这个时候其实你还是在b的窗口下,当你再次返回的时候才是回到a的窗口这个时候你就验证下你在b页面登录的token身份信息什么的缓存存在(代表登录成功)就调用WeixinJSBridge.call( 'closeWindow' );把页面关掉即可。
    
    整个流程就是,a页面逻辑只负责验证是否登录然后跳转授权回来后验证成功就直接关闭微信浏览器,b页面逻辑负责登录注册然后继续使用,当然a和b其实是一个页面,只是里面的逻辑根据登录情况来判断是否授权而已
    
    05-10
    有用
    回复 2
    • 有何不可
      有何不可
      09-02
      感谢解答疑问,是真的很难受这个玩意
      09-02
      回复
    • 有何不可
      有何不可
      09-02
      我用的路由是用的historry模式
      09-02
      回复
登录 后发表内容