个人主页北极的代码欢迎来访作者简介java后端学习者❄️个人专栏苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺前言前面我们简单介绍了如何调用第三方的接口微信小程序的接口这里我们将具体的实现微信登录的业务操作。小程序登录流程时序需求分析类比基于微信登录实现小程序的登录如果是新用户需要自动完成注册第一部分需求分析老板在想什么老板开网吧前得先想清楚我这个网吧到底要提供什么服务给谁用1. 用户角色划分谁进网吧在苍穹外卖中主要有两类人普通用户C端 - 顾客就是来上网点餐的“你”。他们用微信小程序。需求浏览菜单、加购物车、下单支付、查看订单状态。商家/管理员B端 - 网管/老板管理网吧的人。他们用电脑浏览器后台管理系统。需求菜品管理上架下架、套餐管理、订单处理接单、完成、营业数据分析。2. 核心业务流程网吧怎么运转把业务流程串起来看顾客浏览菜单 → 加购物车 → 下单 → 支付 → 商家接单 → 制作 → 配送/自取每一步背后都需要系统提供支持。3. 功能需求与非功能需求必须有的和最好有的功能需求必须有用户端登录授权、菜品浏览、购物车、下单支付、历史订单。管理端菜品管理、员工管理、分类管理、订单管理、数据统计。非功能需求最好有的性能中午高峰期比如1130-1230几百人同时下单系统不能卡死。安全不能让别人随意修改别人的订单。可用性7x24小时稳定运行。第二部分接口设计把想法画成图纸想清楚了要做什么接下来就是具体怎么实现。接口设计就是定义“前后端之间怎么对话”。还是用“点餐”这个核心功能来举例看看从需求到接口是怎么一步步落地的。案例C端用户点餐1. 需求描述用户打开小程序看到菜品列表点击“加入购物车”然后去结算下单最后支付。2. 接口设计概览设计图纸长什么样接口文档通常包含以下要素请求路径URL地址如/user/cart/add请求方式GET获取、POST新增/提交、PUT修改、DELETE删除请求参数需要传什么数据给后端返回数据后端会返回什么结果3. 具体接口举例接口一获取菜品列表需求分析用户想看“川菜”分类下有什么菜。接口设计路径/user/dish/list方式GET参数categoryId分类ID比如川菜的ID是101返回菜品的数组包含名称、图片、价格、口味等。形象解释你问网管“有没有川菜菜单”网管把川菜单页递给你。接口二加入购物车需求分析用户看中了“鱼香肉丝”想点一份。接口设计路径/user/shoppingCart/add方式POST参数dishId菜品ID、dishFlavor口味比如“微辣”返回提示成功或失败。形象解释你对网管喊“帮我记一下鱼香肉丝微辣我要了”网管拿小本本记下来。接口三提交订单需求分析用户选完了准备结账。接口设计路径/user/order/submit方式POST参数amount总价、addressId收货地址、payMethod支付方式、remark备注比如“不要香菜”返回订单ID、预支付信息。形象解释你拿着小本本去前台“就这些算账我用微信支付。”接口四商家接单需求分析网管/后厨看到新订单准备制作。接口设计路径/admin/order/confirm方式PUT参数orderId订单ID返回操作成功。形象解释网管扫了一眼电脑屏幕点了一下“确认接单”厨房打印机开始出票。第三部分设计规范与原则画图纸的规矩为了保证画出来的图纸大家都能看懂苍穹外卖通常会遵循一些规范RESTful 风格用请求方式区分动作。GET/orders查列表POST/orders新建GET/orders/{id}查某个具体订单PUT/orders/{id}修改某个具体订单路径前缀/user/给小程序用户用的接口。/admin/给后台管理员用的接口。这样做便于区分权限。形象解释顾客走前门/user员工走后门/admin。统一返回结果所有接口都返回固定格式的数据比如json{ code: 1, // 1成功0失败 msg: 操作成功, // 提示信息 data: { ... } // 真正的数据 }JWT Token 验证除了登录接口其他接口都需要在请求头里带上token刚才说的网吧会员卡用来识别身份。总结需求分析是“做什么”——决定菜单上有鱼香肉丝而且可以选辣度。接口设计是“怎么做”——定义清楚顾客怎么点餐传什么参数走哪个窗口。在苍穹外卖中当我们看到类似这样的结构时就能对应起来了需求用户登录 -接口POST/user/user/login(参数code)需求管理员新增菜品 -接口POST/admin/dish(参数json格式的菜品信息头token)小程序登录的解释第一步出示身份证获取code你走到前台对网管说“老板开台机子。”网管不会直接给你开机他会先问你“身份证带了吗”你把身份证递给他。对应技术动作你 微信小程序身份证wx.login() 接口网管要身份证 小程序调用微信官方接口获取一个临时的、一次性的凭证叫做code。第二步网管去公安局系统核验后端请求微信服务器网管拿到你的身份证后他不会凭肉眼看看就相信你他会把身份证号输入到公安内部系统里进行查询。这个公安系统里记录了你的真实姓名、年龄、是否有案底等信息。公安系统验证通过后会给网管返回一个确认信息“此人真实有效可以上网。”对应技术动作网管苍穹外卖的后端服务器Java程序公安系统微信服务器输入身份证号查询 后端拿着小程序传来的code加上自己的AppID和AppSecret相当于派出所的接入密码去请求微信服务器。返回确认信息 微信服务器返回openid用户的唯一身份证号和session_key会话密钥。第三步网管给你办一张“网吧会员卡”下发自定义登录态公安系统确认你是好公民后网管不会每次都让你把身份证拿出来刷那样太慢了。所以网管会在他的网吧系统里给你建立一个档案如果第一次来的话然后发给你一张“网吧临时会员卡”。这张卡上有你的信息比如卡号 9527但最重要的是这张卡只有在这家网吧苍穹外卖才有效。下次你来直接刷卡就行了不用再出示身份证。对应技术动作建立档案 后端数据库查询openid如果没找到就在user表里新注册一条记录。制作会员卡 后端根据user_id生成一个自定义的登录凭证比如jwt_tokenJSON Web Token。这个token就相当于网吧的会员卡。递给你卡 后端把这个token返回给小程序。第四步拿着卡去上网携带token访问业务拿到会员卡后你走到电脑前刷一下卡或者输入卡号电脑解锁你就可以点炒饭、点可乐了。对应技术动作刷一下卡 小程序后续请求比如点餐、查询订单的请求头中都会带上这个token。电脑解锁 后端每次收到请求先验证token是不是真的、有没有过期。验证通过就知道你是哪个用户了user_id是多少然后才给你处理具体的业务逻辑比如把订单关联到你的ID上。总结一下这个流程的要点为什么不用微信直接登录因为安全问题。直接传微信号太危险所以微信设计了一个“介绍信机制”小程序拿着code介绍信给后端后端拿着code去微信官方那里换openid用户真实身份。这样openid永远只保存在后端小程序端是拿不到的保证了安全。苍穹外卖的具体实现Controller 接收LoginController接收小程序传来的code。Service 调用微信 APILoginService调用WeChatUtil的工具类通过code请求微信的jscode2session接口拿到openid。数据库操作根据openid查询user表如果没有就创建新用户。生成 JWT用用户的ID生成一个JWT Token。返回结果将token返回给小程序小程序存起来后续请求都带上。这样一来小程序用户就在苍穹外卖系统里完成了一次丝滑的匿名转实名的登录过程。微信登录在小程序里扮演什么角色微信登录就是这个小程序平板用来确认你是谁的一种方式。没有微信登录会怎样你坐在餐桌前点了一堆菜然后平板问请先登录。你说怎么登平板说输入用户名密码或者手机号注册一下。你心想吃个饭还要注册太麻烦了换一家吧。这就是没有微信登录的问题——用户流失率会非常高。有了微信登录会怎样你打开平板上面只有一个按钮微信一键登录。你点一下屏幕跳转到微信授权页面你点允许咻的一下你就登录成功了直接开始点菜。所以微信登录 让用户不用注册直接使用微信身份进来的快速通道。两者结合具体怎么工作还是用刚才点餐平板的场景步骤小程序在做什么微信登录在做什么后端在做什么1你打开平板小程序显示一个微信登录按钮—等着接收请求2你点按钮小程序调用wx.login()接口拿到一个临时的code微信告诉你这是这个用户的临时身份证—3小程序把这个 code 发给自己家的后端—后端拿着 code 去问微信这个 code 对应谁4—微信告诉后端这是 openidxxx 的用户后端收到 openid在自己数据库里找或创建用户生成一张会员卡token5小程序收到后端返回的 token把它存起来—后端把 token 返回给小程序6接下来你点菜、下单小程序都在请求里带上这个 token—后端看到 token就知道你是谁给你处理对应的业务为什么不能没有小程序开发你可能会想那能不能直接让用户用微信登录然后就用微信本身点餐这就好比问能不能直接用身份证去点菜不要点餐平板不行因为微信是通用工具不是专用工具微信能发消息、发朋友圈、支付但它不知道你的餐厅菜单长什么样。小程序是在微信里跑的一个专门应用专门为你的餐厅设计的。界面需要定制你的菜品图片要展示得漂亮购物车要方便修改这些都需要小程序开发者来设计和实现。微信本身不会帮你做这些。业务逻辑需要代码满减优惠怎么算套餐怎么组合这些逻辑都在小程序的代码里。总结一下三者的关系微信 操作系统/平台像Windows小程序 运行在微信里的APP像Word、Excel微信登录 小程序里用微信身份快速进入的功能开发者的分工小程序开发者负责把界面做漂亮把用户操作收集起来发给后端。后端开发者负责处理业务逻辑管理数据库对接微信服务器。微信登录是连接用户身份和业务系统的一座桥。所以在苍穹外卖项目中小程序开发让你能看见菜品、点击加入购物车、点击下单。微信登录让你点击下单时系统知道这是你下的单而不是别人。具体实现Cotrollerpackage com.sky.controller.user; import com.sky.constant.JwtClaimsConstant; import com.sky.dto.UserLoginDTO; import com.sky.entity.User; import com.sky.properties.JwtProperties; import com.sky.result.Result; import com.sky.service.UserService; import com.sky.utils.JwtUtil; import com.sky.vo.UserLoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; RestController RequestMapping(/user/user) Api(tags C端用户相关接口) Slf4j public class UserController { Autowired private UserService userService; Autowired private JwtProperties jwtProperties; /** * 微信登录 * param userLoginDTO * return */ GetMapping(/login) ApiOperation(微信登录) public ResultUserLoginVO login(RequestBody UserLoginDTO userLoginDTO){ log.info(微信用户登录:{},userLoginDTO); //微信登录 User user userService.wxLogin(userLoginDTO); //为用户生成jwt令牌 MapString, Object claimsnew HashMap(); claims.put(JwtClaimsConstant.USER_ID,user.getId()); String token JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims); UserLoginVO userLoginVOUserLoginVO.builder() .id(user.getId()) .openid(user.getOpenid()) .token(token) .build(); return Result.success(userLoginVO); } }ServiceService Slf4j public class UserServiceImpl implements UserService { Autowired private WeChatProperties weChatProperties; Autowired private UserMapper userMapper; //微信接口的地址 public static final String WX_LOGINhttps://api.weixin.qq.com/sns/jscode2session; /** * 微信登录 * param userLoginDTO * return */ public User wxLogin(UserLoginDTO userLoginDTO) { //具体怎么实现的操作 String openid getOpenid(userLoginDTO.getCode()); //判断openid是否为空如果为空则登录失败抛出业务异常 if (openidnull){ throw new LoginFailedException(MessageConstant.LOGIN_FAILED); } //判断当前用户是否为新用户 User user userMapper.getByOpenid(openid); //如果是新用户自动完成注册相当于就是在数据库中插入没有的数据 if (usernull){ user User.builder() .openid(openid) .createTime(LocalDateTime.now()) .build(); userMapper.insert(user); } return null; } private String getOpenid(String code) { //调用微信接口的服务获得当前用户的openid使用前面学习的httpclient MapString, String mapnew HashMap(); //把接口文档需要的四个参数封装到map集合中 map.put(appid,weChatProperties.getAppid()); map.put(secret,weChatProperties.getSecret()); map.put(js_code, code); map.put(grant_type,authorization_code); String json HttpClientUtil.doGet(WX_LOGIN, map); JSONObject jsonObject JSON.parseObject(json); String openid jsonObject.getString(openid); return openid; } }Mapperpackage com.sky.mapper; import com.sky.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; Mapper public interface UserMapper { /** * 查询是否为新用户 * param openid * return */ Select(select *from sky_take_out.user where openid#{openid}) User getByOpenid(String openid); /** * 插入数据还要返回主键值要用到 * param user */ void insert(User user); }结语如果对你有帮助请点赞关注收藏
【后端实战】构建微信小程序登录模块,这一篇就够了
个人主页北极的代码欢迎来访作者简介java后端学习者❄️个人专栏苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺前言前面我们简单介绍了如何调用第三方的接口微信小程序的接口这里我们将具体的实现微信登录的业务操作。小程序登录流程时序需求分析类比基于微信登录实现小程序的登录如果是新用户需要自动完成注册第一部分需求分析老板在想什么老板开网吧前得先想清楚我这个网吧到底要提供什么服务给谁用1. 用户角色划分谁进网吧在苍穹外卖中主要有两类人普通用户C端 - 顾客就是来上网点餐的“你”。他们用微信小程序。需求浏览菜单、加购物车、下单支付、查看订单状态。商家/管理员B端 - 网管/老板管理网吧的人。他们用电脑浏览器后台管理系统。需求菜品管理上架下架、套餐管理、订单处理接单、完成、营业数据分析。2. 核心业务流程网吧怎么运转把业务流程串起来看顾客浏览菜单 → 加购物车 → 下单 → 支付 → 商家接单 → 制作 → 配送/自取每一步背后都需要系统提供支持。3. 功能需求与非功能需求必须有的和最好有的功能需求必须有用户端登录授权、菜品浏览、购物车、下单支付、历史订单。管理端菜品管理、员工管理、分类管理、订单管理、数据统计。非功能需求最好有的性能中午高峰期比如1130-1230几百人同时下单系统不能卡死。安全不能让别人随意修改别人的订单。可用性7x24小时稳定运行。第二部分接口设计把想法画成图纸想清楚了要做什么接下来就是具体怎么实现。接口设计就是定义“前后端之间怎么对话”。还是用“点餐”这个核心功能来举例看看从需求到接口是怎么一步步落地的。案例C端用户点餐1. 需求描述用户打开小程序看到菜品列表点击“加入购物车”然后去结算下单最后支付。2. 接口设计概览设计图纸长什么样接口文档通常包含以下要素请求路径URL地址如/user/cart/add请求方式GET获取、POST新增/提交、PUT修改、DELETE删除请求参数需要传什么数据给后端返回数据后端会返回什么结果3. 具体接口举例接口一获取菜品列表需求分析用户想看“川菜”分类下有什么菜。接口设计路径/user/dish/list方式GET参数categoryId分类ID比如川菜的ID是101返回菜品的数组包含名称、图片、价格、口味等。形象解释你问网管“有没有川菜菜单”网管把川菜单页递给你。接口二加入购物车需求分析用户看中了“鱼香肉丝”想点一份。接口设计路径/user/shoppingCart/add方式POST参数dishId菜品ID、dishFlavor口味比如“微辣”返回提示成功或失败。形象解释你对网管喊“帮我记一下鱼香肉丝微辣我要了”网管拿小本本记下来。接口三提交订单需求分析用户选完了准备结账。接口设计路径/user/order/submit方式POST参数amount总价、addressId收货地址、payMethod支付方式、remark备注比如“不要香菜”返回订单ID、预支付信息。形象解释你拿着小本本去前台“就这些算账我用微信支付。”接口四商家接单需求分析网管/后厨看到新订单准备制作。接口设计路径/admin/order/confirm方式PUT参数orderId订单ID返回操作成功。形象解释网管扫了一眼电脑屏幕点了一下“确认接单”厨房打印机开始出票。第三部分设计规范与原则画图纸的规矩为了保证画出来的图纸大家都能看懂苍穹外卖通常会遵循一些规范RESTful 风格用请求方式区分动作。GET/orders查列表POST/orders新建GET/orders/{id}查某个具体订单PUT/orders/{id}修改某个具体订单路径前缀/user/给小程序用户用的接口。/admin/给后台管理员用的接口。这样做便于区分权限。形象解释顾客走前门/user员工走后门/admin。统一返回结果所有接口都返回固定格式的数据比如json{ code: 1, // 1成功0失败 msg: 操作成功, // 提示信息 data: { ... } // 真正的数据 }JWT Token 验证除了登录接口其他接口都需要在请求头里带上token刚才说的网吧会员卡用来识别身份。总结需求分析是“做什么”——决定菜单上有鱼香肉丝而且可以选辣度。接口设计是“怎么做”——定义清楚顾客怎么点餐传什么参数走哪个窗口。在苍穹外卖中当我们看到类似这样的结构时就能对应起来了需求用户登录 -接口POST/user/user/login(参数code)需求管理员新增菜品 -接口POST/admin/dish(参数json格式的菜品信息头token)小程序登录的解释第一步出示身份证获取code你走到前台对网管说“老板开台机子。”网管不会直接给你开机他会先问你“身份证带了吗”你把身份证递给他。对应技术动作你 微信小程序身份证wx.login() 接口网管要身份证 小程序调用微信官方接口获取一个临时的、一次性的凭证叫做code。第二步网管去公安局系统核验后端请求微信服务器网管拿到你的身份证后他不会凭肉眼看看就相信你他会把身份证号输入到公安内部系统里进行查询。这个公安系统里记录了你的真实姓名、年龄、是否有案底等信息。公安系统验证通过后会给网管返回一个确认信息“此人真实有效可以上网。”对应技术动作网管苍穹外卖的后端服务器Java程序公安系统微信服务器输入身份证号查询 后端拿着小程序传来的code加上自己的AppID和AppSecret相当于派出所的接入密码去请求微信服务器。返回确认信息 微信服务器返回openid用户的唯一身份证号和session_key会话密钥。第三步网管给你办一张“网吧会员卡”下发自定义登录态公安系统确认你是好公民后网管不会每次都让你把身份证拿出来刷那样太慢了。所以网管会在他的网吧系统里给你建立一个档案如果第一次来的话然后发给你一张“网吧临时会员卡”。这张卡上有你的信息比如卡号 9527但最重要的是这张卡只有在这家网吧苍穹外卖才有效。下次你来直接刷卡就行了不用再出示身份证。对应技术动作建立档案 后端数据库查询openid如果没找到就在user表里新注册一条记录。制作会员卡 后端根据user_id生成一个自定义的登录凭证比如jwt_tokenJSON Web Token。这个token就相当于网吧的会员卡。递给你卡 后端把这个token返回给小程序。第四步拿着卡去上网携带token访问业务拿到会员卡后你走到电脑前刷一下卡或者输入卡号电脑解锁你就可以点炒饭、点可乐了。对应技术动作刷一下卡 小程序后续请求比如点餐、查询订单的请求头中都会带上这个token。电脑解锁 后端每次收到请求先验证token是不是真的、有没有过期。验证通过就知道你是哪个用户了user_id是多少然后才给你处理具体的业务逻辑比如把订单关联到你的ID上。总结一下这个流程的要点为什么不用微信直接登录因为安全问题。直接传微信号太危险所以微信设计了一个“介绍信机制”小程序拿着code介绍信给后端后端拿着code去微信官方那里换openid用户真实身份。这样openid永远只保存在后端小程序端是拿不到的保证了安全。苍穹外卖的具体实现Controller 接收LoginController接收小程序传来的code。Service 调用微信 APILoginService调用WeChatUtil的工具类通过code请求微信的jscode2session接口拿到openid。数据库操作根据openid查询user表如果没有就创建新用户。生成 JWT用用户的ID生成一个JWT Token。返回结果将token返回给小程序小程序存起来后续请求都带上。这样一来小程序用户就在苍穹外卖系统里完成了一次丝滑的匿名转实名的登录过程。微信登录在小程序里扮演什么角色微信登录就是这个小程序平板用来确认你是谁的一种方式。没有微信登录会怎样你坐在餐桌前点了一堆菜然后平板问请先登录。你说怎么登平板说输入用户名密码或者手机号注册一下。你心想吃个饭还要注册太麻烦了换一家吧。这就是没有微信登录的问题——用户流失率会非常高。有了微信登录会怎样你打开平板上面只有一个按钮微信一键登录。你点一下屏幕跳转到微信授权页面你点允许咻的一下你就登录成功了直接开始点菜。所以微信登录 让用户不用注册直接使用微信身份进来的快速通道。两者结合具体怎么工作还是用刚才点餐平板的场景步骤小程序在做什么微信登录在做什么后端在做什么1你打开平板小程序显示一个微信登录按钮—等着接收请求2你点按钮小程序调用wx.login()接口拿到一个临时的code微信告诉你这是这个用户的临时身份证—3小程序把这个 code 发给自己家的后端—后端拿着 code 去问微信这个 code 对应谁4—微信告诉后端这是 openidxxx 的用户后端收到 openid在自己数据库里找或创建用户生成一张会员卡token5小程序收到后端返回的 token把它存起来—后端把 token 返回给小程序6接下来你点菜、下单小程序都在请求里带上这个 token—后端看到 token就知道你是谁给你处理对应的业务为什么不能没有小程序开发你可能会想那能不能直接让用户用微信登录然后就用微信本身点餐这就好比问能不能直接用身份证去点菜不要点餐平板不行因为微信是通用工具不是专用工具微信能发消息、发朋友圈、支付但它不知道你的餐厅菜单长什么样。小程序是在微信里跑的一个专门应用专门为你的餐厅设计的。界面需要定制你的菜品图片要展示得漂亮购物车要方便修改这些都需要小程序开发者来设计和实现。微信本身不会帮你做这些。业务逻辑需要代码满减优惠怎么算套餐怎么组合这些逻辑都在小程序的代码里。总结一下三者的关系微信 操作系统/平台像Windows小程序 运行在微信里的APP像Word、Excel微信登录 小程序里用微信身份快速进入的功能开发者的分工小程序开发者负责把界面做漂亮把用户操作收集起来发给后端。后端开发者负责处理业务逻辑管理数据库对接微信服务器。微信登录是连接用户身份和业务系统的一座桥。所以在苍穹外卖项目中小程序开发让你能看见菜品、点击加入购物车、点击下单。微信登录让你点击下单时系统知道这是你下的单而不是别人。具体实现Cotrollerpackage com.sky.controller.user; import com.sky.constant.JwtClaimsConstant; import com.sky.dto.UserLoginDTO; import com.sky.entity.User; import com.sky.properties.JwtProperties; import com.sky.result.Result; import com.sky.service.UserService; import com.sky.utils.JwtUtil; import com.sky.vo.UserLoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; RestController RequestMapping(/user/user) Api(tags C端用户相关接口) Slf4j public class UserController { Autowired private UserService userService; Autowired private JwtProperties jwtProperties; /** * 微信登录 * param userLoginDTO * return */ GetMapping(/login) ApiOperation(微信登录) public ResultUserLoginVO login(RequestBody UserLoginDTO userLoginDTO){ log.info(微信用户登录:{},userLoginDTO); //微信登录 User user userService.wxLogin(userLoginDTO); //为用户生成jwt令牌 MapString, Object claimsnew HashMap(); claims.put(JwtClaimsConstant.USER_ID,user.getId()); String token JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims); UserLoginVO userLoginVOUserLoginVO.builder() .id(user.getId()) .openid(user.getOpenid()) .token(token) .build(); return Result.success(userLoginVO); } }ServiceService Slf4j public class UserServiceImpl implements UserService { Autowired private WeChatProperties weChatProperties; Autowired private UserMapper userMapper; //微信接口的地址 public static final String WX_LOGINhttps://api.weixin.qq.com/sns/jscode2session; /** * 微信登录 * param userLoginDTO * return */ public User wxLogin(UserLoginDTO userLoginDTO) { //具体怎么实现的操作 String openid getOpenid(userLoginDTO.getCode()); //判断openid是否为空如果为空则登录失败抛出业务异常 if (openidnull){ throw new LoginFailedException(MessageConstant.LOGIN_FAILED); } //判断当前用户是否为新用户 User user userMapper.getByOpenid(openid); //如果是新用户自动完成注册相当于就是在数据库中插入没有的数据 if (usernull){ user User.builder() .openid(openid) .createTime(LocalDateTime.now()) .build(); userMapper.insert(user); } return null; } private String getOpenid(String code) { //调用微信接口的服务获得当前用户的openid使用前面学习的httpclient MapString, String mapnew HashMap(); //把接口文档需要的四个参数封装到map集合中 map.put(appid,weChatProperties.getAppid()); map.put(secret,weChatProperties.getSecret()); map.put(js_code, code); map.put(grant_type,authorization_code); String json HttpClientUtil.doGet(WX_LOGIN, map); JSONObject jsonObject JSON.parseObject(json); String openid jsonObject.getString(openid); return openid; } }Mapperpackage com.sky.mapper; import com.sky.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; Mapper public interface UserMapper { /** * 查询是否为新用户 * param openid * return */ Select(select *from sky_take_out.user where openid#{openid}) User getByOpenid(String openid); /** * 插入数据还要返回主键值要用到 * param user */ void insert(User user); }结语如果对你有帮助请点赞关注收藏