通过微信小程序扫码,在PC端登陆跳转相应页面

小编推荐:Fundebug专注于JavaScript、微信小程序、微信小游戏,Node.js和Java实时BUG监控。真的是一个很好用的bug监控费服务,众多大佬公司都在使用。

通过微信小程序扫码,在PC端登陆跳转相应页面

最近在做一个零食店,移动端采用微信小程序进行实现。当然,既然是零食店,那么肯定会有后台管理的,当时的想法是如何才能通过微信小程序里进行扫码去登陆PC端的管理平台呢?话不多说,接下来就说说我是怎么做到! 
首先,大致上讲一下我的实现思路,整体通过WebSocket来实现自动跳转。在PC登陆页,展示二维码,建立WebSocket连接,当微信小程序扫码后,在后台进行身份验证,并且将验证结果实时发送给在PC登陆页建立的websocket连接,然后进行相应信息的提示以及页面的跳转。

扫码登陆流程

1、生成PC端页面二维码 这个二维码中放的什么信息呢,当时是能够唯一标识客户端的UUID啦,不然你扫码之后,应该给哪个客户端发送状态信息呢 

2、进入PC端管理页时,获取唯一标识,建立websocket连接,并且以该唯一标识作为key存放在map集合当中。

pc端代码

 
  1. var websocket = null;
  2.  
  3. var url="ws://localhost:8080/snacks/socketLogin/[[${socketKey}]]";
  4.  
  5. if('WebSocket' in window)
  6.  
  7. websocket = new WebSocket(url);
  8.  
  9. else
  10.  
  11. layer.msg("该浏览器暂不支持!请更换浏览器",{icon:2,time:1000})
  12.  
  13. websocket.onopen = function () {
  14.  
  15.  
  16.  
  17. }
  18.  
  19. websocket.onclose = function () {
  20.  
  21. layer.msg("连接失效,请刷新页面",{icon:2,time:1000})
  22.  
  23. }
  24.  
  25. websocket.onmessage = function (e) {
  26.  
  27. var res = e.data;
  28.  
  29. var mid = eval("var json = "+res)
  30.  
  31. if(json.code=="1000"){
  32.  
  33. //登陆成功
  34.  
  35. layer.msg("登陆成功!",{icon:1,time:1000},function () {
  36.  
  37. window.location.href = "http://localhost:8080/snacks/login/goShopIndex/"+json.openId+"/snacks";
  38.  
  39. })
  40.  
  41. }else{
  42.  
  43. //登陆失败
  44.  
  45. layer.msg("该用户暂时没有权限或者商户",{icon:2,time:2000})
  46.  
  47. }
  48.  
  49. }

服务器端代码

 
  1. private static ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>();
  2.  
  3. @OnOpen
  4.  
  5. public void onOpen(Session session, @PathParam("socketKey") String socketKey){
  6.  
  7. System.out.println("websocket:"+socketKey+"--->建立成功");
  8.  
  9. sessionMap.put(socketKey,session);
  10.  
  11. }
  12.  
  13. @OnClose
  14.  
  15. public void onClose(Session session,@PathParam("socketKey") String socketKey){
  16.  
  17. System.out.println("websocket:"+socketKey+"--->断开连接");
  18.  
  19. sessionMap.remove(socketKey);
  20.  
  21. }

然后呢就是微信小程序端了,微信小程序通过扫码获取到该PC登陆页建立的websocket连接的唯一标识Key后,将自己的信息与这个key作为data请求后台接口。在后台接口中对用户信息进行校验,之后将校验结果发送给该key对应的session连接就可以啦

服务器端

 
  1. @RequestMapping("/getLoginCode")
  2.  
  3. @ResponseBody
  4.  
  5. public Integer getLoginCode(HttpSession session, String socketKey, String openId){
  6.  
  7. //在这里进行登陆信息验证
  8.  
  9. 。。。。。。
  10.  
  11. //获取到websocket连接session的map
  12.  
  13. ConcurrentHashMap<String, Session> sessionMap = LoginSocket.getSessionMap();
  14.  
  15. //将状态信息发送到客户端
  16.  
  17. Session currentSession = sessionMap.get(socketKey);
  18.  
  19. currentSession.getAsyncRemote().sendText(responseJson);
  20.  
  21. return result.getCode();
  22.  
  23. }

微信小程序端

 
  1. scanCodeLogin:function(){
  2.  
  3. wx.scanCode({
  4.  
  5. scanType:'qrCode',
  6.  
  7. success:function(e){
  8.  
  9. var socketKey = e.result;
  10.  
  11. app.checkSession();
  12.  
  13. var openId = wx.getStorageSync("openId");
  14.  
  15.  
  16.  
  17. wx.request({
  18.  
  19. url: app.baseUrl + '/getLoginCode',
  20.  
  21. method:'POST',
  22.  
  23. header:app.postHeader,
  24.  
  25. data:{socketKey:socketKey,openId:openId},
  26.  
  27. success:function(e){
  28.  
  29. console.log(e)
  30.  
  31. var result = e.data;
  32.  
  33. if(result == 1000){
  34.  
  35. wx.showToast({
  36.  
  37. title: '登陆成功',
  38.  
  39. })
  40.  
  41. }else{
  42.  
  43. wx.showModal({
  44.  
  45. title: '登陆失败',
  46.  
  47. content: '该用户暂时没有权限或者商户',
  48.  
  49. showCancel:false
  50.  
  51. })
  52.  
  53. }
  54.  
  55. }
  56.  
  57. })
  58.  
  59. },
  60.  
  61. fail:function(){
  62.  
  63. }
  64.  
  65. })

这里的websocket也可以替换为消息队列中间件,但是这样是不是大材小用了呢? 

 

你可能感兴趣的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值