V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pytth
V2EX  ›  程序员

开发一款小程序进行网站扫码登录的,小程序写好了,后端逻辑也有了,有大佬提供更好的后端逻辑吗

  •  
  •   pytth · 2018-10-19 18:23:10 +08:00 · 2320 次点击
    这是一个创建于 2008 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是我写的小程序端

    Alt text

    逻辑大概是这样的:
    1、网页通过小程序生成临时二维码接口生成一个带参数的二维码,同时向数据库插入一条数据,把参数插入到数据库,待会扫码进行校验
    2、小程序端扫码,小程序请求授权获得头像和昵称还有 openid,请求成功后,把头像、昵称、openid 同时更新到刚才网页生成的二维码的那条数据中,携带的这个参数是用来检验当前扫码的是这个二维码的这条数据,方便操作数据库
    3、如果授权成功,则数据库更新,如果未授权,则数据库这条数据为空
    4、网页端一直在做 1 秒 1 次的轮询数据库,发现数据有更新了,就立马获得头像你昵称,并且存 session 进行登录操作

    各位觉得这个逻辑如何?还是有其它更好的方案?

    7 条回复    2018-10-20 02:04:38 +08:00
    python35
        1
    python35  
       2018-10-19 19:49:50 +08:00
    参考一下网页端微信扫描二维码登录的逻辑,之前是采用的 http 长连接的方案,现在就不知道了。可以作为参考。
    SingeeKing
        2
    SingeeKing  
       2018-10-19 20:43:48 +08:00
    说说我的做法吧,二维码参数是一个 16 位随机字符串

    获取二维码时,生成此随机字符串,存入 cache,值为 0
    用户扫码后,cache 对应值改为 1
    用户确认后,cache 对应值改为 2,取消则改为 -1

    网页端请求后端服务,后端服务做轮询 cache,如果 cache 值为 2 则设置 session 实现登录,为 1/-1 则返回响应状态,为 0 则继续轮循,持续 30s 依然为 0 则返回 0 ;
    前端收到后端返回后 2 则做跳转,1 则提示等待确认,-1 提示失败,如果是 0/1 则再发起一个后端请求

    以上实现部分参考了微信开放平台扫码登录的实现

    不写入数据库而写 cache 是因为速度会更快;使用后端轮询而非前端是因为降低服务器压力

    关于存储用户信息,我的做法是 cache 存一个 JSON,包括了 status、info 和 user_id,确认后设置 user_id

    建议:不要强制获取用户信息啊喂为什么非得要微信头像和昵称有什么意义吗。。。
    z0ne
        3
    z0ne  
       2018-10-19 21:41:05 +08:00
    楼主可以参考我的平台登陆,地址: https://dev.guren.cloud
    我采用的方案是:

    1. 新用户进入,初始化创建一条数据,然后返回这条数据的 id ( id 随机,且唯一,他人不可搜索,只能通过 id 查询、更 i 性能)
    2. 利用这个 id,生成小程序动态码,我用的是自己平台的小程序码接口,直接传递 id 参数即可显示小程序码
    3. 小程序扫一扫,打开对应页面(带有 id 参数的登陆页面),然后用户授权登陆
    4. 用户点击授权的时候,获取 wx.login 的 code,再通过 api 获取到 openId 和 session_token 等信息,然后通过 id 更新这条数据(包括状态、用户存储信息)
    5. 网页 ajax 轮询查询数据,根据状态判断用户是否已经扫描以及登陆成功,登陆成功,会获取到对应的用户数据,然后进行这条数据的删除。
    6. 获取到这条用户数据,加入到自己的后端逻辑吧~~~
    nekoneko
        4
    nekoneko  
       2018-10-19 21:52:59 +08:00
    @z0ne 为什么要轮询,不用 websocket 吗
    z0ne
        5
    z0ne  
       2018-10-19 21:56:15 +08:00
    @nekoneko 用 ws 也可以,各有各的好处,我这里用 ajax 是因为:
    1. 兼容不支持 ws 的浏览器
    2. 后端因为没什么用到 websocket 的场景,基本都是 rest,所以直接调用 api 地址插入、查询、删除数据即可,比较方便

    当然 第一条理由比较勉强,毕竟现在都支持了
    pytth
        6
    pytth  
    OP
       2018-10-20 02:02:19 +08:00 via iPhone
    @SingeeKing 方法挺好的,获取头像和昵称也是方便啊,新用户扫码的时候,自动创建帐号,头像作为头像,昵称作为网站昵称,系统自动生成随机账号,OpenID 这些用来做模板消息推送也不错,主要是一键操作吧,注册账号,设置头像,昵称这些都省了。
    pytth
        7
    pytth  
    OP
       2018-10-20 02:04:38 +08:00 via iPhone
    @z0ne 你这个方案跟我的差不多😀不错,我居然看懂了,我知道怎么做了,你这个比我那个好点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5509 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:32 · PVG 14:32 · LAX 23:32 · JFK 02:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.