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

您提到的“网页授权”通常指的是微信的 OAuth2.0 网页授权,这个功能主要用于在 微信公众号或微信开放平台的应用(如App、网页) 中,获取用户的基本信息(如昵称、头像、OpenID等)。
您为什么会遇到“清空网页授权”的需求呢?通常有以下几种场景:
- 在小程序中内嵌了一个网页(使用
<web-view>组件),而这个网页本身需要调用微信的网页授权来获取用户信息,您希望在小程序端能控制这个授权状态。 - 您想清除的是在小程序中获取用户信息的授权状态,这通常指的是用户点击“拒绝”授权后,如何能让用户再次授权。
- 您可能混淆了概念,实际想清除的是小程序自身的用户登录态(
wx.login获取的code换取的session_key和openid)。
下面,我将针对这几种最常见的情况,提供解决方案。
清除 <web-view> 内嵌网页的网页授权状态
这是最符合“小程序清空网页授权”字面意思的场景,当用户在 <web-view> 打开的H5页面中点击了“拒绝授权”后,微信会缓存这个拒绝状态,短期内(通常为几分钟)用户再次点击授权按钮会直接失败。

解决方案:引导用户手动操作
小程序本身无法直接清除H5页面的网页授权缓存,最直接有效的方法是引导用户:
- 提示用户退出微信,重新进入小程序。
- 提示用户清除微信缓存。
实现代码示例(在小程序页面中):
当检测到用户授权失败,且需要重试时,可以弹出一个提示框。
// 在小程序页面中,当需要重试网页授权时
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 的授权状态是 一次性的,用户一旦拒绝,不会像网页授权那样有长时间的缓存,但小程序开发者无法强制再次弹出授权框,必须由用户主动点击一个按钮来触发。
实现代码示例:
-
在 WXML 中设置一个按钮:
<button bindtap="getUserProfile">点击重新获取头像昵称</button>
-
在 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 去自己的服务器换取 openid 和 session_key,并建立你自己的登录态(比如生成一个自定义的 token)。
“清空”这个登录态,通常指的是让用户 退出登录。
解决方案:调用 wx.removeStorage 或 wx.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 的重新授权) 是最需要关注的。
