已有的互联网产品在接入小程序会面临一些和登录态相关的问题:怎么获取微信登录态;怎么把微信帐号和自己的帐号进行打通。我们来介绍一下如何把微信登录应用到你的小程序中。

我们先来看看微信登录的整个过程,如图所示。

微信登录的整个过程

我们来依次分解一下图中的七个步骤。

1 获取微信登录凭证code

首先说到登录,我们可能很正常地想到一个做法:通过wx.login直接拿到微信用户的id编号[5]https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000cc48f96c5989b0086ddc7e56c0a#_ftn5,再把这个id传到自己的后台,从而知道是哪个微信用户在使用我的服务。而我们上述微信登录的流程中并不是通过wx.login直接获取微信用户的id,那直接获取微信用户id的做法有什么问题呢? 假设现在我们有个接口,通过wx.request请求 https://test.com/getUserInfo?id=1 拉取到微信用户id为1在我们业务侧的个人信息,那么黑客就可以通过遍历所有的id,把整个业务侧的个人信息数据全部拉走,如果我们还有其他接口也是依赖这样的方式去实现的话,那黑客就可以伪装成任意身份来操作任意账户下的数据,想想这给业务带来多大的安全风险。

为了避免这样的风险,wx.login是生成一个带有时效性的凭证,就像是一个会过期的临时身份证一样,在wx.login调用时,会先在微信后台生成一张临时的身份证,其有效时间仅为5分钟[6]https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000cc48f96c5989b0086ddc7e56c0a#_ftn6。然后把这个临时身份证返回给小程序方,这个临时的身份证我们把它称为微信登录凭证code。如果5分钟内小程序的后台不拿着这个临时身份证来微信后台服务器换取微信用户id的话,那么这个身份证就会被作废,需要再调用wx.login重新生成登录凭证。

由于这个临时身份证5分钟后会过期,如果黑客要冒充一个用户的话,那他就必须在5分钟内穷举所有的身份证id,然后去开发者服务器换取真实的用户身份。显然,黑客要付出非常大的成本才能获取到一个用户信息,同时,开发者服务器也可以通过一些技术手段检测到5分钟内频繁从某个ip发送过来的登录请求,从而拒绝掉这些请求。

2 发送code到开发者服务器

在wx.login的success回调中拿到微信登录凭证,紧接着会通过wx.request把code传到开发者服务器,为了后续可以换取微信用户身份id。如果当前微信用户还没有绑定当前小程序业务的用户身份,那在这次请求应该顺便把用户输入的帐号密码[7]https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000cc48f96c5989b0086ddc7e56c0a#_ftn7一起传到后台,然后开发者服务器就可以校验账号密码之后再和微信用户id进行绑定,小程序端的示例代码如下所示。

代码清单4-12 wx.login获取code后

