当前位置:   article > 正文

(详细版)java实现小程序获取微信登录,用户信息,手机号,头像_java获取微信小程序用户信息

java获取微信小程序用户信息

ps:springboot结合mybatisPlus、mysql实现,简单易懂,一件粘贴使用,详细往下看↓

步骤:


        

1.注册微信开发平台账号,并创建小程序,获取小程序的AppID和AppSecret。
2.在小程序中引导用户点击按钮触发微信登录,获取到code。
3.将code发送到后端,后端通过code获取用户的openid和session_key。
4.使用session_key对用户数据进行解密,获取用户信息、头像、手机号等数据。
5.将用户数据保存到数据库中,或者通过其他方式进行业务处理。
详细代码及步骤:

1:创建数据库

首先需要创建一个MySQL数据库,命名为 wechat_mini_program,并创建以下数据表:

  1. CREATE TABLE `user` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `open_id` varchar(255) DEFAULT NULL COMMENT '用户唯一标识',
  4. `session_key` varchar(255) DEFAULT NULL COMMENT '会话密钥',
  5. `nickname` varchar(255) DEFAULT NULL COMMENT '用户昵称',
  6. `avatar_url` varchar(255) DEFAULT NULL COMMENT '用户头像',
  7. `gender` tinyint(1) DEFAULT NULL COMMENT '用户性别(0:未知,1:男性,2:女性)',
  8. `country` varchar(255) DEFAULT NULL COMMENT '用户所在国家',
  9. `province` varchar(255) DEFAULT NULL COMMENT '用户所在省份',
  10. `city` varchar(255) DEFAULT NULL COMMENT '用户所在城市',
  11. `phone_number` varchar(20) DEFAULT NULL COMMENT '用户手机号',
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

2:引入依赖

pom.xml 文件中添加以下依赖:

  1. <dependencies>
  2. <!-- Spring Boot 相关依赖 -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!-- MyBatis Plus 相关依赖 -->
  8. <dependency>
  9. <groupId>com.baomidou</groupId>
  10. <artifactId>mybatis-plus-boot-starter</artifactId>
  11. <version>3.4.3.1</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.baomidou</groupId>
  15. <artifactId>mybatis-plus-generator</artifactId>
  16. <version>3.4.3.1</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.velocity</groupId>
  20. <artifactId>velocity-engine-core</artifactId>
  21. <version>2.2</version>
  22. </dependency>
  23. <!-- MySQL 驱动依赖 -->
  24. <dependency>
  25. <groupId>mysql</groupId>
  26. <artifactId>mysql-connector-java</artifactId>
  27. <version>8.0.27</version>
  28. </dependency>
  29. <!-- 微信小程序 SDK 依赖 -->
  30. <dependency>
  31. <groupId>com.github.binarywang</groupId>
  32. <artifactId>weixin-java-miniapp</artifactId>
  33. <version>3.8.0</version>
  34. </dependency>
  35. </dependencies>

3:配置文件

