单页面应用在微信服务号下的登录流程

最近我们的小程序涉及到虚拟支付的问题,在ios端的支付被封掉了??,所以有了在服务号上搞一套H5版的小程序的需求。由于我们小程序是mpvue写的,为了尽量复用之前的样式和逻辑,选择了前后端分离的模式,于是一段新的踩坑之旅开始了。放下wx的jssdk暂且不表,今天来说说登录时遇到的坑。

服务号的登录流程

以前搞过服务号的同学对于它的登录流程应该不陌生,就是当后端检测到当前用户没有授权时,将会重定向到微信的授权页面,当用户点击这个授权的button时,微信会根据Url查询字符串中的重定向URL,重新回到我们的页面。

下面3幅图展示了整个过程:

  1. 当我们的服务器发现用户没有授权,返回302状态码,以及微信的授权页面location

  2. 用户在该页面点击确认登录

  3. 微信服务器根据location里的redirectURL,返回301code,重定向回来

上面三步,经历了两次重定向,第一次从自己的服务器重定向到微信的服务器,微信展示授权页面。第二次重定向是当用户点击之后,微信会带一个code重定向回来,当服务器拿到这个code之后,经历一波获取openId的操作之后,生成一个session,这样用户以后访问时就不需要再次登录。

这样的模式在传统的前后端不分离,基于模板的情况下,是没有问题的,因为没有json的返回,后端进行逻辑处理后,渲染出html。但是在单页面的情况下,如果思路跑偏会出现一堆问题。

单页面遇到的问题

上面说的思路跑偏是什么意思呢?就是当用户进来时,先将单页面的index.html发给浏览器。当浏览器执行开始js脚本(app.js)时,就会向服务器发送请求。

此时如果是一个新用户在访问,由于没有登录,服务器会返回一个302的重定向状态码,然而这次请求是通过ajax发起的。浏览器不会自动重定向到授权页面,导致请求失败。

此时你会想,浏览器不会重定向,我可以当请求失败时通过设置window.location自己重定向到微信授权页面,这样解决了第一步的重定向问题,然后当用户点击确定登录时,马上又面临第二个重定向的问题--重定向到哪里。

由于微信重定向的url是带着code返回的,重定向的Url肯定不能是一个静态页面的Url,必须是一个api,假设还是login。后端在请求中拿到code之后,生成一个新的session,再将原先的html再次返回给浏览器,并带上set-cookie字段,此后浏览器会带着cookie请求,登录至此完成。

这样做ok,当时却留下一个很恐怖的URL:https://example.com/login?code=001QLbSQ0Ujc162Sp5UQ0IG6SQ0QLbSD,此后前端路由开始work,就在前面的基础上加上一个#号,如果你的业务还涉及支付,那就完蛋了,因为支付需要配置的url应该是稳定的而code这个查询参数是动态变的。

解决方案

我画了一张图解释了重新设计的登录流程:

在这个新的流程中,当新用户第一次发起请求(login)时,不会返html给浏览器,只会进行重定向:

  • 如果用户未登录,重定向到微信的授权页,并设置redirect url,使用户点击授权后可以重定向回来
  • 新用户重定向回来之后,login api拿到code,经过生成session操作后,再次重定向到homeurl下
  • 如果是老用户,直接重定向到homeurl下
  • 此时由于访问home的用户都是已登录状态,api统一返回index.html,所以最终用户看到的是https://example.com/home下的页面,后面的单页面路由会在这个url下展开。(虽然对服务号用户来说可能没什么区别)

总结一下这么做的好处:

  1. 少传输一次html页面,第一种方式一开始就给未登录的用户传html是没用的
  2. 美观的url(用户感知不到)
  3. 前端无需手动重定向,后端将显示页面和登录逻辑放到两个api中,逻辑更清晰

总结

了解到3xx状态码的博大精深,尽管对普通用户感知不深,没有2xx受群众欢迎,也没有404,500知名度高,属于默默无闻型的。但是在互联网世界里却扮演着重要的角色。

原文地址:https://www.cnblogs.com/imgss/p/10116017.html

时间: 2024-07-31 13:18:28

单页面应用在微信服务号下的登录流程的相关文章

Ionic+AngularJS 开发的页面在微信公众号下显示不出来原因查究

