找回密码
 立即注册

微信小程序登录流程整理

匿名  发表于 2023-3-9 18:18:34 阅读模式 打印 上一主题 下一主题
微信官方文档

官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
小法式登录

小法式可以经过微信官方供给的登录才能方便地获得微信供给的用户身份标识,快速建立小法式内的用户系统。
登录流程时序


微信小法式登录流程整理-1.jpg
说明: 挪用 wx.login() 获得 姑且登录凭据 code ,并回传到开辟者办事器。挪用 auth.code2Session 接口,调换 用户唯一标识 OpenID 和 会话密钥 session_key。以后开辟者办事器可以按照用户标识来天生自界说登录态,用于后续营业逻辑中前后端交互时识别用户身份。 留意:会话密钥 session_key 是对用户数据停止 加密签名 的密钥。为了利用本身的数据平安,开辟者办事器不应当把会话密钥下发到小法式,也不应当对外供给这个密钥。姑且登录凭据 code 只能利用一次
小法式登录态

对于小法式来说,也需要一个唯一的标识符来区分用户,也就是session来连结会话,可是小法式没有cookie, 是以我们的唯一标识符会被存储在 localstorage 里面,每次发请求时,城市从localStorage 里面拿到这个唯一标识符,带在请求中。
微信的openid和code

在平常开辟中,我们也经常听到 openid 和 code 的概念。
openid 用来标识这个唯一的微信誉户,也就是说,一个微信誉户相对于一个公众号(主体)的 openid 是唯一的,是不会变的。
那末我们若何才能晓得 某一个用户的 openid 呢?
就是经过 code, 对于同一个用户,每次获得到的 code 城市改变,有有用期。我们把 code 作为参数,挪用指定的微信办事器的接口,便可以拿到用户的 openid 。
那末我们若何才能拿到 code 呢?

  • 微信内h5页面的方式是:跳到指定的微信的承接页面,再跳回到本页面,url链接上就会被拼上 code 。
  • 小法式的方式是: 经过挪用 wx.login() 方式,便可以拿到用户的 code
晓得了上面的条件条件,便可以去实现一个微信小法式的登录系统。
微信小法式登录系统


  • 经过 wx.login() 获得到用户的code
  • 经过 wx.request() 方式请求我们自己的后端,我们自己的办事端把 appid , appsecret 和 code 一路发送到微信办事器。 appid 和 appsecret 都是微信供给的,可以在治理员背景找到
  • 微信办事器返回了 openid
  • 我们在自己的数据库中,查找 openid ,假如没有查到记录,说明该用户没有注册,倘使有记录,则继续往下走
  • 我们天生一个第三方 session , 也就是 session_id , 也就是用户唯一标识符。在 redis 中,把 session_id 和用户的身份存进去。
  • 返回 3rd_session
  • 小法式把 3rd_session 存到 storage 里面
  • 下次请求时,先从 storage 里面读取,然后带给办事端
  • 办事端从 redis 里面找到 3rd_session 对应的记录,然后校验有用期
留意:上面提到的 3rd_session 只是一种实现方式,可以自界说登录态。
具体代码实现可以参考 微信小法式实现微信登录
union_id买通公众号与小法式用户系统

需要用到wx.getUserInfo,https://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html#wxgetuserinfoobject,从小法式端传入$encryptedData, $iv到办事端,需要用到官方供给好的解密sdk,https://mp.weixin.qq.com/debug/wxadoc/dev/demo/aes-sample.zip,其中包括了php示例代码,对它简单的复制粘贴以下
  1. // 获得unionid
  2.     private function getUnionId($encryptedData, $iv) {
  3.                require_once __DIR__ . '/../third_party/aes/wxBizDataCrypt.php';
  4.         $appid = 'wxcb935c2ec6734f08';
  5.         $pc = new WXBizDataCrypt($appid, $sessionKey);
  6.         $errCode = $pc->decryptData($encryptedData, $iv, $data );
  7.         if ($errCode == 0) {
  8.             $obj = json_decode($data);
  9.             var_dump($obj->unionId);
  10.             // unset($array["watermark"]);
  11.             return [
  12.                 'unionid' => $obj->unionId,
  13.                 'nickname' => $obj->nickName,
  14.                 'avatarUrl' => $obj->avatarUrl,
  15.                 'gender' => $obj->gender,
  16.                 'country' => $obj->country,
  17.                 'province' => $obj->province,
  18.                 'city' => $obj->city,
  19.                 'language' => $obj->language
  20.             ];
  21.         } else {
  22.             print($errCode . "\n");
  23.         }
  24.     }
复制代码
这样就获得了unionid,便可以与自己的同一开辟平台的帐号系统下的利用买通了,否则不会返回unionid。
其他

cookie 和 session 的区分

cookie 和 session 并不是同一个层面的工具。

  • cookie 是现实实在存在的一个工具,是http协议规定的,如同一种载体,我们可以在响应头里面设备 cookie,只要你愿意,你可以在cookie里面设备任何工具,非论是用户信息用户昵称, 可是这样有平安性风险,cookie里面不合适有敏感性的信息,比如说,只放session_id
  • session 是一个笼统概念,是客户端和办事端连结会话的一种方式,一种通用的机制。session 的意义是会话,实现是:办事端把一个唯一标识和用户身份的对应的关系存储下来,存在redis, 文件, 数据库中都可以。客户端出的请求带上唯一标识,办事端从redis 大概 文件大概 数据库中找出这个唯一标识 对应的身份,这类机制就被称为session
session 机制大部分利用cookie 作为载体输送这个唯一标识,也可以采用url 毗连、 自界说请求头来实现。
参考文章

微信小法式的登录系统
微信小法式实现微信登录
回复

使用道具

大神点评

yzk12 2023-3-9 18:19:34 显示全部楼层
大佬牛皮啊
回复

使用道具 举报

说点什么

您需要登录后才可以回帖 登录 | 立即注册
HOT • 推荐

神回复

站长姓名:王殿武 杭州共生网络科技 创始人 云裂变新零售系统 创始人 飞商人脉对接平台 创始人 同城交友聚会平台 创始人 生活经验分享社区 创始人 合作微信:15924191378(注明来意)