【苍穹外卖】Day06--微信登陆超详细流程
在微信开发工具里,当我们点击确定登录时,就会向idea发送一段code(具体代码在第六天的资料当中,导入开发工具即可)重点是Service层的代码,要调用到HttpClient这个技术(调用第三方API)1. 定义小程序端的JWT令牌校验类,这一步可以复制网页端的,在其上进行简单修改即可。在Service类中,调用getOpenid方法,使用HttpClient返回Openid。在Mapper层中
目录
以下是需要用到的网站:
- 小程序开发文档:微信开放文档 / 开发
- 小程序管理:微信公众平台
一 . 流程总览
以下是微信小程序开发官网的登陆开发流程图:

我将其大致分成三个部分:
1.向idea发送code
2.idea代码编写:在Service层使用HttpClient技术获取Openid,并完成登陆操作,然后在Controller层编写JWT令牌。
3.之后小程序端登陆后访问其他页面可以通过JWT令牌避免重复登录(与网页端相同)
二 . 操作流程
2.1 准备工作
1. 定义小程序端的JWT令牌校验类,这一步可以复制网页端的,在其上进行简单修改即可

2.配置appid和secret密钥,这两个可以在这里获得https://mp.weixin.qq.com/,将其配置到yml文件中。

2.2 向idea发送code
在微信开发工具里,当我们点击确定登录时,就会向idea发送一段code(具体代码在第六天的资料当中,导入开发工具即可)


而在idea中,我们也有对应的DTO接受code:

2.3 Idea代码编写
在Controller层与网页端的登录代码逻辑相似
@RestController
@RequestMapping("/user/user")
@Slf4j
public class UserController {
@Autowired
UserService userService;
@Autowired
private JwtProperties jwtProperties;
/**
* 微信登陆
* @param userLoginDTO
* @return
*/
@PostMapping("/login")
public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO){
log.info("微信用户登录:{}",userLoginDTO.getCode());
//微信登陆
User user = userService.wxLogin(userLoginDTO);
//为微信用户生成JWT令牌
Map<String,Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.USER_ID,user.getId());
String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
UserLoginVO userLoginVO = UserLoginVO.builder()
.id(user.getId())
.openid(user.getOpenid())
.token(token)
.build();
return Result.success(userLoginVO);
}
}
重点是Service层的代码,要调用到HttpClient这个技术(调用第三方API)
以下是开发文档中提到的所需参数:
在Service类中,调用getOpenid方法,使用HttpClient返回Openid
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
//微信服务接口地址
public static final String WE_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
private final WeChatProperties weChatProperties;
public UserServiceImpl(WeChatProperties weChatProperties) {
this.weChatProperties = weChatProperties;
}
/**
* 微信登陆
* @param userLoginDTO
*/
public User wxLogin(UserLoginDTO userLoginDTO) {
//调用微信接口服务,获得当前微信的openid
String openid = getOpenid(userLoginDTO.getCode());
//判断openid是否为空,如果为空,表示登陆失败,抛出登陆异常
if(openid == null){
throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
}
//判断当前用户是否为新用户
User user = userMapper.getByOpenid(openid);
//如果是新用户,自动完成注册
if(user == null){
//是新用户,自动完成注册
User.builder()
.openid(openid)
.createTime(LocalDateTime.now())
.build();
//
userMapper.insert(user);
}
//返回用户对象
return user;
}
/**
* 调用微信接口服务,获得当前微信的openid
* @param code
* @return
*/
private String getOpenid(String code){
Map<String,String> map = new HashMap<>();
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(WE_LOGIN, map);
JSONObject jsonObject = JSON.parseObject(json);
String openid = jsonObject.getString("openid");
return openid;
}
}
在Mapper层中就是传统的查找,插入SQL。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)