前言

上一篇做了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. python生成随机汉字

    python 随机生成汉字 第一种方法:Unicode码 在unicode码中,汉字的范围是(0x4E00, 9FBF) 这个方法比较简单,但是有个小问题,unicode码中收录了2万多个汉字,包含很 ...

  3. USB3.0与Type-C接口的关系

    USB全称为Universal Serial Bus,翻译过来就是通用串行总线,是连接计算机与外部设备的一种串口总线标准.USB的发展经历了一下阶段: USB1.0:1.5Mbps(192KB/s)低 ...

  4. 扩展实现Unity协程的完整栈跟踪

    现如今Unity中的协程(Coroutine)方案已显得老旧,Unitask等异步方案可以做到异常捕获等yield关键字处理起来很麻烦的问题, 并且Unity官方也在开发一套异步方案,但对于临时加入到 ...

  5. C语言:汉诺塔问题(Hanoi Tower)------递归算法

    汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...

  6. PHP常用排序算法02——快速、归并

    接着上篇,我们继续来学习下工程中最常用的排序算法,适合大规模数据排序的算法,快速排序(quickSort)和归并排序(mergeSort). PS:对排序等算法还不太了解的同学,可以去看下这个链接哦, ...

  7. 鸿蒙HarmonyOS实战-Stage模型(应用上下文Context)

    前言 应用上下文(Context)是应用程序的全局信息的接口.它是一个抽象类,提供了访问应用程序环境的方法和资源的方法.应用上下文可以用于获取应用程序的资源.启动Activity.发送广播等.每个应用 ...

  8. Js实现任意位置缩放图片,深入理解背后原理

    前言 本文将用一个简单的例子详细讲解如何用原生JS一步步实现完整的任意位置缩放图片功能,无任何第三方依赖,指针事件 进行多端统一的事件监听,干货满满. 完整代码 为提升阅读体验,正文中代码展示有部分省 ...

  9. GNU GDB

    1 说明 本文主要介绍一些简单的.常用的gdb调试技巧. 环境:GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1) 参考文档:<gdb ...

  10. JavaSE 标签 break continue

    *标签.break.continue 当需要结束多个循环后,则使用标签 label:for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ if(j==2) ...