提了问题一天后,问题解决了:
不是 setStorageSync 的问题。
是我们自己后端的问题。
原因是我们用 union_id 进行用户的查找
Ruby on Rails 代码如下(片段):
User.where(wechat_unionid: unionid)
在用户没有关注公众号的情况下,unionid 是拿不到的,出错了。
换成 open_id 后一切恢复正常。没有关注公众号的新用户在使用微信小程序的时候也可以正常访问了。
非常感谢各位的热心帮助
------------------以下是原问题的描述--------------------
登录态的定义:
自己业务后端给出的 JWT token,比如:eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZ1hXTSIsImNyZWF0ZWRfYXQiOiIyMDE4LTExLTE0VDE2OjM4OjQ5KzA4OjAwIn0.MmxhdbUOp3U5LA4azLeIj8nXikSWAa0gyD13NF3AXpQ
重点
这个问题的重点不是 JWT,重点是用户登录态的存储方法 (setData/globalData/setStorageSync)
最早时我是用 setStorageSync 存储 token,然后马上从"登录页"跳转到"首页"
(备注:我们微信小程序里只用了微信登录,完全没用手机号+密码登录或者邮箱+密码登录等方法)
另外,因为业务需求,我在"首页"加了登录检测,如果没登录就自动跳到"登录页"
造成了什么问题
在小部分情况下会造成无限跳转,永远困在登录页
具体情况:登录页->首页->登录页->首页->登录页
在我的开发者工具+真机上测不出来这样的问题。但是每次审核的时候就通过不了,每次都是不同的机型报错:
审核拒绝信息:
问题排查
在网上搜了一圈,看到了这篇文章: https://blog.csdn.net/qq_41813695/article/details/80812794
试了一下,把 getStorageSync 从 onLoad 移动到 onShow 里,并没有解决问题。
最新这一次的审核还是失败了(提示 iPhone 5S 用不了)
是否有代码可以重现?
我在本地和真机都无法复现,都是审核的时候说过不了。所以我觉得提供代码应该没啥帮助。
就是很简单的 setStorageSync 然后 getStorageSync
我的 APPID
wx3e98618e26700e1b
我想问的问题是
大家都是怎么存储登录态的?(setData/globalData/setStorageSync/其他方法)?
我的计划
(换成 globalData,因为 setStorageSync 实在不可靠,连续2次都无法过审)
微信小程序开发问题解答
微信小程序开发者回答:
我跟后端对接了这么多个微信小程序的登录态,我们项目也是用token,也是跟你一样做页面登录检测,没有登录会提醒用户登录或跳转登录页面,或者其他方法。也有用setStorageSync存储token的。
但是都没遇到你这种问题的。
我觉得,你的请求登录接口及成功后保存数据没有做回调后的操作,导致同步执行的问题。
微信小程序开发者回答:
好,感谢回复,会多排查,有结论了会贴出来到问题描述里。帮助其他人
微信小程序开发者回答:
我也发现本地同步缓存有出错概率,不管是存还是取,所以用异步存wx.setStorage,用同步取wx.getStorageSync,暂时没问题。还有,同一个key,存和取之间不能太快,因为存取有时间,否则取不出来
微信小程序开发者回答:
我以前也是用setStorageSyn来保存的openid的,直到发现getStorageSyn经常报错,回调失败,后来就全局保存了openid了
微信小程序开发者回答:
换成globalData就稳定正确了吗?
微信小程序开发者回答:
我还没改成 globalData 方式,因为在一些微信群里和其他开发者聊天大家都觉得这是个很奇怪的事情。而且我在开发者工具和真机用测试版中均无法复现这样的问题。实在奇怪。我给几个页面底部加了文字:版本 1.7.0。我再原样提交一次,看看情况如何。如果有结果了我会回来更新的。把解决方法说出来。
微信小程序开发者回答:
哦哦。。直觉上感觉可能是异步的问题
微信小程序开发者回答:
token为什么要给到前端呢,是不是多次获取token导致前面保存的token失效呢?
微信小程序开发者回答:
首先感谢回复。1. token 给到前端,是为了之后每次 http 请求都带上,发给后端。后端这样才知道是哪一个用户。
本文网址:http://www.91bianli.com/weixinxiaochengxu/35666.html