在 UniApp 中,App 端微信登录后下次点击自动授权,是因为微信 SDK 的授权机制缓存了用户的登录状态。以下是原因和解决方案:
原因分析
- 微信 SDK 缓存机制:首次授权后,微信会在设备本地存储授权凭证(如 access_token、refresh_token),有效期内再次调用登录 API 时,自动使用缓存状态,无需用户手动确认。
- UniApp 封装逻辑:UniApp 的
uni.login() 方法在 App 端调用微信 SDK,默认遵循此行为。
解决方案
1. 强制重新授权(适用需要每次手动登录的场景)
调用微信原生 SDK 的 auth 方法,设置 forceRefresh 参数为 true(仅 App 端有效):
// 在 UniApp 中通过条件编译判断平台
// #ifdef APP-PLUS
const wxAuth = uni.requireNativePlugin('wxAuth');
wxAuth.login({
forceRefresh: true // 强制刷新授权,要求用户重新输入账号密码
}, (res) => {
if (res.code) {
// 获取到临时 code,发送到后端兑换 openid 和 session_key
console.log('微信登录code:', res.code);
} else {
console.error('微信登录失败:', res.errMsg);
}
});
// #endif
2. 前端清除本地缓存(辅助方案)
手动清除 UniApp 存储的登录状态:
// 退出登录时执行
uni.removeStorageSync('user_token'); // 清除自定义的登录令牌
uni.removeStorageSync('wx_login_state'); // 清除微信登录状态标记
3. 后端控制会话有效期
在后端服务器设置较短的 token 有效期(如 1 天),强制前端定期重新授权。
注意事项
- 用户体验权衡:自动授权能减少操作步骤,但敏感操作(如支付、修改密码)建议强制重新认证。
- 平台差异:H5 和小程序无法使用
forceRefresh,需通过其他方式实现重新授权。
总结
自动授权是微信 SDK 的默认设计,如需禁用,需通过原生插件强制刷新或结合后端控制会话。根据实际场景选择合适方案即可。