微信小程序本身没有“网页授权”这个功能。

微信小程序清空网页授权
(图片来源网络,侵删)

您提到的“网页授权”通常指的是微信的 OAuth2.0 网页授权,这个功能主要用于在 微信公众号或微信开放平台的应用(如App、网页) 中,获取用户的基本信息(如昵称、头像、OpenID等)。

您为什么会遇到“清空网页授权”的需求呢?通常有以下几种场景:

  1. 在小程序中内嵌了一个网页(使用 <web-view> 组件),而这个网页本身需要调用微信的网页授权来获取用户信息,您希望在小程序端能控制这个授权状态。
  2. 您想清除的是在小程序中获取用户信息的授权状态,这通常指的是用户点击“拒绝”授权后,如何能让用户再次授权。
  3. 您可能混淆了概念,实际想清除的是小程序自身的用户登录态(wx.login 获取的 code 换取的 session_keyopenid)。

下面,我将针对这几种最常见的情况,提供解决方案。


清除 <web-view> 内嵌网页的网页授权状态

这是最符合“小程序清空网页授权”字面意思的场景,当用户在 <web-view> 打开的H5页面中点击了“拒绝授权”后,微信会缓存这个拒绝状态,短期内(通常为几分钟)用户再次点击授权按钮会直接失败。

微信小程序清空网页授权
(图片来源网络,侵删)

解决方案:引导用户手动操作

小程序本身无法直接清除H5页面的网页授权缓存,最直接有效的方法是引导用户:

  1. 提示用户退出微信,重新进入小程序。
  2. 提示用户清除微信缓存。

实现代码示例(在小程序页面中):

当检测到用户授权失败,且需要重试时,可以弹出一个提示框。

// 在小程序页面中,当需要重试网页授权时
wx.showModal({ '授权提示',
  content: '您已拒绝授权,请退出微信或清除微信缓存后重新进入小程序再试。',
  showCancel: false, // 不显示取消按钮
  confirmText: '我知道了',
  success: function (res) {
    if (res.confirm) {
      console.log('用户已知晓');
      // 可以在这里提供一个“重新加载”按钮,让用户点击后刷新 <web-view>
      // this.setData({ webViewUrl: this.data.webViewUrl }); // 通过改变 URL 来刷新
    }
  }
});

重新获取小程序自身的用户信息授权(wx.getUserProfile

这是目前小程序开发中更常见的“授权”场景,用户通过 wx.getUserProfile 授权后,小程序可以获取到用户的头像、昵称等信息,如果用户拒绝了,或者想更新信息,就需要再次触发授权。

解决方案:提供一个明确的“重新授权”按钮

wx.getUserProfile 的授权状态是 一次性的,用户一旦拒绝,不会像网页授权那样有长时间的缓存,但小程序开发者无法强制再次弹出授权框,必须由用户主动点击一个按钮来触发。

实现代码示例:

  1. 在 WXML 中设置一个按钮:

    <button bindtap="getUserProfile">点击重新获取头像昵称</button>
  2. 在 JS 中编写按钮的点击处理函数:

    Page({
      data: {
        userInfo: {},
        hasUserInfo: false
      },
      // 页面加载时,可以尝试从本地缓存读取之前已授权的用户信息
      onLoad() {
        const userInfo = wx.getStorageSync('userInfo');
        if (userInfo) {
          this.setData({
            userInfo,
            hasUserInfo: true
          });
        }
      },
      // 重新获取用户信息的函数
      getUserProfile(e) {
        // 必须是在用户点击后调用,否则会报错
        wx.getUserProfile({
          desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中
          success: (res) => {
            console.log('获取用户信息成功', res.userInfo);
            this.setData({
              userInfo: res.userInfo,
              hasUserInfo: true
            });
            // 可以将用户信息存入本地缓存
            wx.setStorageSync('userInfo', res.userInfo);
          },
          fail: (err) => {
            console.log('用户拒绝授权', err);
            // 这里可以再次弹出提示,引导用户
            wx.showModal({
              title: '授权提示',
              content: '您需要授权才能使用此功能,请点击按钮重试。',
              showCancel: false,
              confirmText: '重新授权'
            });
          }
        });
      }
    });

清除小程序的登录态(wx.login

wx.login 获取的是一个 code,你用这个 code 去自己的服务器换取 openidsession_key,并建立你自己的登录态(比如生成一个自定义的 token)。

“清空”这个登录态,通常指的是让用户 退出登录

解决方案:调用 wx.removeStoragewx.clearStorage

如果你将用户的登录 token 存储在本地缓存中,清除它即可。

实现代码示例:

// 退出登录的函数
logout() {
  // 1. 从本地缓存中移除登录 token
  wx.removeStorageSync('login_token');
  // 2. 可选:清空所有用户相关数据
  wx.clearStorageSync();
  // 3. 更新页面状态,例如将“登录”按钮显示出来,“个人中心”信息隐藏
  this.setData({
    isLoggedIn: false,
    userInfo: null
  });
  // 4. 提示用户退出成功
  wx.showToast({ '已退出登录',
    icon: 'success'
  });
}

总结与对比

功能/概念 调用方式 “清空”/“重新授权”的方法 备注
网页授权 在H5页面中通过JS调用 无法由小程序直接控制,需引导用户退出微信或清除微信缓存 用于公众号或开放平台应用,<web-view> 内嵌的H5页面会用到。
用户信息授权 在小程序中调用 wx.getUserProfile 必须提供一个按钮,由用户主动点击重新触发 wx.getUserProfile 授权后可获取用户头像、昵称,状态是临时的,拒绝后需用户手动重试。
小程序登录态 在小程序中调用 wx.login 清除本地存储的 token,通常是一个“退出登录”功能。 wx.login 是获取 openid 的凭证,真正的登录态由开发者自己维护。

根据您的实际需求,选择对应的解决方案即可,对于绝大多数小程序开发者来说,场景二(wx.getUserProfile 的重新授权) 是最需要关注的。