package com.ruoyi.user.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.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;
/**
*
* 用户列表 服务实现类
*
*
* @author hjl
* @since 2024-06-03
*/
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
@Resource
private TokenService tokenService;
@Resource
private WxMaService wxMaService;
@Value("${wx.appId}")
private String appId;
@Value("${wx.appSecret}")
private String appSecret;
@Value("${default.profilePicture}")
private String profilePicture;
@Override
public R decodeOpenid(HttpServletResponse response, String code) {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
try {
// 授权(必填)固定
String grantType = "authorization_code";
// 发送请求
String res = HttpRequest.post(Constants.WX_OPENID_ADDRESS)
.form("appid", appId)
.form("secret", appSecret)
.form("js_code", code)
.form("grant_type", grantType)
.execute().body();
// 解析相应内容(转换成json对象)
JSONObject json = JSONObject.parseObject(res);
//获取openid
String openid = json.getString("openid");
return R.ok(openid, "");
} catch (Exception e) {
return R.fail("openId生成失败!");
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public HashMap 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.setState(Constants.ONE);
user.setPhone(phoneNumber);
user.setProfilePicture(profilePicture);
user.setNickname(String.format(Constants.USER_NO_PRE, StringUtils.getCharAndNum(Constants.SIX)));
user.setState(Constants.ONE);
user.setOpenId(openid);
user.setIsDelete(Constants.ZERO);
this.save(user);
} else {
if (user.getOpenId()!=null && !user.getOpenId().equals(openid)){
user.setOpenId(openid);
this.updateById(user);
}
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 map = new HashMap<>(8);
map.put("token", tokenService.createTokenByUser(loginUserInfo));
return map;
}
}
return null;
}
}