java实现微信登录

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

前言

上一篇做了php的微信登录,所以也总结一下Java的微信授权登录并获取用户信息这个功能的开发流程。
配置

配置什么的就不多说了,详细的配置可以直接前往我上一篇查看。
https://www.cnblogs.com/nothavebug/p/18277732
流程实现(后端)(JAVA)(springboot)

1.首先先配置一下application.yml文件
配置一下微信小程序的Appid 和 appSecret

2.编写控制层
  1. package com.xiangwu.controller.Wx;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.xiangwu.common.exception.BaseException;
  4. import com.xiangwu.common.exception.BussinessException;
  5. import com.xiangwu.common.exception.MessageConstant;
  6. import com.xiangwu.common.interceptor.BaseContext;
  7. import com.xiangwu.common.interceptor.JwtProperties;
  8. import com.xiangwu.common.jwt.JwtClaimsConstant;
  9. import com.xiangwu.common.response.BaseResponse;
  10. import com.xiangwu.common.utils.JwtUtil;
  11. import com.xiangwu.entiry.Demand;
  12. import com.xiangwu.entiry.Member;
  13. import com.xiangwu.entiry.Member1;
  14. import com.xiangwu.savedto.MemberDto;
  15. import com.xiangwu.savedto.UserLoginDto;
  16. import com.xiangwu.savedto.UserLoginVo;
  17. import com.xiangwu.service.MemberService;
  18. import io.swagger.annotations.Api;
  19. import io.swagger.annotations.ApiOperation;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.BeanUtils;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.web.bind.annotation.*;
  24. import java.util.Date;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. /**
  29. * @Author nothavebug
  30. * @Date 2024/7/2 14:58
  31. * @PackageName:com.yisen.controller
  32. * @ClassName: MenberController
  33. * @Description:
  34. * @Version 1.0
  35. */
  36. @RestController("wxMemberController")
  37. @RequestMapping("/user")
  38. @Api(tags = "微信登录")
  39. @Slf4j
  40. public class MemberController {
  41.     @Autowired
  42.     private MemberService memberService;
  43.     @Autowired
  44.     private JwtProperties jwtProperties;
  45.     //C端用户登录--微信登录
  46.     @PostMapping("/user/login")
  47.     @ApiOperation("登录")
  48.     public BaseResponse<UserLoginVo> login(@RequestBody UserLoginDto userLoginDto) {
  49.         //微信登录
  50.         Member1 member = memberService.wxLogin(userLoginDto);
  51.         //为微信生成jwt
  52.         Map claims = new HashMap();
  53.         //用户唯一标识
  54.         claims.put(JwtClaimsConstant.USER_ID, member.getId());
  55.         String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
  56.         //其他处理
  57.         return new BaseResponse<>(token);
  58.     }
  59. }
复制代码
3.编写Service层
  1. package com.xiangwu.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.xiangwu.entiry.Member;
  4. import com.xiangwu.entiry.Member1;
  5. import com.xiangwu.savedto.UserLoginDto;
  6. /**
  7. * @Author nothavebug
  8. * @Date 2024/7/2 14:58
  9. * @PackageName:com.xiangwu.service
  10. * @ClassName: MemberService
  11. * @Description:
  12. * @Version 1.0
  13. */
  14. public interface MemberService extends IService<Member> {
  15.     //微信登录
  16.     Member1 wxLogin(UserLoginDto userLoginDto);
  17. }
复制代码
4.编写Impl
  1. package com.xiangwu.service.impl;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  4. import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  5. import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
  6. import com.alibaba.fastjson.JSON;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.xiangwu.common.exception.LoginFailedException;
  11. import com.xiangwu.common.interceptor.WeChatProperties;
  12. import com.xiangwu.common.utils.HttpClientUtil;
  13. import com.xiangwu.entiry.Demand;
  14. import com.xiangwu.entiry.Member;
  15. import com.xiangwu.entiry.Member1;
  16. import com.xiangwu.mapper.DemandMapper;
  17. import com.xiangwu.mapper.Member1Mapper;
  18. import com.xiangwu.mapper.MemberMapper;
  19. import com.xiangwu.savedto.UserLoginDto;
  20. import com.xiangwu.service.DemandService;
  21. import com.xiangwu.service.MemberService;
  22. import lombok.extern.slf4j.Slf4j;
  23. import me.chanjar.weixin.common.error.WxErrorException;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.stereotype.Service;
  26. import javax.security.auth.login.LoginException;
  27. import java.util.Date;
  28. import java.util.HashMap;
  29. import java.util.Map;
  30. /**
  31. * @Author nothavebug
  32. * @Date 2024/7/2 14:58
  33. * @PackageName:com.xiangwu.service.impl
  34. * @ClassName: MemberServiceImpl
  35. * @Description:
  36. * @Version 1.0
  37. */
  38. @Service
  39. @Slf4j
  40. public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
  41.     public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
  42.     @Autowired
  43.     private WxMaService wxMaService;
  44.     @Autowired
  45.     private MemberMapper memberMapper;
  46.     @Autowired
  47.     private WeChatProperties weChatProperties;
  48.     @Autowired
  49.     private Member1Mapper member1Mapper;
  50.     @Override
  51.     public Member1 wxLogin(UserLoginDto userLoginDto) {
  52.         String code = userLoginDto.getCode();
  53.         try {
  54.             WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
  55.             String openid = session.getOpenid();
  56.              // 调用微信 API 获取用户的手机号
  57.             WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), userLoginDto.getEncryptedData(), userLoginDto.getIv());
  58.             String phoneNumber = phoneInfo.getPhoneNumber();
  59.             if (openid==null){
  60.                 throw new LoginFailedException("登录失败");
  61.             }
  62.             Member1 member = memberMapper.getBymobile(phoneNumber);
  63.             if (member ==null){
  64.                 Member1 member1 = new Member1();
  65.                 member1.setOpenid(openid);
  66.                 member1.setAddTime(new Date());
  67.                 member1.setMobile(phoneNumber);
  68.                 member1.setAvatar("http://springboot.itliu.top/wx/images/20220225072654_1.jpg");
  69.                 member1.setMemberType("1");
  70.                 member1Mapper.insert(member1);
  71.             }
  72.             //  更新openid
  73.             LambdaUpdateWrapper<Member1> member1LambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  74.             member1LambdaUpdateWrapper.set(Member1::getOpenid,openid)
  75.                     .eq(Member1::getMobile,phoneNumber);
  76.             member1Mapper.update(member,member1LambdaUpdateWrapper);
  77.             return member;
  78.         } catch (WxErrorException e) {
  79.             throw new RuntimeException(e);
  80.         }
  81.     }
  82.     private String getOpenid(String code){
  83.         //请求参数封装
  84.         Map map = new HashMap();
  85.         map.put("appid",weChatProperties.getAppid());
  86.         map.put("secret",weChatProperties.getSecret());
  87.         map.put("js_code",code);
  88.         map.put("grant_type","authorization_code");
  89.         //调用工具类,向微信接口服务发送请求
  90.         String json = HttpClientUtil.doGet(WX_LOGIN, map);
  91.         log.info("微信登录返回结果:{}", json);
  92.         //解析json字符串
  93.         JSONObject jsonObject = JSON.parseObject(json);
  94.         log.info("jsonObject: {}",jsonObject);
  95.         String openid = jsonObject.getString("openid");
  96.         log.info("微信用户的openid为:{}", openid);
  97.         return openid;
  98.     }
  99. }
复制代码
流程实现(前端)(Vue)(uniapp)

前端微信登录流程实现请移步我上一篇:https://www.cnblogs.com/nothavebug/p/18277732

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表