目录

一 . 流程总览

二 . 操作流程

2.1 准备工作

2.2 向idea发送code

2.3 Idea代码编写

以下是需要用到的网站:

一 . 流程总览

        以下是微信小程序开发官网的登陆开发流程图:

我将其大致分成三个部分:

1.向idea发送code

2.idea代码编写:在Service层使用HttpClient技术获取Openid,并完成登陆操作,然后在Controller层编写JWT令牌。

3.之后小程序端登陆后访问其他页面可以通过JWT令牌避免重复登录(与网页端相同)

二 . 操作流程

2.1 准备工作

        1. 定义小程序端的JWT令牌校验类,这一步可以复制网页端的,在其上进行简单修改即可

        2.配置appidsecret密钥,这两个可以在这里获得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。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