微信公众号授权获取code无限循环跳转页面,清理地址栏的code,重定向处理

文章讲述了在微信公众号开发中遇到的授权问题,如何处理获取授权后的code重复以及openid获取失败的情况,通过重定向清理和正确使用code进行解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、微信公众号获取授权

出现的坑:只做授权之后微信公众号一直在回调微信接口,导致有很多的code,需要判断是否有code值出现

完整代码:

<template>
  
  <RouterView />

</template>

<script setup>
import { onBeforeMount } from 'vue';
import $api from '@/api/index.js';

const APPID='wx000000000111000';


async function getOpen() {
  const local = window.location.href;
  sessionStorage.setItem('local', local)//这个地方存用户点击过来的地方方便做重定向处理

  let url = 
  'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + APPID + '&redirect_uri=' + encodeURIComponent(local) + '&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect'

  if (window.location.href.indexOf('code=') != -1) { // 避免一直重复重定向无限获取code
    let code = await getUrlName('code') // 从url中获取code的值
    if (code == sessionStorage.getItem('code')) { // 微信获取code会重定向,所以从别的页面返回本页后,返回的其实是重定向之后的url,此时url一定带有上次的code,code只能用一次,这时候要重新获取
      let urls = await deUrlParam(window.location.href, ['code']) // 从url中删除code
      window.location.href = urls
    }
    sessionStorage.setItem('code', code)
  } else {
    window.location.href = url
  }
}
//从url中获取指定参数的值
const getUrlName=(paramName)=> {
  const url = window.location.href;
  const regex = new RegExp(`${paramName}=([^&]*)`);
  const match = regex.exec(url);
  if (match) {
    return match[1];
  } else {
    return null;
  }
}
//删除URL中指定search参数,会将参数值一起删除,返回没有该参数的完整url
const deUrlParam=(url, params)=> {
  /**
   * 删除URL中指定search参数,会将参数值一起删除
   * @param {string} url 地址字符串
   * @param {array} aParam 要删除的参数key数组,如['name','age']
   * @return {string} 返回新URL字符串
   */
  for (var index = 0; index < params.length; index++) {
    var item = params[index];
    var fromIndex = url.indexOf(item + "="); //必须加=号,避免参数值中包含item字符串
    if (fromIndex !== -1) {
      // 通过url特殊符号,计算出=号后面的的字符数,用于生成replace正则
      var startIndex = url.indexOf("=", fromIndex);
      var endIndex = url.indexOf("&", fromIndex);
      var hashIndex = url.indexOf("#", fromIndex);

      var reg = "";
      if (endIndex !== -1) {
        // 后面还有search参数的情况
        var num = endIndex - startIndex;
        reg = new RegExp(item + "=.{" + num + "}");
        url = url.replace(reg, "");
      } else if (hashIndex !== -1) {
        // 有hash参数的情况
        var num = hashIndex - startIndex - 1;
        reg = new RegExp("&?" + item + "=.{" + num + "}");
        url = url.replace(reg, "");
      } else {
        // search参数在最后或只有一个参数的情况
        reg = new RegExp("&?" + item + "=.+");
        url = url.replace(reg, "");
      }
    }
  }
  var noSearchParam = url.indexOf("=");
  if (noSearchParam === -1) {
    url = url.replace(/\?/, ""); // 如果已经没有参数,删除?号
  }
  return url;
}

 getOpen()

</script>
<style lang="scss" scoped>

</style>

参考:h5登录微信获取code和openId h5获取code一直循环回退 微信登录获取code 微信登录重定向重复获取code_vue微信公众号跳转h5一直携带code跳转的解决_爱喝冰可乐的博客-CSDN博客

2、项目上线了一段时间发现一个新bug,有的人拿不到openid,找了好久的原因,最后找到一个方案。

 2.1、openid拿不到是因为code请求了多次,至于原因嘛,我估计是页面可能多次请求了,但是在调试过程中只请求了一次。

还发现在拿到回调的链接时会一直在这个地方,如果多次刷新会多次请求,所以解决这个问题就ok了

window.location.href='http://你的链接.html'

 授权之后拿到openid重新定义一下地址栏,清理干净之后就正常了

2、重定向处理 

注:在通过接口拿到openid之后需要跳转页面可从之前存的缓存里面获取,然后在定义跳转的时候重新定义跳转路由

