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

PC 端网站使用微信扫码登录

  •  
  •   dream4ever · 117 天前 · 2999 次点击
    这是一个创建于 117 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前正在开发的业务,有微信小程序端和 PC 网页端两个版本。

    小程序端的登录逻辑,是通过调用微信的接口,获取用户的 openid ,把它作为用户的身份标识。

    PC 网页端为了开发方便,也想让用户通过微信扫码登录,获取用户在小程序中的 openid ,这样就可以和小程序端共用一套用户身份。

    目前的整体流程如下:

    1. PC 网页端调用接口来生成小程序码,然后显示在前端页面中让用户扫码。生成小程序码时,可以传入一个 scene 参数,后端在返回小程序码时,把这个 scene 参数一并返回,前端进行存储。

    2. 微信小程序扫码,拿到 scene 参数,然后把小程序用户的 openid 和 scene 作为 key-value 传给后端存储。

    3. PC 网页端查询后端接口,检查 scene 参数是否有对应的 openid ,是的话就将 openid 存储在前端。

    现在的问题是,整体流程都走通了,但是最后一步 PC 网页端查询后端接口,以怎样的间隔轮询接口才是合理的方式?

    我目前想的是每隔 5 秒轮询一次,累计轮询 5 次(这个值可以调整)都没能获取到 scene 对应的 openid 的话,就认为用户没有用微信扫码,然后停止轮询,不知道这样合不合适。

    14 条回复    2024-07-30 10:49:45 +08:00
    pytth
        1
    pytth  
       117 天前 via Android   ❤️ 1
    不用这么麻烦吧,无论是小程序端还是 pc 端,都是在同一个小程序,openid 都是一样的。pc 端生成的小程序码,微信扫码仍然可以调用一次 wx.login 获取 openid ,然后对比数据库的 openid 是否已存在,如果存在则登陆,不存在则走注册的流程。轮询的目的是检查是否已经授权登陆获取到 openid ,设置一个过期时间,例如 2 分钟内没有获取到 openid 则代表没完成整个登陆过程,则停止轮询。

    可以看一下我的: https://segmentfault.com/a/1190000044295229
    vczyh
        2
    vczyh  
       117 天前
    一般来说 PC 扫码和小程序各用各的,同一个主体 unionid 是相同的,可以通过这个判断用户唯一。如果非要走 PC 扫码小程序登录可以参考腾讯云登录流程。
    chairuosen
        3
    chairuosen  
       117 天前
    3 秒一次,轮询 5 分钟,然后二维码罩一个蒙层说失效了,点一下刷新继续轮询
    GPT6
        4
    GPT6  
       117 天前
    用 unionid 比较好
    dj721xHiAvbL11n0
        5
    dj721xHiAvbL11n0  
       117 天前
    1. 为什么不用二维码链接拉起小程序做登录,你去看看一些用案例,比如腾讯云的扫码登录( https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html
    2. 不要用生成小程序码去做登录,因为会有频率限制( https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
    dream4ever
        6
    dream4ever  
    OP
       117 天前
    @x2420390517 刚知道可以用二维码链接拉起小程序,之前搜索没看到这方面的信息,多谢。
    另外虽然目前的业务可能上线后访问量不高,不过万一访问量高了,生成小程序码接口受限了是有点麻烦,这么一看的确还是前端生成二维码更省心一些,对后端的压力小。
    dream4ever
        7
    dream4ever  
    OP
       117 天前
    @vczyh
    @GPT6 刚研究了一下,用 unionid 的话,还需要在微信开发平台上做认证,认证还得找法人签字还得交钱,不想折腾了。
    TArysiyehua
        8
    TArysiyehua  
       117 天前
    直接用网页生成一个随机串,生成一个二维码,小程序扫码的时候把这个随即串带给后端,设置超时时间。
    网页 3 秒轮询这个随机串,并检查自身或后端返回是否超时,超时显示二维码过期重新刷新。。。
    pota
        9
    pota  
       117 天前
    我之前做的网站类似逻辑,不过是用的关注事件,当时做的是 2 秒一次。这个具体时间需要看你需要达到的用户体验和用户量以及 QPS 的承担量。不过这部分还是推荐独立程序做,防止影响已登陆业务
    pota
        10
    pota  
       117 天前
    @pota #9 微信接口获取二维码带上一个随机字符串,因为二维码是有一个 5 分钟还是多久的有效期,前端每次请求后台获取的时候显示,定时添加遮罩提醒用户点击刷新二维码
    cnbattle
        11
    cnbattle  
       117 天前 via Android
    你的方案可以,轮询时间短点 1-3s ,过期时间一般长点 三五分钟,轮询 scene 值 落到 redis ,别的没啥了
    dj721xHiAvbL11n0
        12
    dj721xHiAvbL11n0  
       116 天前
    @dream4ever #6 只是那个链接可以拉起小程序,参数你可以自定义,然后在小程序页面获取
    xiguadong
        13
    xiguadong  
       116 天前
    @pytth 微信小程序 3 方跳 个人小程序是没法的唛
    tallest
        14
    tallest  
       116 天前
    SSE ,服务器处理完了直接返回到前端去,ChatGPT 的流式输出就是用的这个,后端生成一点儿就返回给前端一点儿,一样的逻辑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:11 · PVG 05:11 · LAX 13:11 · JFK 16:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.