微信小程序因为有自身的用户体系存在,使得项目的用户管理部分在开发和使用过程中容易产生很多困惑。最近的一个项目让我对这类问题整体思考了一下。一家之言,以问答的形式整理出来,给需要的人一点思路。
openId和自己的用户体系应该做成什么关系?
首先,我们设定一个userId为我们自己项目的用户的唯一标识。那么此时,对于某个用户来说,就有了两个唯一标识,一个是我们自身体系的userId,另一个是openId。在整个项目中,这两个都对应了唯一的用户,即根据其中任何一个都能且只能查询到一个用户。因此我们得出结论:一个openId只能同时绑定一个userId,在我们的用户表中,openId可空但是不可重复。userId不可空不可重复。
所以,我们可以看到很多app在登录的时候提供了微信登录和微信解绑,我认为前者目的是将openId和userId绑定,后者是将openId删除。
是否允许多微信号登录同一个用户帐号?
这个问题看似好回答,实际上有一个坑。按照第一个问题的思考,一个openId和一个userId绑定,自然这个微信号和用户绑定,怎么可能多微信登录呢?我们想两个场景:场景一,用户打开小程序,openId自动登录,获取到用户信息,登录成功;场景二,用户在小程序中用手机号验证码登录(此时openId不是手机号对应绑定的openId),理论上也应该能登录成功。
上面第一个场景没问题。第二个场景下,就会造成此时登录成功的openId和用户系统中保存的openId不一致。开发时,要特别注意第二种情况,为了友好性,我们应该允许用户用同一个微信登录不同的帐号,但是必须要注意一点:无论登录多少帐号,openId只能和一个userId绑定。
由以上结论也可以得到一个推论:即我们保存和查询用户业务信息时应该尽量使用userId。
微信小程序自动登录怎么做?
继续思考上面的场景一,我们是怎么做到自动登录的呢?答案是openId,因为这个是微信小程序中唯一身份证明。在app.js中向服务端传入openId,换取userId。如果顺利换取,则登录成功;否则,说明该微信没有绑定用户,跳转到登录页面即可。这样还有一个好处,尽管别的微信登录过你的账户,只要不做微信绑定,下次他也不会自动登录上你的帐号。
如何让微信小程序登录状态失效?
上面的自动登录有一个问题,不管用户多久没登录,只要openId绑定过user,即可自动登录。某些应用并不希望用户随时都能自动登录。
我实现的策略是加入一个token。这个token在服务端的缓存中维护,为这个token增加一个失效时间。微信小程序登录成功之后获取一个token,以后每次登录都用这个token换取userId。如果失效期到,则登录失败,跳转到登录页面。
开发中怎么处理微信小程序的登录授权和创建用户?
微信的授权方式可以说是越来越严格,在此不讨论具体的授权流程。我认为这两个可以同时做,也可以根据需求分开做,比如有些功能必须是登录状态才可以使用,有些功能是授权状态才可以使用。
关于用户先就写这么多,以后想到了再补充吧。
我在开发中遇到的更多的坑都已经记录在easyDemo小程序中,希望我的demo能给你easy。我还会持续更新easyDemo,欢迎收藏。