75 lines
2.3 KiB
Java
75 lines
2.3 KiB
Java
package com.sky.service.impl;
|
||
|
||
import com.alibaba.fastjson.JSON;
|
||
import com.alibaba.fastjson.JSONObject;
|
||
import com.sky.constant.MessageConstant;
|
||
import com.sky.dto.UserLoginDTO;
|
||
import com.sky.entity.User;
|
||
import com.sky.exception.LoginFailedException;
|
||
import com.sky.mapper.UserMapper;
|
||
import com.sky.properties.WeChatProperties;
|
||
import com.sky.service.UserService;
|
||
import com.sky.utils.HttpClientUtil;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
import java.time.LocalDateTime;
|
||
import java.util.HashMap;
|
||
import java.util.Map;
|
||
|
||
@Service
|
||
public class UserServiceImpl implements UserService {
|
||
|
||
//微信服务接口地址
|
||
public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
|
||
|
||
@Autowired
|
||
private WeChatProperties weChatProperties;
|
||
|
||
@Autowired
|
||
private UserMapper userMapper;
|
||
|
||
/**
|
||
* 微信登录
|
||
* @param userLoginDTO
|
||
* @return
|
||
*/
|
||
@Override
|
||
public User wxLogin(UserLoginDTO userLoginDTO) {
|
||
//1.调用微信接口服务,获取当前微信用户端openid
|
||
String openid = getOpenid(userLoginDTO.getCode());
|
||
|
||
//2.判断openid是否是空,如果为空,表示登录失败,抛出业务异常
|
||
if (openid == null) {
|
||
throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
|
||
}
|
||
//3.判断当前用户是否为新用户
|
||
User user = userMapper.getByOpenid(openid);
|
||
//4.如果是新用户,自动完成注册
|
||
if (user == null) {
|
||
user = User.builder()
|
||
.openid(openid)
|
||
.createTime(LocalDateTime.now())
|
||
.build();
|
||
userMapper.insert(user);
|
||
}
|
||
//返回用户对象
|
||
return user;
|
||
}
|
||
|
||
|
||
//调用微信接口服务,获取当前微信用户端openid
|
||
private String getOpenid(String code){
|
||
Map<String, String> 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);
|
||
|
||
JSONObject jsonObject = JSON.parseObject(json);
|
||
String openid = jsonObject.getString("openid");
|
||
return openid;
|
||
}
|
||
}
|