application.yml 文件中添加以下配置:

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/wechat_mini_program?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
  4. username: root
  5. password: root
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. mybatis-plus:
  8. mapper-locations: classpath:mapper/*.xml
  9. type-aliases-package: com.example.demo.entity
  10. global-config:
  11. db-config:
  12. id-type: auto
  13. table-prefix: mp_
  14. field-strategy: not_empty
  15. #

4:实体类

创建一个 User 实体类,用于表示用户信息:

  1. package com.example.demo.entity;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import lombok.Data;
  7. @Data
  8. @TableName("user")
  9. public class User {
  10. @TableId(value = "id", type = IdType.AUTO)
  11. private Long id;
  12. @TableField("open_id")
  13. private String openId;
  14. @TableField("session_key")
  15. private String sessionKey;
  16. @TableField("nickname")
  17. private String nickname;
  18. @TableField("avatar_url")
  19. private String avatarUrl;
  20. @TableField("gender")
  21. private Integer gender;
  22. @TableField("country")
  23. private String country;
  24. @TableField("province")
  25. private String province;
  26. @TableField("city")
  27. private String city;
  28. @TableField("phone_number")
  29. private String phoneNumber;
  30. }

5:Mapper接口

创建一个 UserMapper 接口,用于定义对 user 表的操作:

  1. package com.example.demo.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.example.demo.entity.User;
  4. public interface UserMapper extends BaseMapper<User> {
  5. }

6:Service层

创建一个 UserService 接口,用于定义对用户信息的操作:

  1. package com.example.demo.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.example.demo.entity.User;
  4. public interface UserService extends IService<User> {
  5. User getUserByOpenId(String openId);
  6. boolean saveOrUpdateUser(User user);
  7. }

创建一个 UserServiceImpl 类,实现 UserService 接口:

  1. package com.example.demo.service.impl;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import com.example.demo.entity.User;
  4. import com.example.demo.mapper.UserMapper;
  5. import com.example.demo.service.UserService;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  9. @Override
  10. public User getUserByOpenId(String openId) {
  11. return this.baseMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId));
  12. }
  13. @Override
  14. public boolean saveOrUpdateUser(User user) {
  15. return this.saveOrUpdate(user);
  16. }
  17. }

7:Controller层

创建一个 UserController 类,用于处理用户信息的请求:

  1. package com.example.demo.controller;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  4. import com.example.demo.entity.User;
  5. import com.example.demo.service.UserService;
  6. import lombok.extern.slf4j.Slf4j;
  7. import me.chanjar.weixin.common.error.WxErrorException;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.web.bind.annotation.*;
  10. @RestController
  11. @RequestMapping("/user")
  12. @Slf4j
  13. public class UserController {
  14. @Autowired
  15. private WxMaService wxMaService;
  16. @Autowired
  17. private UserService userService;
  18. /**
  19. * 登录接口
  20. */
  21. @PostMapping("/login")
  22. public Result<Object> login(@RequestParam("code") String code, @RequestParam("encryptedData") String encryptedData,
  23. @RequestParam("iv") String iv) {
  24. try {
  25. // 调用微信 API 获取用户的 openid 和 session_key
  26. WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
  27. String openid = session.getOpenid();
  28. // 调用微信 API 获取用户的手机号
  29. WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), encryptedData, iv);
  30. String phoneNumber = phoneInfo.getPhoneNumber();
  31. // 调用微信 API 获取用户的详细信息
  32. WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session.getSessionKey(), code);
  33. // 获取用户昵称
  34. String nickName = userInfo.getNickName();
  35. // 获取用户头像
  36. String avatarUrl = userInfo.getAvatarUrl();
  37. // 获取用户国家
  38. String country = userInfo.getCountry();
  39. // 获取用户省份
  40. String province = userInfo.getProvince();
  41. // 获取用户城市
  42. String city = userInfo.getCity();
  43. // 将用户信息保存到数据库中
  44. User user = userService.getByOpenId(openid);
  45. if (user == null) {
  46. user = new User();
  47. user.setOpenId(openid);
  48. user.setNickName(nickName);
  49. user.setAvatarUrl(avatarUrl);
  50. user.setCountry(country);
  51. user.setProvince(province);
  52. user.setCity(city);
  53. user.setPhoneNumber(phoneNumber);
  54. userService.add(user);
  55. } else {
  56. user.setNickName(nickName);
  57. user.setAvatarUrl(avatarUrl);
  58. user.setCountry(country);
  59. user.setProvince(province);
  60. user.setCity(city);
  61. user.setPhoneNumber(phoneNumber);
  62. userService.update(user);
  63. }
  64. // 返回用户信息
  65. Map<String, Object> data = new HashMap<>();
  66. data.put("openid", openid);
  67. data.put("nickName", nickName);
  68. data.put("avatarUrl", avatarUrl);
  69. data.put("country", country);
  70. data.put("province", province);
  71. data.put("city", city);
  72. data.put("phoneNumber", phoneNumber);
  73. return Result.success(data);
  74. } catch (WxErrorException e) {
  75. log.error("登录失败:" + e.getMessage(), e);
  76. return Result.error("登录失败:" + e.getMessage());
  77. }
  78. /**
  79. * 更新用户信息接口
  80. */
  81. @PostMapping("/update")
  82. public String updateUserInfo(@RequestBody User user) {
  83. if (user == null || user.getOpenId() == null) {
  84. return "用户信息不能为空";
  85. }
  86. if (userService.saveOrUpdateUser(user)) {
  87. return "更新用户信息成功";
  88. } else {
  89. return "更新用户信息失败";
  90. }
  91. }
  92. }

