前言

上一篇做了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实现微信登录的更多相关文章

  1. Java对接微信登录

    今天我们来对接微信开放平台的网站应用登录 首先上文档链接:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login ...

  2. Java 扫描微信公众号二维码,关注并自动登录网站

    https://blog.csdn.net/qq_42851002/article/details/81327770 场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: ...

  3. java实现微信小程序服务端(登录)

    微信小程序如今被广泛使用,微信小程序按照微信官网的定义来说就是: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 这就是微信小程序的魅力所在,有 ...

  4. 关于使用微信登录第三方APP的实现(Android版)

    使用微信登录APP,免去注册过程,现在已经有很多的类似应用了.集成该功能过程不复杂,但还是有一些地方需要注意的. 开始之前,需要做下面的准备工作. 1.到微信开放平台注册你的APP,并申请开通微信登录 ...

  5. Java企业微信开发_03_通讯录同步

    一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...

  6. Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

    注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...

  7. Android微信登录、分享、支付

    转载需要著名出处: http://blog.csdn.net/lowprofile_coding/article/details/78004224 之前写过微信登录分享支付第一版: http://bl ...

  8. android微信登录,分享

    这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...

  9. "errcode":40163,"errmsg":"code been used...报错,做PC微信登录时出现code been used...报错问题

    这是一个坑,一个巨坑,一个恶心的坑 出现这个问题的大概意思就是微信回调了两次登录接口,code使用了两次,而在微信官方文档上写着code只能用一次,用来获取access_token,但我TM看着就糊涂 ...

  10. 使用SpringSocial开发微信登录

    ⒈编写微信用户对应的数据结构 package cn.coreqi.social.weixin.entities; /** * 微信用户实体类 */ public class WeixinUserInf ...

随机推荐

  1. zabbix-server-pgsql docker镜像说明

    0 说明 zabbix-server-pgsql在docker hub的官方说明,供查阅 1 Environment Variables 1.1 基本变量 When you start the zab ...

  2. SpringBoot3.1.5对应新版本SpringCloud开发(2)-Eureka的负载均衡

    Eureka的负载均衡 负载均衡原理 负载均衡流程 老版本流程介绍 当order-servic发起的请求进入Ribbon后会被LoadBalancerInterceptor负载均衡拦截器拦截,拦截器获 ...

  3. 如何基于surging跨网关跨语言进行缓存降级

    概述 surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,所以在多语言行业解 ...

  4. Zeppelin未授权访问 getshell

    Zeppelin未授权访问 getshell 1.漏洞简介 Apache Zeppelin是一个让交互式数据分析变得可行的基于网页的notebook.Zeppelin提供了数据可视化的框架. Zepp ...

  5. 智能体Agent-书生浦语大模型实战营学习笔记6&大语言模型10

    大语言模型学习:10.智能体Agent 书生浦语大模型实战营学习笔记6 定义 即P(感知)-> P(规划)->A(行动).类似人类「做事情」的过程,Agent的核心功能,可以归纳为三个步骤 ...

  6. 03. x86基础指令

    [说明] x86指令代码语法 制作程序时,指令数据使用代码表示,这些指令代码称为汇编代码,汇编代码由汇编器转换为对应的指令数据和数学数据. x86指令代码主要有两种语法:英特尔语法.AT&T语 ...

  7. LVS负载均衡(5)-- LVS持久连接

    持久连接: 持久连接用于实现无论使用任何调度算法,在一段时间内(默认300s ),能够实现将来自同一个地址的请求始终发往同一个RS. 语法格式: ipvsadm -A|E -t|u|f service ...

  8. .NET周刊【5月第2期 2024-05-12】

    国内文章 C#在工业数字孪生中的开发路线实践 https://mp.weixin.qq.com/s/b_Pjt2oii0Xa_sZp_9wYWg 这篇文章探讨了C#在工业数字孪生技术中的应用,介绍了三 ...

  9. Linux之top命令分析

    第一行: top - 04:25:26 当前系统时间 up 3 min, 系统已经运行的时间(不间歇的运行) 1 user, 当前登录系统的用户数 load average: 0.01, 0.03, ...

  10. .net版OCR紧随PP-OCRv3重磅发布

    .net版OCR地址PaddleOCRSharp PaddleOCRSharp是一个基于PaddleOCR的C++代码修改并封装的.NET的工具类库.包含文本识别.文本检测.基于文本检测结果的统计分析 ...