From ec6d43aa07ee0e8faf34498057ebcfbb446aa015 Mon Sep 17 00:00:00 2001 From: hjl <1657978663@qq.com> Date: 星期二, 16 七月 2024 09:21:51 +0800 Subject: [PATCH] feat: 代码重构 --- ruoyi-service/ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 106 insertions(+), 3 deletions(-) diff --git a/ruoyi-service/ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java b/ruoyi-service/ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java index 765dc51..f2b8f7f 100644 --- a/ruoyi-service/ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java +++ b/ruoyi-service/ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java @@ -1,17 +1,29 @@ package com.ruoyi.user.service.impl; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.WxMaUserService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.hutool.core.util.RandomUtil; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.exception.GlobalException; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.system.api.model.LoginUserInfo; import com.ruoyi.user.entity.User; import com.ruoyi.user.mapper.UserMapper; import com.ruoyi.user.service.UserService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; /** * <p> @@ -24,11 +36,20 @@ @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { - @Value("wx.appId") + @Resource + private WxMaUserService wxMaUserService; + @Resource + private TokenService tokenService; + @Resource + private WxMaService wxMaService; + + @Value("${wx.appId}") private String appId; - @Value("wx.appSecret") + @Value("${wx.appSecret}") private String appSecret; + + private final String BASE_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; @Override public R<String> decodeOpenid(HttpServletResponse response, String code) { @@ -48,9 +69,91 @@ JSONObject json = JSONObject.parseObject(res); //获取openid String openid = json.getString("openid"); - return R.ok(openid); + return R.ok(openid, ""); } catch (Exception e) { return R.fail("openId生成失败!"); } } + + + @Override + @Transactional(rollbackFor = Exception.class) + public HashMap<String, Object> decodeUserInfo(String code, String encryptedData, String ivStr) { + WxMaJscode2SessionResult session = null; + WxMaPhoneNumberInfo phoneNoInfo = null; + //获取session + try { + session = wxMaService.getUserService().getSessionInfo(code); + String sessionKey = session.getSessionKey(); + phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, ivStr); + } catch (Exception e) { + e.printStackTrace(); + } + if (session != null && StringUtils.isNotBlank(session.getOpenid())) { + String openid = session.getOpenid(); +// String sessionKey = session.getSessionKey(); + // 加密明文及初始向量转义 +// encryptedData = URLEncoder.encode(encryptedData, "UTF-8").replace("%3D", "=").replace("%2F", "/"); +// ivStr = URLEncoder.encode(ivStr, "UTF-8").replace("%3D", "=").replace("%2F", "/"); +// // 获取用户信息 +// String result = WxAesUtils.decryptData(WxAesUtils.getUrlDecoderString(encryptedData), +// sessionKey, +// WxAesUtils.getUrlDecoderString(ivStr)); +// JSONObject userJson = JSONObject.parseObject(result); + // 封装项目用户信息 + if (null != phoneNoInfo) { + String phoneNumber = phoneNoInfo.getPhoneNumber(); + User user = this.lambdaQuery().eq(User::getPhone, phoneNumber) + .eq(User::getIsDelete, 0).one(); + if (null == user) { + user = new User(); + user.setUserNo(String.format(Constants.USER_NO_PRE, RandomUtil.randomNumbers(Constants.EIGHT))); + user.setPhone(phoneNumber); + user.setState(Constants.ONE); + user.setOpenId(openid); + user.setIsDelete(Constants.ZERO); + this.save(user); + } else { + Integer state = user.getState(); + if (state == 0) { + throw new GlobalException("该账号未开启,无法进行登录!"); + } + } + // 校验通过,生成token及过期时间 + LoginUserInfo loginUserInfo = new LoginUserInfo(); + loginUserInfo.setName(user.getPhone()); + loginUserInfo.setUserid(user.getId()); + loginUserInfo.setPhone(user.getPhone()); + loginUserInfo.setLoginTime(System.currentTimeMillis()); + HashMap<String, Object> map = new HashMap<>(8); + map.put("token", tokenService.createTokenByUser(loginUserInfo)); + return map; + } + } + return null; + } + + + public JSONObject getPhone(String code) { + // 授权(必填) + String grantType = "client_credential"; + // 向微信服务器 使用登录凭证 code 获取 session_key 和 openid + // 请求参数 + String params2 = "appid=" + appId + "&secret=" + appSecret + "&grant_type=" + grantType; + // 发送请求 + String sr2 = com.ruoyi.user.vx.utils.HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/token", params2); + // 解析相应内容(转换成json对象) + JSONObject json2 = JSONObject.parseObject(sr2); + String accessToken = json2.getString("access_token"); + //使用获取到的token和接受到的code像微信获取手机号 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", code); + String url = ("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken); + String sr3 = com.ruoyi.user.vx.utils.HttpRequest.sendPostNew(url, jsonObject); + JSONObject json = JSONObject.parseObject(sr3); + JSONObject phoneInfo = json.getJSONObject("phone_info"); +// return phoneInfo.getString("phoneNumber"); + return phoneInfo; + } + } -- Gitblit v1.7.1