8. 数据库表创建语句

  1. 创建 `user` 表的 SQL 语句如下:
  2. ```sql
  3. CREATE TABLE `user` (
  4. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  5. `open_id` varchar(255) NOT NULL COMMENT '用户 openid',
  6. `session_key` varchar(255) DEFAULT NULL COMMENT '用户 session_key',
  7. `nickname` varchar(255) DEFAULT NULL COMMENT '用户昵称',
  8. `avatar_url` varchar(255) DEFAULT NULL COMMENT '用户头像 URL',
  9. `gender` int(11) DEFAULT NULL COMMENT '用户性别,0:未知,1:男性,2:女性',
  10. `country` varchar(255) DEFAULT NULL COMMENT '用户所在国家',
  11. `province` varchar(255) DEFAULT NULL COMMENT '用户所在省份',
  12. `city` varchar(255) DEFAULT NULL COMMENT '用户所在城市',
  13. `phone_number` varchar(20) DEFAULT NULL COMMENT '用户手机号',
  14. PRIMARY KEY (`id`),
  15. UNIQUE KEY `open_id_UNIQUE` (`open_id`)
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

9:pom.xml 配置文件

需要引入以下依赖包:

  1. <!-- mybatis-plus -->
  2. <dependency>
  3. <groupId>com.baomidou.mybatisplus</groupId>
  4. <artifactId>mybatis-plus-boot-starter</artifactId>
  5. <version>3.4.3.1</version>
  6. </dependency>
  7. <!-- mysql -->
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. <version>8.0.26</version>
  12. </dependency>
  13. <!-- weixin-java-miniapp -->
  14. <dependency>
  15. <groupId>me.chanjar.weixin</groupId>
  16. <artifactId>weixin-java-miniapp</artifactId>
  17. <version>3.9.0</version>
  18. </dependency>

10:业务解释和调用流程

本代码实现了小程序用户登录和更新用户信息的功能。

调用流程如下:

  1. 小程序前端调用 wx.login 方法获取 code
  2. 小程序前端将 code 传给后端的 /user/login 接口
  3. 后端调用 wxMaService.getUserService().getSessionInfo(code) 方法获取 session_keyopenid
  4. 后端根据 openid 查询用户信息,如果用户不存在则创建新用户
  5. 后端返回 openid 给小程序前端
  6. 小程序前端使用 wx.getUserProfile 方法获取用户信息(如昵称、头像等)(代码login已经更新为后端获取,如果前端获取稍微改一下就好)
  7. 小程序前端将用户信息和 openid 一起传给后端的 /user/update 接口
  8. 后端更新用户信息,并返回更新结果给小程序前端

over!

总:以上就是本代码实现的业务流程,具体实现可以参考上面给出的代码和注释。

需要注意的是,在使用本代码时,需要在小程序后台创建小程序并获取 appidappsecret,并在代码中进行相应的配置。另外,还需要在微信开放平台申请相应的权限并获取 access_token。具体操作可以参考微信官方文档。

ps:上面给出的代码可以作为一个基础的实现,可以在此基础上进行进一步的开发和优化。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/248272
推荐阅读
相关标签
  

闽ICP备14008679号