java实现微信登录
前言
上一篇做了php的微信登录,所以也总结一下Java的微信授权登录并获取用户信息这个功能的开发流程。
配置
配置什么的就不多说了,详细的配置可以直接前往我上一篇查看。
https://www.cnblogs.com/nothavebug/p/18277732
流程实现(后端)(JAVA)(springboot)
1.首先先配置一下application.yml文件
配置一下微信小程序的Appid 和 appSecret

2.编写控制层
package com.xiangwu.controller.Wx;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiangwu.common.exception.BaseException;
import com.xiangwu.common.exception.BussinessException;
import com.xiangwu.common.exception.MessageConstant;
import com.xiangwu.common.interceptor.BaseContext;
import com.xiangwu.common.interceptor.JwtProperties;
import com.xiangwu.common.jwt.JwtClaimsConstant;
import com.xiangwu.common.response.BaseResponse;
import com.xiangwu.common.utils.JwtUtil;
import com.xiangwu.entiry.Demand;
import com.xiangwu.entiry.Member;
import com.xiangwu.entiry.Member1;
import com.xiangwu.savedto.MemberDto;
import com.xiangwu.savedto.UserLoginDto;
import com.xiangwu.savedto.UserLoginVo;
import com.xiangwu.service.MemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author nothavebug
* @Date 2024/7/2 14:58
* @PackageName:com.yisen.controller
* @ClassName: MenberController
* @Description:
* @Version 1.0
*/
@RestController("wxMemberController")
@RequestMapping("/user")
@Api(tags = "微信登录")
@Slf4j
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
private JwtProperties jwtProperties;
//C端用户登录--微信登录
@PostMapping("/user/login")
@ApiOperation("登录")
public BaseResponse<UserLoginVo> login(@RequestBody UserLoginDto userLoginDto) {
//微信登录
Member1 member = memberService.wxLogin(userLoginDto);
//为微信生成jwt
Map claims = new HashMap();
//用户唯一标识
claims.put(JwtClaimsConstant.USER_ID, member.getId());
String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
//其他处理
return new BaseResponse<>(token);
}
}
3.编写Service层
package com.xiangwu.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiangwu.entiry.Member;
import com.xiangwu.entiry.Member1;
import com.xiangwu.savedto.UserLoginDto;
/**
* @Author nothavebug
* @Date 2024/7/2 14:58
* @PackageName:com.xiangwu.service
* @ClassName: MemberService
* @Description:
* @Version 1.0
*/
public interface MemberService extends IService<Member> {
//微信登录
Member1 wxLogin(UserLoginDto userLoginDto);
}
4.编写Impl
package com.xiangwu.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiangwu.common.exception.LoginFailedException;
import com.xiangwu.common.interceptor.WeChatProperties;
import com.xiangwu.common.utils.HttpClientUtil;
import com.xiangwu.entiry.Demand;
import com.xiangwu.entiry.Member;
import com.xiangwu.entiry.Member1;
import com.xiangwu.mapper.DemandMapper;
import com.xiangwu.mapper.Member1Mapper;
import com.xiangwu.mapper.MemberMapper;
import com.xiangwu.savedto.UserLoginDto;
import com.xiangwu.service.DemandService;
import com.xiangwu.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.security.auth.login.LoginException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @Author nothavebug
* @Date 2024/7/2 14:58
* @PackageName:com.xiangwu.service.impl
* @ClassName: MemberServiceImpl
* @Description:
* @Version 1.0
*/
@Service
@Slf4j
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
@Autowired
private WxMaService wxMaService;
@Autowired
private MemberMapper memberMapper;
@Autowired
private WeChatProperties weChatProperties;
@Autowired
private Member1Mapper member1Mapper;
@Override
public Member1 wxLogin(UserLoginDto userLoginDto) {
String code = userLoginDto.getCode();
try {
WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
String openid = session.getOpenid();
// 调用微信 API 获取用户的手机号
WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), userLoginDto.getEncryptedData(), userLoginDto.getIv());
String phoneNumber = phoneInfo.getPhoneNumber();
if (openid==null){
throw new LoginFailedException("登录失败");
}
Member1 member = memberMapper.getBymobile(phoneNumber);
if (member ==null){
Member1 member1 = new Member1();
member1.setOpenid(openid);
member1.setAddTime(new Date());
member1.setMobile(phoneNumber);
member1.setAvatar("http://springboot.itliu.top/wx/images/20220225072654_1.jpg");
member1.setMemberType("1");
member1Mapper.insert(member1);
}
// 更新openid
LambdaUpdateWrapper<Member1> member1LambdaUpdateWrapper = new LambdaUpdateWrapper<>();
member1LambdaUpdateWrapper.set(Member1::getOpenid,openid)
.eq(Member1::getMobile,phoneNumber);
member1Mapper.update(member,member1LambdaUpdateWrapper);
return member;
} catch (WxErrorException e) {
throw new RuntimeException(e);
}
}
private String getOpenid(String code){
//请求参数封装
Map 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(WX_LOGIN, map);
log.info("微信登录返回结果:{}", json);
//解析json字符串
JSONObject jsonObject = JSON.parseObject(json);
log.info("jsonObject: {}",jsonObject);
String openid = jsonObject.getString("openid");
log.info("微信用户的openid为:{}", openid);
return openid;
}
}
流程实现(前端)(Vue)(uniapp)
前端微信登录流程实现请移步我上一篇:https://www.cnblogs.com/nothavebug/p/18277732
java实现微信登录的更多相关文章
- Java对接微信登录
今天我们来对接微信开放平台的网站应用登录 首先上文档链接:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login ...
- Java 扫描微信公众号二维码,关注并自动登录网站
https://blog.csdn.net/qq_42851002/article/details/81327770 场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: ...
- java实现微信小程序服务端(登录)
微信小程序如今被广泛使用,微信小程序按照微信官网的定义来说就是: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 这就是微信小程序的魅力所在,有 ...
- 关于使用微信登录第三方APP的实现(Android版)
使用微信登录APP,免去注册过程,现在已经有很多的类似应用了.集成该功能过程不复杂,但还是有一些地方需要注意的. 开始之前,需要做下面的准备工作. 1.到微信开放平台注册你的APP,并申请开通微信登录 ...
- Java企业微信开发_03_通讯录同步
一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...
- Android微信登录、分享、支付
转载需要著名出处: http://blog.csdn.net/lowprofile_coding/article/details/78004224 之前写过微信登录分享支付第一版: http://bl ...
- android微信登录,分享
这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...
- "errcode":40163,"errmsg":"code been used...报错,做PC微信登录时出现code been used...报错问题
这是一个坑,一个巨坑,一个恶心的坑 出现这个问题的大概意思就是微信回调了两次登录接口,code使用了两次,而在微信官方文档上写着code只能用一次,用来获取access_token,但我TM看着就糊涂 ...
- 使用SpringSocial开发微信登录
⒈编写微信用户对应的数据结构 package cn.coreqi.social.weixin.entities; /** * 微信用户实体类 */ public class WeixinUserInf ...
随机推荐
- 解放双手!这个插件只要一张表就能生成CRUD代码
大家好,我是 Java陈序员. 问君能有几多愁,代码一行又一行! 作为码农,代码是写不完的,而偷懒又是人的天性,能少干一点就少干一点. 今天,给大家介绍一个 IDEA 插件,帮助你快速生成出 CRUD ...
- SWAG反向代理Jellyfin媒体服务器流量教程
目录 1. 简介 1.1 Jellyfin媒体服务器 1.2 SWAG服务器 2. 设置Jellyfin开启HTTPS访问 3. 安装并配置SWAG服务器反向代理Jellyfin流量 3.1 安装SW ...
- 02 go-zero入门--微服务demo
参考文档: https://go-zero.dev/cn/docs/advance/rpc-call 视频地址: https://space.bilibili.com/387126464/channe ...
- 运行程序时报go: cannot find main module, but found .git/config in
编写单元测试,运行时报下面的错误 haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/base/cheshi0 ...
- 使用sshfs-win将linux服务器目录挂载到windows下
可以直接将服务器上的目录挂载到 Windows 的资源管理器,相当于多了一个磁盘,这样子就可以直接将数据下载到服务器上了,挺方便的. 原理说明 一般情况下,我们可以通过 samba 协议挂载远程服务器 ...
- 计算机组成原理—中央处理器CPU
文章目录 CPU的功能与架构 CPU的组成 运算器 控制器 指令执行过程 指令流程 指令执行方案 数据通路 单总线结构 专用通路结构 硬布线控制器设计 硬布线执行流程 硬布线CU内部 怎么设计微操作的 ...
- Java8新特性default关键字,引出Java多继承问题
概述 最近在看JDK集合的源码时,在Collection接口中发现了default关键字,并且惊奇的发现接口中的方法居然包含方法体,这顿时让我产生兴趣,为此我也稍微研究了一下default关键字. 很 ...
- golang beego 使用supervisor 部署后台进程管理. 静态文件找不到的解决办法.
directory=/root/go/src/you_self_dir 请在客户端配置文件*.ini中加入一行命令, 等于号后面就是自己的项目目录,这时就能找到项目文件了.
- Dockerfile PHP镜像制作
1 PHP镜像制作: 1.1 php-dockerfile FROM centos:7 LABEL maintainer www.chenleilei.net RUN yum install -y c ...
- 音视频积累-Wakeups 解决
一.现象 ReplayKit2运行过程中经常会被系统杀掉,在USB连接手机后可以导出crash log Date/Time: 2017-09-29 12:16:59.321071 +0800 OS V ...