ionic 页面 微信浏览器遇到的坑 公司的微信公众号一部分页面是用AngularJS+Ioinc开发,发现在本地浏览器测试的时候都没问题,传到服务器在微信公众号下跑就出问题来,经查是: index-tab页面 406 not accessable http请求头问题 1 $httpProvider.interceptors.push(function() { 2 return { 3 "request": function(config) { 4 //console.log(conf

PHP 开发社区微信服务号实战图解

本博文就月初刚上线的微信服务号,图文进行总结分享给大家. 去年年底,我所在的团队讨论要开发微信号,话题由此拉开: 原来有一个3年前注册的微信号,但是后台操作无法从"订阅号"变更为"服务号",随即找腾讯的客服沟通,客服还算是热情,mm耐心的告之系统已经更新,对于无法升级的微信号,只能重新注册----"*#*(*¥)¥K30#$e&#)",一阵抓狂后,只能重新注册了,下面就开始从注册到内部需求讨论,到开发的图文总结. Step1:微信注册 在

微信服务号内容分享和自定义分享

之前的文章后台通过useragent判断用户是否从手机端访问页面,公司申请了微信服务号,基础功能完成之后,发现一个问题就是服务号中所有右上角中点击之后可以分享到朋友圈,发送给朋友,分享到QQ,最开始想的办法是隐藏.不过后来发现大多数的公共账号并没有隐藏,只是在分享的时候修改跳转链接.如果没有做过微信开发估计需要思考一下,不用很久你就知道有一个插件叫微信JS-SDK. 开发步骤 微信JS-SDK使用起来很方便,不过大多数的时候我们耗费的时候是在config上面,服务端的Access_Token和J

微信服务号、订阅号和企业号的差别(运营和开发两个角度)

一.运营的角度 1.1.概括 订阅号: 微信最初的形态是一个纯粹的社交工具,也就是人与人之间的联系工具,当中又分熟人之间的联系和陌生人之间的联系.于是就诞生了朋友圈和订阅号. 而订阅号的作用就是媒体社交.订阅号最主要是自媒体或媒体为读者用户提供优质的对他们感兴趣或有价值的内容.从而与关注者建立关系或使用户对自身品牌的认可. 服务号: 相比于订阅号.服务号要复杂的多,当微信有了朋友圈能够卖商品,订阅号能够做营销. 那么当出现人与商业之间的联系需求时.服务号便诞生了,它不仅要要做一个服务者还要做一个

微信服务号开发-商城微信登录

最近帮朋友写了个微信服务号,服务号名字叫做十四行诗.没错是卖月饼的商城. 简单介绍下微信登录,与官方文档不同,简单画了一下UML图 简单的说就是先建立了一个index.php(直接拍域名就过去了.),然后传一个appid,微信公众号后台能拿到 <?php $appid = ''; header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri=http://w

微信服务号认证流程

一.申请微信认证 1.申请微信认证入口. 1) “设置->账户信息->认证情况“点击“申请微信认证”进入. 2) “服务->服务中心“点击“微信认证”进入. 2.申请微信认证操作全攻略. 1) 签署<微信公众平台认证服务协议>,勾选同意,点击下一步. 2) 同意<公众号命名规则>,勾选同意,点击下一步. 3) 填写资料:根据账号类型选择企业或媒体(目前只支持这两种类型),并如实填写认证资料. 特别说明:企业对公银行帐户为必填项,在审核过程中第三方审核公司会向该帐户

微信服务号申请、认证、认证后

  微信公众号申请.认证:01. 账号申请开始------>02.申请账号结束----->7个工作日--->03.开始账号认证----->04.结束账号认证----->15个工作日--->05.账号认证通过 商家支付接口申请:     07.开始申请 商家微信支付接口----->08.结束申请 商家微信支付接口 ,等待审核---->7个工作日----->09.支付接口申请通过,进入技术集成阶段 -----------------------------

微信服务号如何用编辑模式设置自定义菜单

1.登录该微信服务号,点击高级功能,选择编辑模式. 2.开启编辑模式. 3.设置自定义菜单,菜单管理—添加.排序.设置动作. 4.添加一级菜单(最多3个).二级菜单(一级菜单下最多5个二级菜单),比如我可以添加百度经验,在百度经验下面我可以设置经验1,经验2. 5.设置菜单内容:点击你选择的菜单,设置点击该菜单后的动作(发送消息.跳转网页). a)发送消息:编辑你要发送的文章.图片.语音.视频.图文消息. b)跳转到网页:你有WAP站的话,直接就跳转到你的手机网站了.

微信服务号、订阅号和企业号的区别(运营和开发两个角度)

博客转载自:http://blog.csdn.net/u013142781 为了以后便于查找,转载此博客,在此感谢原博主的无私分享. 一.运营的角度 1.1.概括 订阅号: 微信最初的形态是一个纯粹的社交工具,也就是人与人之间的联系工具,其中又分熟人之间的联系和陌生人之间的联系,于是就诞生了朋友圈和订阅号.而订阅号的作用就是媒体社交,订阅号最主要是自媒体或媒体为读者用户提供优质的对他们感兴趣或有价值的内容,从而与关注者建立关系或使用户对自身品牌的认可. 服务号: 相比于订阅号,服务号要复杂的多,