|
|
@@ -2,15 +2,31 @@ package com.chuanghai.ihotel.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.chuanghai.ihotel.config.WeixiaoConfig;
|
|
|
import com.chuanghai.ihotel.dao.HotelUserDao;
|
|
|
+import com.chuanghai.ihotel.dto.LoginUserDTO;
|
|
|
import com.chuanghai.ihotel.entity.HotelUserEntity;
|
|
|
import com.chuanghai.ihotel.service.HotelUserService;
|
|
|
+import com.chuanghai.ihotel.util.JWTUtil;
|
|
|
+import com.chuanghai.ihotel.vo.LoginUserVO;
|
|
|
+import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
+@Slf4j
|
|
|
@Service("hotelUserService")
|
|
|
public class HotelUserServiceImpl extends ServiceImpl<HotelUserDao, HotelUserEntity> implements HotelUserService {
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private WeixiaoConfig weixiaoConfig;
|
|
|
+
|
|
|
@Override
|
|
|
public HotelUserEntity findByCardNumber(String cardNumber) {
|
|
|
QueryWrapper<HotelUserEntity> queryWrapper = new QueryWrapper<>();
|
|
|
@@ -19,4 +35,79 @@ public class HotelUserServiceImpl extends ServiceImpl<HotelUserDao, HotelUserEnt
|
|
|
queryWrapper.last("limit 1");
|
|
|
return this.getOne(queryWrapper);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public LoginUserVO weixiaoAuth(String wxcode, String state) {
|
|
|
+ String tokenUrl = "https://open.wecard.qq.com/connect/oauth2/token";
|
|
|
+ Map<String, String> tokenParams = new HashMap<>();
|
|
|
+ tokenParams.put("wxcode", wxcode);
|
|
|
+ tokenParams.put("app_key", weixiaoConfig.getAppKey());
|
|
|
+ tokenParams.put("app_secret", weixiaoConfig.getAppSecret());
|
|
|
+ tokenParams.put("grant_type", "authorization_code");
|
|
|
+ tokenParams.put("redirect_uri", state); // 该地址需要与发起授权地址保持一直
|
|
|
+
|
|
|
+ try {
|
|
|
+ // wxcode换取token
|
|
|
+ RestTemplate client = new RestTemplate();
|
|
|
+ ResponseEntity<String> tokenResponse = client.postForEntity(tokenUrl, tokenParams, String.class);
|
|
|
+ String body = tokenResponse.getBody();
|
|
|
+ log.info("微校code换token返回结果【{}】", body);
|
|
|
+
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ Map<String, Object> jsonMap = mapper.readValue(body, new TypeReference<Map<String, Object>>() {});
|
|
|
+ String accessToken = (String) jsonMap.get("access_token");
|
|
|
+
|
|
|
+ // token换取用户信息
|
|
|
+ String userInfoUrl = "https://open.wecard.qq.com/connect/oauth/get-user-info";
|
|
|
+ Map<String, String> userInfoParam = new HashMap<>();
|
|
|
+ userInfoParam.put("access_token", accessToken);
|
|
|
+ ResponseEntity<String> userInfoResponse = client.postForEntity(userInfoUrl, userInfoParam, String.class);
|
|
|
+ String userInfoResponseBody = userInfoResponse.getBody();
|
|
|
+ log.info("微校token换用户信息返回结果【{}】", body);
|
|
|
+
|
|
|
+ // 解析用户信息
|
|
|
+ Map<String, Object> userInfoMap = mapper.readValue(userInfoResponseBody, new TypeReference<Map<String, Object>>() {});
|
|
|
+ String cardNumber = userInfoMap.get("card_number").toString();
|
|
|
+ String name = userInfoMap.get("name").toString();
|
|
|
+ String identityType = userInfoMap.get("identity_type").toString();
|
|
|
+
|
|
|
+ // 用户信息生成token返回
|
|
|
+ return generateToken(cardNumber, name, identityType);
|
|
|
+ } catch (Exception e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微校用户信息生成token返回
|
|
|
+ * @param cardNumber
|
|
|
+ * @param name
|
|
|
+ * @param identityType
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private LoginUserVO generateToken(String cardNumber, String name, String identityType) {
|
|
|
+ HotelUserEntity hotelUser = findByCardNumber(cardNumber);
|
|
|
+ if (hotelUser == null) {
|
|
|
+ hotelUser = new HotelUserEntity();
|
|
|
+ hotelUser.setName(name);
|
|
|
+ hotelUser.setCardNumber(cardNumber);
|
|
|
+ hotelUser.setIdentityType(identityType);
|
|
|
+ hotelUser.setStatu("1");
|
|
|
+
|
|
|
+ this.save(hotelUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成token
|
|
|
+ LoginUserDTO dto = LoginUserDTO.builder().cardNumber(cardNumber).userType("2").identityType(identityType).build();
|
|
|
+ String token = JWTUtil.geneJsonWebToken(dto);
|
|
|
+
|
|
|
+ // 返回登录对象
|
|
|
+ return LoginUserVO.builder()
|
|
|
+ .token(token)
|
|
|
+ .tokenTtl(JWTUtil.getExpired())
|
|
|
+ .userType("2")
|
|
|
+ .userName(name)
|
|
|
+ .userIdentity(identityType)
|
|
|
+ .build();
|
|
|
+ }
|
|
|
}
|