LOGIN_FLOW.md 3.7 KB

微信小程序登录流程说明

概述

本系统采用三步渐进式登录流程,使用旧版手机号解密方式(不需要开通"手机号快速验证组件"权限)。

登录流程

第一步:微信静默登录(老用户)

目的:检查用户是否已注册,老用户可直接登录

流程

  1. 前端调用 wx.login() 获取 code
  2. 发送到后端:POST /auth/sys/miniapp/custom/openid
  3. 后端用 code 调用微信API获取 openid
  4. 根据 openid 查询数据库
  5. 返回结果:
    • 老用户:{ isSign: "true", token }
    • 新用户:{ isSign: "false" }

第二步:手机号授权(新用户)

目的:获取用户手机号,检查是否已用手机号注册

流程

  1. 用户点击授权按钮(open-type="getPhoneNumber"
  2. 微信弹窗授权,获取 encryptedDataiv
  3. 重新调用 wx.login() 获取新的 code
  4. 发送到后端:POST /auth/sys/miniapp/custom/check

    {
     "loginCode": "新的code",
     "encryptedData": "加密的手机号数据",
     "iv": "加密算法初始向量"
    }
    
  5. 后端用 code 获取 session_key

  6. 后端用 session_key 解密 encryptedData 得到手机号

  7. 根据手机号查询数据库

  8. 返回结果:

    • 已注册:{ isSign: "true", token }
    • 未注册:{ isSign: "false", openid, unionid, phoneNumber }

第三步:完善用户信息(首次登录)

目的:收集用户昵称和头像,创建新用户

流程

  1. 弹出用户信息弹窗
  2. 用户输入昵称、选择头像
  3. 上传头像到服务器
  4. 发送到后端:POST /auth/sys/miniapp/custom/login

    {
     "openid": "用户openid",
     "unionid": "用户unionid",
     "phoneNumber": "手机号",
     "nickname": "昵称",
     "avatarUrl": "头像URL"
    }
    
  5. 后端创建新用户记录

  6. 返回:{ token }

技术要点

1. 手机号解密(AES-128-CBC)

// 使用 session_key 作为密钥
// 使用 iv 作为初始向量
// 使用 AES/CBC/PKCS5Padding 算法解密
byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes);
String decryptedData = new String(decryptedBytes, "UTF-8");
// 解析JSON获取 purePhoneNumber

2. 为什么需要两次 wx.login()?

  • 第一次:获取 openid 检查是否为老用户
  • 第二次:获取新的 session_key 用于解密手机号
  • 原因:微信的 code 是一次性的,用过就失效

3. Token 机制

  • 使用 JWT 生成 token
  • 包含 userIdphone
  • 有效期 7 天
  • 前端存储在 localStorage
  • 后续请求通过 Authorization: Bearer {token} 携带

接口列表

接口 方法 说明
/auth/sys/miniapp/custom/openid POST 第一步:静默登录
/auth/sys/miniapp/custom/check POST 第二步:手机号验证
/auth/sys/miniapp/custom/login POST 第三步:完善信息
/wd/miniapp-member/bizBigMember/getMemberInfoByToken GET 获取用户信息
/jeecg-boot/mg/sys/oss/file/upload POST 上传头像

优势

  1. 老用户体验好:无需重复授权,静默登录
  2. 新用户流程简单:一键授权手机号
  3. 安全性高:手机号加密传输,前端无法获取明文
  4. 无需付费权限:使用旧版解密方式,不需要开通"手机号快速验证组件"
  5. 个人小程序可用:不受企业认证限制

注意事项

  1. encryptedDataiv 必须同时存在
  2. session_key 有效期为用户会话期间
  3. 手机号解密后格式为:13800138000(纯数字,无国家码)
  4. 头像上传需要先获取 token
  5. 用户信息弹窗不允许点击遮罩关闭