Page({tapLogin: function() {wx.login({success: function(res) {if (res.code) {wx.request({url: 'https://test.com/login',data: {username: 'zhangsan', // 用户输入的账号password: 'pwd123456', // 用户输入的密码code: res.code},success: function(res) {// 登录成功if (res.statusCode === 200) {console.log(res.data.sessionId)// 服务器回包内容}}})} else {console.log('获取用户登录态失败!' + res.errMsg)}}});}})

3 到微信服务器换取微信用户身份id

到了第3步,开发者的后台就拿到了前边wx.login()所生成的微信登录凭证code,此时就可以拿这个code到微信服务器换取微信用户身份。微信服务器为了确保拿code过来换取身份信息的人就是刚刚对应的小程序开发者,到微信服务器的请求要同时带上AppId和AppSecret,这两个信息在小程序管理平台的开发设置界面[8]https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000cc48f96c5989b0086ddc7e56c0a#_ftn8可以看到,由此可以看出,AppId和AppSecret是微信鉴别开发者身份的重要信息,AppId是公开信息,泄露AppId不会带来安全风险,但是AppSecret是开发者的隐私数据不应该泄露,如果发现泄露需要到小程序管理平台进行重置AppSecret,而code在成功换取一次信息之后也会立即失效,即便凭证code生成时间还没过期。

开发者服务器和微信服务器通信也是通过HTTPS协议,微信服务器提供的接口地址是:

https://api.weixin.qq.com/sns/jscode2session?appid=<AppId>&secret=<AppSecret>&js_code=<code>&grant_type=authorization_code

URL的query部分的参数中 <AppId>, <AppSecret>, <code> 就是前文所提到的三个信息,请求参数合法的话,接口会返回以下字段。

表 jscode2session接口返回字段

字段 描述
openid 微信用户的唯一标识
session_key 会话密钥
unionid 用户在微信开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。

我们暂时只要关注前两个字段即可,openid就是前文一直提到的微信用户id,可以用这个id来区分不同的微信用户。session_key则是微信服务器给开发者服务器颁发的身份凭证,开发者可以用session_key请求微信服务器其他接口来获取一些其他信息,由此可以看到,session_key不应该泄露或者下发到小程序前端。

可能我们会好奇为什么要设计session_key,如果我们每次都通过小程序前端wx.login()生成微信登录凭证code去微信服务器请求信息,步骤太多造成整体耗时比较严重,因此对于一个比较可信的服务端,给开发者服务器颁发一个时效性更长的会话密钥就显得很有必要了。session_key也存在过期时间,因为篇幅关系,我们不在此展开,可以参考小程序的官方文档关于session_key的相关介绍。

4 绑定微信用户身份id和业务用户身份

在2中提到,业务侧用户还没绑定微信侧身份时,会让用户填写业务侧的用户名密码,这两个值会和微信登录凭证一起请求开发者服务器的登录接口,此时开发者后台通过校验用户名密码就拿到了业务侧的用户身份id,通过code到微信服务器获取微信侧的用户身份openid。微信会建议开发者把这两个信息的对应关系存起来,我们把这个对应关系称之为“绑定”。

有了这个绑定信息,小程序在下次需要用户登录的时候就可以不需要输入账号密码,因为通过wx.login()获取到code之后,可以拿到用户的微信身份openid,通过绑定信息就可以查出业务侧的用户身份id,这样静默授权的登录方式显得非常便捷。

5 业务登录凭证SessionId

3中已经说到微信侧返回的session_key是开发者服务器和微信服务器的会话密钥,同样道理,开发者服务器和开发者的小程序应该也有会话密钥,在本书中我们就把它称之为SessionId。用户登录成功之后,开发者服务器需要生成会话密钥SessionId,在服务端保持SessionId对应的用户身份信息,同时把SessionId返回给小程序。小程序后续发起的请求中携带上SessionId,开发者服务器就可以通过服务器端的Session信息查询到当前登录用户的身份,这样我们就不需要每次都重新获取code,省去了很多通信消耗。

微信小程序与微信登陆的交互、微信登录、获取微信信息相关推荐

  1. 微信小程序开发是 demo中显示bug显示“获取用户信息失败,请检查网络“

    这是因为接口wx.getUserInfo 有变动,最简单的方法就是在 client/pages/index/index.wxml 中第一个用户登录测试的view里添加 <button open- ...

  2. 微信小程序+SpringBoot+mybatis+MySQL实现简单的登录

    微信小程序+SpringBoot+mybatis+MySQL实现简单的登录 当下微信小程序和springboot都是比较火的.今天我们来用springboot和微信小程序来实现简单的登录. 1.首先来 ...

  3. 微信小程序与内嵌网页交互实现支付功能

    上个月,小程序开放了新功能,支持内嵌网页,所以我就开始了小程序内嵌网页之路,之前我只是个小安卓. 内嵌网页中可使用JSSDK 1.3.0提供的接口,可坑就来了,居然不支持支付接口的调用,经过一番研究, ...

  4. 小程序加入人脸识别_微信小程序 人脸识别登陆模块

    微信小程序---人脸识别登陆的实现 关键词:微信小程序 人脸识别 百度云接口 前言 这是一篇关于一个原创微信小程序开发过程的原创文章.涉及到的核心技术是微信小程序开发方法和百度云人脸识别接口.小程序的 ...

  5. 微信小程序篇_01 微信小程序与Java后端接口交互

    微信小程序与Java后端接口交互 准备 创建后端项目 创建小程序项目 本文主要介绍小程序前后端数据的交互,实践演示. 准备 创建后端项目 我这里就创建一个SpringBoot项目作为演示. 在创建项目 ...

  6. PHP小程序码扫码登录网站,WeAuth微信小程序实现PC网站扫码授权登录

    目前微信扫码登录的实现有以下2种方式: 1.微信服务号扫码网页授权登录 2.微信开放平台Oauth2.0授权登录 以上2种方式少不了微信认证,都是需要交300元认证后才可以获得开发能力.所以我就想到了 ...

  7. 微信小程序之顶部导航栏(选项卡)实例 —— 微信小程序实战系列(1)

    需求:顶部导航栏 效果图: wxml: <!--导航条--> <view class="navbar"><text wx:for="{{na ...

  8. 微信小程序之wx:if视图层的条件渲染 —— 微信小程序教程系列(10)

    使用wx:if进行视图层的条件渲染 示例: wxml:使用view <!--index.wxml--> <button bindtap="EventHandle" ...

  9. 黯然微信小程序杂记(一):从服务器获取数据 后端语言php

    黯然学编程 之 微信小程序杂记(一):从服务器获取数据 后端语言php 一.功能描述 二.服务器.数据库与微信小程序逻辑的关系 服务器 数据库 与微信小程序逻辑关系 三.请求数据的代码(可当做模板用) ...

  10. 绑定bindchange事件的微信小程序swiper闪烁,抖动问题解决,(将微信小程序切换到后台一段时间,再打开微信小程序,会出现疯狂循环轮播,造成抖动现象)

    绑定bindchange事件的微信小程序swiper闪烁,抖动问题解决,(将微信小程序切换到后台一段时间,再打开微信小程序,会出现疯狂循环轮播,造成抖动现象) 参考文章: (1)绑定bindchang ...

最新文章

  1. python内存管理机制_[转] Python内存管理机制
  2. 单例模式 -- Java
  3. 目标层准则层MATLAB,层次分析法-MATLAB
  4. semester 2 deadline from the computer science and electronic engineering
  5. java 缓存的简单实现_Java8简单的本地缓存实现
  6. 蓝桥杯2015初赛-牌型种数-dfs
  7. 【CodeForces - 988C 】Equal Sums (思维,STLmap,STLset,tricks)
  8. 海康+萤石云+云存储多少钱一个月_400万极清画质 萤石C6Wi智能家居摄像机
  9. ubuntu16.04下FastDFS+Nginx分布式文件系统
  10. SharePoint 2010 中有个新的列表模板“导入电子表格”可以直接导入Excel数据并创建为列表 ....
  11. java两个数最大公约数和最小公倍数_java中请给出例子程序:找出两个数的最大公约数和最小公倍数...
  12. python论文画图模板
  13. html5直播礼物动画,GitHub - General757/giftanim: 直播礼物动画 送赞送礼物动画 仿映客礼物动画侧栏弹出送花人和礼物以及x1 x2 x3效果,支持队列 排序...
  14. uint8_t和char的相互转换
  15. 腾讯轻量云FREEBSD11.1安装panabit cloud
  16. Linux CPU 100%问题 | top 命令详解
  17. 批发进销存管理软件,商品分类管理,对商品分类批量价格管理,商品分类导入导出的操作
  18. 如何修改cef源码支持windows xp
  19. 网络安全运维人员面临的痛点分析
  20. Oracle篇--04 Oracle SQL高级查询、分页查询

热门文章

  1. CentOS 安装Vim 编辑器
  2. Zero-shot Cross-lingual Transfer of Prompt-based Tuning with a Unified Multilingual Prompt
  3. 阿里云ecs云服务器建立wordpress个人博客教程
  4. 开源PLM软件Aras详解三 服务端简易开发
  5. matlab专业代做hslogic,MATLAB代做|FPGA代做--OLA算法的仿真与分析
  6. 高德地图我的队伍查岗_高德地图查岗新功能 让你的行踪无所遁形
  7. 为什么喧闹过后,京东还是市值第四的中国互联网公司?
  8. Microsoft Word 教程「7」,如何在 Word 中显示标尺?
  9. 智能家居项目开发(一):简单工厂设计模式引入
  10. layim的websocket消息撤回功能实现