失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > (详细版)java实现小程序获取微信登录 用户信息 手机号 头像

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

时间:2019-07-19 06:56:18

相关推荐

(详细版)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文件中添加以下依赖:

<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>

3:配置文件

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

spring:datasource:url: jdbc:mysql://localhost:3306/wechat_mini_program?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.demo.entityglobal-config:db-config:id-type: autotable-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<User> {}

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> {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;@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic User getUserByOpenId(String openId) {return this.baseMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId));}@Overridepublic 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.mon.error.WxErrorException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/user")@Slf4jpublic class UserController {@Autowiredprivate WxMaService wxMaService;@Autowiredprivate UserService userService;/*** 登录接口*/@PostMapping("/login")public Result<Object> login(@RequestParam("code") String code, @RequestParam("encryptedData") String encryptedData,@RequestParam("iv") String iv) {try {// 调用微信 API 获取用户的 openid 和 session_keyWxMaJscode2SessionResult 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 语句如下:```sqlCREATE 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_keyopenid后端根据openid查询用户信息,如果用户不存在则创建新用户后端返回openid给小程序前端小程序前端使用wx.getUserProfile方法获取用户信息(如昵称、头像等)(代码login已经更新为后端获取,如果前端获取稍微改一下就好)小程序前端将用户信息和openid一起传给后端的/user/update接口

后端更新用户信息,并返回更新结果给小程序前端

over!

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

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

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

如果觉得《(详细版)java实现小程序获取微信登录 用户信息 手机号 头像》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。