今天可以说是非常忙的一天了,要再项目中实现微信相关的功能:授权登录以及扫码登录,还有就是自建应用的发送消息。首先功能代码其实在经过了几天的学习之后并没有很难,但是最让我难受的是在项目中去加代码,首先svn就弄了一会儿(其实是因为没有打开公司要求的文件加密软件导致无法check out...),然后项目的后台代码继承自公司自己写的一个后台框架,弄不明白机制,不知道怎么着手写,说白了就是项目代码里特别庞大,不知如何下手。并且项目的后台并没有用到什么spring之类的第三方框架,就一个类,1000行代码...后来终于明白,要写的接口就直接写成一个方法,然后已经封装好了request和response,可以直接拿来调用,好像也挺方便的。之后就开始着手写功能代码。

  授权登录其实很简单,照着官方文档(https://work.weixin.qq.com/api/doc)弄就好了,这里还是稍微总结一下步骤把:

  1. 首先按照文档的要求构造一个链接。这个链接可以放在前端的某个按钮里,作用是通过带上几个应用以及企业微信的唯一参数,相当于是对微信验明正身,告诉微信确实是本企业微信的应用需要获取Code。然后链接中会带上一个URL,这个URL是我们自己写的一个接口,专门用来接收和处理Code。这样,在微信确认过后,会回调这个接口,并且把Code参数用URL参数的形式传给接口。然后我们就可以愉快的用request.getParameter("code")来接收Code参数了。
  2. 然后我们需要对Code进行处理,才能获得用户的唯一UserId。想要获得UserId不光需要用户本次点击链接产生的Code,还需要带上Access_Token参数,这个详见官方文档,不详细说明了。然后调用微信的接口,如果合法调用,就会返回用户的UserId。然后我们就可以通过UserId获得用户得信息了。因为这次的项目开发的是自建应用,所以scpoe我用的是snsapi_base,也就是最低级别,只能获得UserId,因为自建应用可以直接使用UserId获取更多信息,所以就采用了这种静默授权的方式,不需用户点击授权即可拿到信息。如果是开发第三方应用的话,需要选择别的scope才能获得更多信息。

  写完了功能代码,就迎来了我这一天最纠结的问题了。那就是在前后端分离的情况下,我如何向前端返回我的登录匹配与否的信息。首先交代一下背景,项目原先的登录方式就是前端获取用户输入信息传给后台接口进行匹配,后台返回JSON,包括是否登录成功,以及一些相关字段,如果登陆失败相关字段为空。并且,项目的后台是没有存放UserId的,这也就是说不能通过匹配UserId的方式进行验证,只能通过唯一手机号来进行验证了,所以我在最后还需要做一个表,用来存放UserId、Id和手机号这三个字段。那么,问题来了,在这个功能的流程里,我始终无法想明白一点,如图:

  就是在以上这个流程中,后台到底如何向前端返回信息?因为中间前端访问的是构造的微信链接,而并不是请求后台的接口,并且还有一个微信回调后台接口的操作,所以处理code的接口如果直接response.setEntity来返回JSON的话,那这个response是发送给谁?因为对Http请求了解的真的不够深,想了很久也无法想清楚其中的请求关系。最后在网上看到了一个流程图(原文链接:https://segmentfault.com/a/1190000010753247)

  在这个流程图的帮助下,我最后放弃了直接返回JSON数据给前端的念头,采用了经常能见到的方案也就是后台带着JSON数据,重定向至前端页面,前端在页面加载时判断是否有登录成功的cookie来判断是否登录成功,成功则再利用cookie中的信息再请求后台拿到用户数据显示在主页。这个流程相对来讲清晰直观,免去了刚才我思考请求来源和响应去向的麻烦,遂最后和前端同事提出了这个方案。最后,目前代码是写完了,还没有测试,因为微信的回调域名不接受IP地址...恰好我司的测试服务器没有域名,使用的是IP地址直接访问,尴尬hhh

  虽然周五当天没有完成扫码登录和发送信息的需求,但我相信也很快了,毕竟自己之前已经做出来Demo了,后续也会分享出来。最后总结一下这一周,我想说的是,出来工作真的会接触到很多学校里接触不到的东西。可能因为我在学校里划水了两年,很多项目中的工具其实并没怎么用到,比如团队代码管理的工具svn和git我就没有用过,项目的打包,连接远程服务器(这个有点丢人...)等工程相关的事情,我都很不熟悉。希望在未来的日子里可以尽快熟悉这些东西,毕竟程序员也不是只写代码就好,当我能写出业务逻辑代码却对工程相关内容一窍不通时真的也挺尴尬的,尤其这些东西对于同事和组长都是很简单的东西,我说我不会确实很尴尬哈哈。我知道我现在很水,所以博客名也起的是水猿(很水的程序员),但是我心里还是有一些小小的理想的,希望未来能够更进一步,愿自己和大家都能保持一颗学习的心!

Terence Xie

2018.7.22 周日 16:05

TW实习日记:第五天的更多相关文章

  1. TW实习日记:前三天

    今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ...

  2. TW实习日记:第四天

    第四天 早上第一件事就是和组长说前一天的需求的事,简而言之就是两个导航栏不属于一个标签内,自定义导航栏属于<body>下的<header>,微信顶部的则是<head> ...

  3. TW实习日记:第九天

    这两天有点忙,要改前端网页和加需求上去.所以昨天说的Vue缓存机制也没看,所以打算现在列个挖了的坑的清单: Vue缓存机制.生命周期和钩子函数 使用项目组自用组件来重写静态页面 SSM框架搭建.整合流 ...

  4. TW实习日记:第31-32天

    不知不觉的,实习的净工作天数,已经都超过一个月了.因为对工作内容不是很满意,所以打算月底离职,也不知道是公司太缺人还是我真的能干活,领导竟然三番两次找我让我再考虑...明天又要找我了,哎...随机应变 ...

  5. TW实习日记:第十天

    今天任务很简单,就是出品项目的时间轴显示页面和动态路由设置.其实时间轴页面很快就做完了,在做完处理完数据之后,然而有很多细节需要打磨,这就又考验了我面向搜索引擎编程的能力,根据需求百度了很多css的样 ...

  6. TW实习日记:第八天

    今天早上主要是接着做昨天的微信端网页预览附件,听同事说当打包代码放入服务器上后,就不存在跨域问题了,也就懒得自己写接口了,那么就希望自己能一次过吧...结果写着写着,发现开发文档中关于预览文件的方法, ...

  7. TW实习日记:第七天

    今天早上,将项目的两个企业微信接口:登录和应用消息发送接口,做了最后的收尾工作,把目前我能解决的问题算是基本都解决了.早上还开了一个会,大意是组长封装了许多组件叫我们使用,在不断的使用中打磨组件的可用 ...

  8. TW实习日记:第六天

    今日的一整天都是在开发微信相关的接口,因为项目的系统是嵌在企业微信中,所以不可避免的要产生微信UserID和企业系统ID的匹配关系,那么就需要用手机号或是邮箱这种两边都存在的唯一参数进行匹配.然后再将 ...

  9. TW实习日记:第28天

    同前两天一样,等接口,开发,调试接口.重复地做着低级代码得搬运工作,确实挺没意思的.怪不得有些人一直说写低级代码很无聊,没有创造性和成就感.31号准备溜了,还是好好复习准备秋招吧. 挖坑清单: Vue ...

随机推荐

  1. [BJWC2018]最长上升子序列

    十分感谢GXZ大佬的讲解,此处致以敬意!emmmm在初学状压DP时就理解了如此精妙的一道题,感到很开森~ \(Address\) ________________ #\(\color{red}{\ma ...

  2. Session["userName"]与Session["userName"].ToString()是不一样的~~

    今天调了个代码,发现老是跟预期的结果不一样,找了半天的原因,一个一个的往回找,终于逮出元凶了! 我今天才发现,下面两个是不一样的: //有问题的代码 if (Session["uid&quo ...

  3. 当面试官问你sql优化的时候。。。

    当面试官问你有关sql优化的问题时,直接拿笔写给他: 8-select 9-distinct<column_list> 1-from left_table 3-<join_type& ...

  4. Ajax+PHP实现异步图片上传

    1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  5. C#中如果用await关键字来await一个为null的Task对象会抛出异常

    await & async模式是C#中一个很重要的特性,可以用来提高异步程序(多线程程序)的执行效率.但是如果尝试用await关键字来await一个为null的Task对象,会导致程序抛出Nu ...

  6. linux下安装perl

    1.在官网  http://www.perl.org/get.html  下载perl安装包 2.上传服务器并解压 3../Configure -des -Dprefix=安装目录 4.make&am ...

  7. 映射Xml文件中的数据到JavaBean中

    使用Java原生的javax.xml.bind包下的JAXBContext将一个Xml文件中的数据映射到一个JavaBean中 import java.io.File; import java.io. ...

  8. oracle查询用户的权限

    DBA_* 描述的是数据库中的所有对象 ALL_* 描述的是当前用户有访问权限的所有对象 USER_* 描述的是当前用户所拥有的所有对象 查看所有用户:  select * from dba_user ...

  9. 嵌入式STM32开发环境之Keil5的安装(附资源)--

    全文copy,原文见https://blog.csdn.net/weixin_42602730/article/details/81007685 --------------------------- ...

  10. shell习题第7题:备份数据库

    [题目要求] 设计一个shell脚本用来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月 假设我们知道mysql root账号的密码,要备份的库为da ...