(详细版)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,并创建以下数据表:
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='用户表';
2:引入依赖
在 pom.xml 文件中添加以下依赖:
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.4.3.1
com.baomidou
mybatis-plus-generator
3.4.3.1
org.apache.velocity
velocity-engine-core
2.2
mysql
mysql-connector-java
8.0.27
com.github.binarywang
weixin-java-miniapp
3.8.0
3:配置文件
在 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
#
4:实体类
创建一个 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;
}
5:Mapper接口
创建一个 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 {
}
6:Service层
创建一个 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 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 implements UserService {
@Override
public User getUserByOpenId(String openId) {
return this.baseMapper.selectOne(new LambdaQueryWrapper().eq(User::getOpenId, openId));
}
@Override
public boolean saveOrUpdateUser(User user) {
return this.saveOrUpdate(user);
}
}
7:Controller层
创建一个 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 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 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 配置文件
需要引入以下依赖包:
com.baomidou.mybatisplus
mybatis-plus-boot-starter
3.4.3.1
mysql
mysql-connector-java
8.0.26
me.chanjar.weixin
weixin-java-miniapp
3.9.0
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:上面给出的代码可以作为一个基础的实现,可以在此基础上进行进一步的开发和优化。
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/18a98be099.html
