收藏
回答

location.replace('.../oauth2/authorize?...') 没替换历史

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

微信浏览器中,前端js跳转授权无法替换历史

信息: iphone8plus,微信7.0.15

// 前端使用 
location.replace(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=...`)
// 跳转授权时,没有替换历史,其结果等同于
location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=...`
// 但是其它url却是正常替换历史的


/**
 * 微信授权 code
 * @param {object} options {redirect_uri?, scope?, state?}
 */
function authorize(options = {}{
  options.redirect_uri = options.redirect_uri || location.href

  var url = `
    https://open.weixin.qq.com/connect/oauth2/authorize
    ?appid=${authorize.appid}
    &redirect_uri=${encodeURIComponent(options.redirect_uri)}
    &scope=${options.scope || 'snsapi_userinfo' || 'snsapi_base'}
    &state=${options.state || 'STATE'}
    &response_type=code
    #wechat_redirect
  `.replace(/\s/g'')

  // weixin webview
  // location.replace 没有去掉历史
  if (
    navigator.userAgent.match(/MicroMessenger/i) &&
    !navigator.userAgent.match(/wechatdevtools/i)
  ) {
    // 【hack】 去掉一个历史 只适合前端路由
    // 【但是】第一个页面就需要授权的话,就无法去掉了
    history.back()
    setTimeout(() => {
      location.href = url
    }, 0)
  } else {
    // 在微信浏览器中,此行没有替换历史,而是直接新增了一个历史,导致两个相同的历史页,需要返回两次
    // 也是在微信浏览器中等同于 location.href = url
    // 并且只是 https://open.weixin.qq.com/connect/oauth2/authorize 这个url才会这样
    location.replace(url)
  }
}
authorize.appid = 'config rewrite'

/*
// login
if(!param('code')){
  authorize()
}

// ajax code => openid

*/



回答关注问题邀请回答
收藏

2 个回答

  • Da
    Da
    02-01

    我在企业微信自建应用的构造网页授权链接遇到了同样的问题

    02-01
    有用
    回复
  • 唱歌去旅行8
    唱歌去旅行8
    01-21

    解决了吗


    01-21
    有用
    回复
登录 后发表内容
问题标签