赞
踩
ps:springboot结合mybatisPlus、mysql实现,简单易懂,一件粘贴使用,详细往下看↓
1.注册微信开发平台账号,并创建小程序,获取小程序的AppID和AppSecret。
2.在小程序中引导用户点击按钮触发微信登录,获取到code。
3.将code发送到后端,后端通过code获取用户的openid和session_key。
4.使用session_key对用户数据进行解密,获取用户信息、头像、手机号等数据。
5.将用户数据保存到数据库中,或者通过其他方式进行业务处理。
详细代码及步骤:
首先需要创建一个MySQL数据库,命名为 wechat_mini_program
,并创建以下数据表:
- CREATE TABLE `user` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `open_id` varchar(255) DEFAULT NULL COMMENT '用户唯一标识',
- `session_key` varchar(255) DEFAULT NULL COMMENT '会话密钥',
- `nickname` varchar(255) DEFAULT NULL COMMENT '用户昵称',
- `avatar_url` varchar(255) DEFAULT NULL COMMENT '用户头像',
- `gender` tinyint(1) DEFAULT NULL COMMENT '用户性别(0:未知,1:男性,2:女性)',
- `country` varchar(255) DEFAULT NULL COMMENT '用户所在国家',
- `province` varchar(255) DEFAULT NULL COMMENT '用户所在省份',
- `city` varchar(255) DEFAULT NULL COMMENT '用户所在城市',
- `phone_number` varchar(20) DEFAULT NULL COMMENT '用户手机号',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
在 pom.xml
文件中添加以下依赖:
- <dependencies>
- <!-- Spring Boot 相关依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <!-- MyBatis Plus 相关依赖 -->
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>3.4.3.1</version>
- </dependency>
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-generator</artifactId>
- <version>3.4.3.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.velocity</groupId>
- <artifactId>velocity-engine-core</artifactId>
- <version>2.2</version>
- </dependency>
-
- <!-- MySQL 驱动依赖 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.27</version>
- </dependency>
-
- <!-- 微信小程序 SDK 依赖 -->
- <dependency>
- <groupId>com.github.binarywang</groupId>
- <artifactId>weixin-java-miniapp</artifactId>
- <version>3.8.0</version>
- </dependency>
- </dependencies>
在 application.yml
文件中添加以下配置:
- spring:
- datasource:
- url: jdbc:mysql://localhost:3306/wechat_mini_program?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
- username: root
- password: root
- driver-class-name: com.mysql.cj.jdbc.Driver
-
- mybatis-plus:
- mapper-locations: classpath:mapper/*.xml
- type-aliases-package: com.example.demo.entity
- global-config:
- db-config:
- id-type: auto
- table-prefix: mp_
- field-strategy: not_empty
- #
创建一个 User
实体类,用于表示用户信息:
- package com.example.demo.entity;
-
- import com.baomidou.mybatisplus.annotation.IdType;
- import com.baomidou.mybatisplus.annotation.TableField;
- import com.baomidou.mybatisplus.annotation.TableId;
- import com.baomidou.mybatisplus.annotation.TableName;
- import lombok.Data;
-
- @Data
- @TableName("user")
- public class User {
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- @TableField("open_id")
- private String openId;
-
- @TableField("session_key")
- private String sessionKey;
-
- @TableField("nickname")
- private String nickname;
-
- @TableField("avatar_url")
- private String avatarUrl;
-
- @TableField("gender")
- private Integer gender;
-
- @TableField("country")
- private String country;
-
- @TableField("province")
- private String province;
-
- @TableField("city")
- private String city;
-
- @TableField("phone_number")
- private String phoneNumber;
- }
创建一个 UserMapper
接口,用于定义对 user
表的操作:
- package com.example.demo.mapper;
-
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.example.demo.entity.User;
-
- public interface UserMapper extends BaseMapper<User> {
- }
创建一个 UserService
接口,用于定义对用户信息的操作:
- package com.example.demo.service;
-
- import com.baomidou.mybatisplus.extension.service.IService;
- import com.example.demo.entity.User;
-
- public interface UserService extends IService<User> {
- User getUserByOpenId(String openId);
- boolean saveOrUpdateUser(User user);
- }
创建一个 UserServiceImpl
类,实现 UserService
接口:
- package com.example.demo.service.impl;
-
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.example.demo.entity.User;
- import com.example.demo.mapper.UserMapper;
- import com.example.demo.service.UserService;
- import org.springframework.stereotype.Service;
-
- @Service
- public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
- @Override
- public User getUserByOpenId(String openId) {
- return this.baseMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId));
- }
-
- @Override
- public boolean saveOrUpdateUser(User user) {
- return this.saveOrUpdate(user);
- }
- }
创建一个 UserController
类,用于处理用户信息的请求:
- package com.example.demo.controller;
-
- import cn.binarywang.wx.miniapp.api.WxMaService;
- import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
- import com.example.demo.entity.User;
- import com.example.demo.service.UserService;
- import lombok.extern.slf4j.Slf4j;
- import me.chanjar.weixin.common.error.WxErrorException;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- @RequestMapping("/user")
- @Slf4j
- public class UserController {
- @Autowired
- private WxMaService wxMaService;
-
- @Autowired
- private UserService userService;
-
- /**
- * 登录接口
- */
- @PostMapping("/login")
- public Result<Object> login(@RequestParam("code") String code, @RequestParam("encryptedData") String encryptedData,
- @RequestParam("iv") String iv) {
- try {
- // 调用微信 API 获取用户的 openid 和 session_key
- WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
- String openid = session.getOpenid();
-
- // 调用微信 API 获取用户的手机号
- WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), encryptedData, iv);
- String phoneNumber = phoneInfo.getPhoneNumber();
-
- // 调用微信 API 获取用户的详细信息
- WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session.getSessionKey(), code);
- // 获取用户昵称
- String nickName = userInfo.getNickName();
- // 获取用户头像
- String avatarUrl = userInfo.getAvatarUrl();
- // 获取用户国家
- String country = userInfo.getCountry();
- // 获取用户省份
- String province = userInfo.getProvince();
- // 获取用户城市
- String city = userInfo.getCity();
-
- // 将用户信息保存到数据库中
- User user = userService.getByOpenId(openid);
- if (user == null) {
- user = new User();
- user.setOpenId(openid);
- user.setNickName(nickName);
- user.setAvatarUrl(avatarUrl);
- user.setCountry(country);
- user.setProvince(province);
- user.setCity(city);
- user.setPhoneNumber(phoneNumber);
- userService.add(user);
- } else {
- user.setNickName(nickName);
- user.setAvatarUrl(avatarUrl);
- user.setCountry(country);
- user.setProvince(province);
- user.setCity(city);
- user.setPhoneNumber(phoneNumber);
- userService.update(user);
- }
-
- // 返回用户信息
- Map<String, Object> data = new HashMap<>();
- data.put("openid", openid);
- data.put("nickName", nickName);
- data.put("avatarUrl", avatarUrl);
- data.put("country", country);
- data.put("province", province);
- data.put("city", city);
- data.put("phoneNumber", phoneNumber);
- return Result.success(data);
- } catch (WxErrorException e) {
- log.error("登录失败:" + e.getMessage(), e);
- return Result.error("登录失败:" + e.getMessage());
- }
- /**
- * 更新用户信息接口
- */
- @PostMapping("/update")
- public String updateUserInfo(@RequestBody User user) {
- if (user == null || user.getOpenId() == null) {
- return "用户信息不能为空";
- }
-
- if (userService.saveOrUpdateUser(user)) {
- return "更新用户信息成功";
- } else {
- return "更新用户信息失败";
- }
- }
- }
8. 数据库表创建语句
-
-
- 创建 `user` 表的 SQL 语句如下:
-
- ```sql
- CREATE TABLE `user` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
- `open_id` varchar(255) NOT NULL COMMENT '用户 openid',
- `session_key` varchar(255) DEFAULT NULL COMMENT '用户 session_key',
- `nickname` varchar(255) DEFAULT NULL COMMENT '用户昵称',
- `avatar_url` varchar(255) DEFAULT NULL COMMENT '用户头像 URL',
- `gender` int(11) DEFAULT NULL COMMENT '用户性别,0:未知,1:男性,2:女性',
- `country` varchar(255) DEFAULT NULL COMMENT '用户所在国家',
- `province` varchar(255) DEFAULT NULL COMMENT '用户所在省份',
- `city` varchar(255) DEFAULT NULL COMMENT '用户所在城市',
- `phone_number` varchar(20) DEFAULT NULL COMMENT '用户手机号',
- PRIMARY KEY (`id`),
- UNIQUE KEY `open_id_UNIQUE` (`open_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
9:pom.xml 配置文件
需要引入以下依赖包:
- <!-- mybatis-plus -->
- <dependency>
- <groupId>com.baomidou.mybatisplus</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>3.4.3.1</version>
- </dependency>
-
- <!-- mysql -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.26</version>
- </dependency>
-
- <!-- weixin-java-miniapp -->
- <dependency>
- <groupId>me.chanjar.weixin</groupId>
- <artifactId>weixin-java-miniapp</artifactId>
- <version>3.9.0</version>
- </dependency>
10:业务解释和调用流程
本代码实现了小程序用户登录和更新用户信息的功能。
调用流程如下:
wx.login
方法获取 code
code
传给后端的 /user/login
接口wxMaService.getUserService().getSessionInfo(code)
方法获取 session_key
和 openid
openid
查询用户信息,如果用户不存在则创建新用户openid
给小程序前端wx.getUserProfile
方法获取用户信息(如昵称、头像等)(代码login已经更新为后端获取,如果前端获取稍微改一下就好)openid
一起传给后端的 /user/update
接口后端更新用户信息,并返回更新结果给小程序前端
over!
总:以上就是本代码实现的业务流程,具体实现可以参考上面给出的代码和注释。
需要注意的是,在使用本代码时,需要在小程序后台创建小程序并获取 appid
和 appsecret
,并在代码中进行相应的配置。另外,还需要在微信开放平台申请相应的权限并获取 access_token
。具体操作可以参考微信官方文档。
ps:上面给出的代码可以作为一个基础的实现,可以在此基础上进行进一步的开发和优化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。