const getOpenId = (code)=>{//获取openid
  $api.getCallbackOpenid({code:code}).then(res=>{
    if(res.code===0){
      let user=JSON.parse(res.data);
      if(user) if(user.openid){
        let pathSess=sessionStorage.getItem('local');
        if(pathSess){
          if(pathSess.split('#').length>1){
//不是所有页面都有#,这个地方是因为我的路由模式是createWebHashHistory这个要注意,不是这个模式的判断需要根据你的url去做处理
            let path=pathSess.split('#')[1];
            sessionStorage.setItem('path',path);
            window.location.href=`http://xxx.com/index.html#${path}`;
          }
        }else{
          window.location.href='http://xxx.com/index.html'
        }
         
      }
    }
  })
}

### 回答1: 微信code获取开发文档是指微信提供的针对H5调用微信授权获取code的文档,用于帮助开发者了解和使用微信授权功能。 微信授权是指用户在微信客户端中对第三方应用授权授权后第三方应用可以通过用户的code获取用户的基本信息,例如昵称、头像等。 H5调用微信授权获取code是指在H5页面中使用微信提供的API,引导用户进行微信授权操作,并获取用户的code。开发者可以通过code换取用户的access_token,从而获取用户的基本信息。 微信code获取开发文档包含了微信授权的整个流程和使用方法,具体包括以下内容: 1. 授权流程:详细描述用户在微信客户端中授权的整个流程,包括用户点击授权按钮、跳转微信授权页面、用户同意授权等步骤。 2. 接口说明:介绍了H5页面中需要调用的微信API,包括引导用户授权的接口、获取用户code的接口等。 3. 参数说明:详细描述了每个接口需要传递的参数,包括授权作用域、应用ID、重定向URL等。 4. 返回值说明:说明了每个接口返回的结果,如code、access_token等。 通过阅读微信code获取开发文档,开发者可以了解如何在H5页面中调用微信授权功能,重点掌握用户授权的流程和参数的使用方法。同时,开发文档还提供了示例代码和常见问题的解答,方便开发者理解和使用微信授权功能。 总而言之,微信code获取开发文档是帮助开发者在H5页面中调用微信授权功能的指南,提供了全面的接口说明和使用方法的文档。通过该文档,开发者可以实现在微信公众号微信页面开发的网页获取用户的授权信息。 ### 回答2: 微信code获取开发文档是微信公众号开发文档中的一部分,用于指导开发者如何在H5页面中通过微信授权获取用户的code。在微信公众号中,开发者可以通过H5页面开发功能,将自己的网页嵌入到微信客户端中。这样用户在访问该网页时,可以直接在微信中打开,无需跳转到外部浏览器。 为了获取用户的授权,开发者需要在相应的H5页面中调用微信提供的授权接口,以获取用户的code。这个code是临时的,每次用户进入页面都会重新生成,且有效期为5分钟。开发者在获取code后,可以通过code来换取用户的openid,以便进行后续的操作。 在微信公众号开发文档中,开发者可以找到关于如何在H5页面中调用微信授权获取code的具体步骤和示例代码。文档中涵盖了参数的设置、接口的调用方式以及返回结果的解析等内容,帮助开发者快速理解和实现微信授权功能。 通过阅读微信code获取开发文档,开发者可以了解到如何在H5页面中嵌入微信授权功能,实现登录、绑定等操作,提升用户体验和功能扩展性。这对于微信公众号的开发人员来说,是非常重要的参考指南。 ### 回答3: 微信code获取开发文档是微信提供的一份技术文档,用于指导开发者在H5页面上调用微信授权接口,实现获取用户授权code的功能。该文档详细介绍了各种代码示例和接口调用方法,帮助开发者了解如何在微信公众号微信页面开发中使用网页授权功能。 在微信公众号微信页面开发中,如果需要获取用户的基本信息或进行用户登录验证等功能,就需要先获取用户的授权code。开发者可以通过H5页面上的按钮或链接等方式,调用微信授权接口,将用户导向微信登录页面并请求授权。用户确认授权后,微信会通过回调URL返回一个带有code参数的URL地址。 通过阅读微信code获取开发文档,开发者可以了解如何构造授权链接URL,并对回调URL的处理方式进行说明。文档中还包括了接口的参数说明、权限说明、错误码列表等内容,帮助开发者快速、准确地调用接口,实现微信授权功能。 总之,微信code获取开发文档是一份重要的技术文档,为开发者提供了详细的接口使用说明和示例代码,帮助他们在H5页面中调用微信授权接口,获取用户授权code,实现各种微信公众号微信页面开发的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值