前言

上一篇做了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. 解放双手!这个插件只要一张表就能生成CRUD代码

    大家好,我是 Java陈序员. 问君能有几多愁,代码一行又一行! 作为码农,代码是写不完的,而偷懒又是人的天性,能少干一点就少干一点. 今天,给大家介绍一个 IDEA 插件,帮助你快速生成出 CRUD ...

  2. SWAG反向代理Jellyfin媒体服务器流量教程

    目录 1. 简介 1.1 Jellyfin媒体服务器 1.2 SWAG服务器 2. 设置Jellyfin开启HTTPS访问 3. 安装并配置SWAG服务器反向代理Jellyfin流量 3.1 安装SW ...

  3. 02 go-zero入门--微服务demo

    参考文档: https://go-zero.dev/cn/docs/advance/rpc-call 视频地址: https://space.bilibili.com/387126464/channe ...

  4. 运行程序时报go: cannot find main module, but found .git/config in

    编写单元测试,运行时报下面的错误 haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/base/cheshi0 ...

  5. 使用sshfs-win将linux服务器目录挂载到windows下

    可以直接将服务器上的目录挂载到 Windows 的资源管理器,相当于多了一个磁盘,这样子就可以直接将数据下载到服务器上了,挺方便的. 原理说明 一般情况下,我们可以通过 samba 协议挂载远程服务器 ...

  6. 计算机组成原理—中央处理器CPU

    文章目录 CPU的功能与架构 CPU的组成 运算器 控制器 指令执行过程 指令流程 指令执行方案 数据通路 单总线结构 专用通路结构 硬布线控制器设计 硬布线执行流程 硬布线CU内部 怎么设计微操作的 ...

  7. Java8新特性default关键字,引出Java多继承问题

    概述 最近在看JDK集合的源码时,在Collection接口中发现了default关键字,并且惊奇的发现接口中的方法居然包含方法体,这顿时让我产生兴趣,为此我也稍微研究了一下default关键字. 很 ...

  8. golang beego 使用supervisor 部署后台进程管理. 静态文件找不到的解决办法.

    directory=/root/go/src/you_self_dir 请在客户端配置文件*.ini中加入一行命令, 等于号后面就是自己的项目目录,这时就能找到项目文件了.

  9. Dockerfile PHP镜像制作

    1 PHP镜像制作: 1.1 php-dockerfile FROM centos:7 LABEL maintainer www.chenleilei.net RUN yum install -y c ...

  10. 音视频积累-Wakeups 解决

    一.现象 ReplayKit2运行过程中经常会被系统杀掉,在USB连接手机后可以导出crash log Date/Time: 2017-09-29 12:16:59.321071 +0800 OS V ...