uni-app 小程序端 button 获取用户信息(getuserinfo)在签名失效后首次获取到的签名为已经失效的签名(signature)

uni-app 小程序端 button 获取用户信息(getuserinfo)在签名失效后首次获取到的签名为已经失效的签名(signature)

开发环境 版本号 项目创建方式
Windows 11 家庭中文版 HBuilderX

产品分类:uniapp/小程序/微信

示例代码:

bindGetUserInfo(e) {  
    let userInfo = e ? e.detail : '';  
    console.log(userInfo);  
}

操作步骤:

在登录注册账号后,第二天(或待到签名超时后)首次前往登录请求获取用户信息获取到的签名signature值为超时失效的签名值。在后续获取到的signature值就为更新后的有效签名值。

附件为在签名失效后的两次登录请求实例,第一次登录时获取到的签名为已经超时的失效签名请求登录接口导致登录失败,后续再次点击登录获取到的为更新后的有效签名值然后登录成功。后续在多次退出登录后获取到的签名值都为当前有效期内的新签名。

预期结果:

在每次请求获取用户信息获取到的签名signature值都为有效签名值,并在签名过期后获取到的签名值为新的有效签名值而不是获取一次超时的签名值之后再获取新签名值

实际结果:

在上一个签名signature值过期后,首次获取到的签名signature值为过期的signature值导致登录失败,但在后续新签名有效期内获取的签名才为有效签名

bug描述:

在与后端多日的比对查找bug时观察到:使用<button open-type="getUserInfo" @getuserinfo="bindGetUserInfo"> 获取签名 </button>获取签名signature时首次必定会获取到已经超时的签名参数。在首次获取到失效的签名signature后并且在新签名有效期内,每次获取到的签名signature都为正确的。

在原生小程序<button type="primary" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo"> 获取签名 </button>中不会出现此情况


更多关于uni-app 小程序端 button 获取用户信息(getuserinfo)在签名失效后首次获取到的签名为已经失效的签名(signature)的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

试试用 wx.getUserInfo 获取 userinfo

更多关于uni-app 小程序端 button 获取用户信息(getuserinfo)在签名失效后首次获取到的签名为已经失效的签名(signature)的实战教程也可以访问 https://www.itying.com/category-93-b0.html


好的,我试试,看一下后续测试情况。那getuserinfo是否真实存在这种情况。

回复 l***@sina.com: 这个我暂时不方便验证,后续会看下

回复 DCloud_UNI_JBB: 好的

回复 DCloud_UNI_JBB: 使用wx.getUserInfo问题依旧存在

回复 l***@sina.com: 你的这块代码怎么写的

回复 DCloud_UNI_JBB: wx.getUserInfo({ success: function(e) { uni.login({ success(wxcode) { const loginCode = wxcode.code; let userInfo = e; userInfo.userInfo.mobile = _this.baseForm.mobile; const reqLogin = { tenantId: 1, code: loginCode, userData: userInfo, systemType: ‘mini’, wechatDto: { code: loginCode, tenantId: 1, userData: userInfo, }, }; console.log(reqLogin) } }) }, })

回复 l***@sina.com: 怎么调起的这块内容

回复 DCloud_UNI_JBB: <button class=“btnText pfr” open-type=“getUserInfo” @getuserinfo=“bindGetUserInfo”> 登录 </button> 因为昨天把获取用户信息改成了 wx.getUserInfo获取所以没有用按钮获取所携带的用户信息了

回复 l***@sina.com: im中私聊

这是一个已知的uni-app在小程序端的缓存问题。当签名过期后,首次调用getUserInfo时,uni-app框架返回的是缓存的旧签名值,而非实时生成的新签名。

问题原因: uni-app在底层对微信小程序的getUserInfo接口做了封装处理,在签名未更新时会优先返回缓存的上次签名结果,导致首次获取到过期签名。

解决方案:

  1. 强制刷新签名:在检测到签名过期时,可先调用uni.login()获取新的code,触发签名更新机制
  2. 手动重试机制:首次获取到签名后验证其有效性,若失效则立即重新获取
  3. 使用原生方案:通过条件编译直接调用微信原生API
// 推荐的重试方案
async bindGetUserInfo(e) {
    let userInfo = e.detail;
    // 验证签名是否有效,若无效则重新获取
    if (this.checkSignatureInvalid(userInfo.signature)) {
        await this.forceRefreshSignature();
        // 重新触发获取用户信息
        return;
    }
    // 正常处理逻辑
}
回到顶部