微信小程序登录
This commit is contained in:
@@ -5,7 +5,10 @@ import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
/**
|
||||
* @author dong_gui on 2020/5/20.
|
||||
* @author zhangchenbiao
|
||||
* @FileName: RestTemplateConfig
|
||||
* @Description:
|
||||
* @date 2023-05-29 14:29
|
||||
*/
|
||||
@Configuration
|
||||
public class RestTemplateConfig {
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.cool.store.http;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.dto.enterprise.EnterpriseUserDTO;
|
||||
import com.cool.store.dto.wx.CodeSessionDTO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.utils.RestTemplateUtil;
|
||||
import com.coolstore.base.dto.ResultDTO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author zhangchenbiao
|
||||
* @FileName: WechatRest
|
||||
* @Description:微信api
|
||||
* @date 2023-05-29 14:49
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WechatRest {
|
||||
|
||||
public CodeSessionDTO miniProgramJsCodeSession(String appId, String secret, String jsCode){
|
||||
String url = "https://api.weixin.qq.com/sns/jscode2session";
|
||||
ResponseEntity<CodeSessionDTO> responseEntity = null;
|
||||
try {
|
||||
responseEntity = RestTemplateUtil.loadGet(url, CodeSessionDTO.class);
|
||||
log.info("url:{}, response:{}", url, JSONObject.toJSONString(responseEntity));
|
||||
if(Objects.nonNull(responseEntity.getBody()) && responseEntity.getBody().isSuccess()){
|
||||
return responseEntity.getBody();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.info("调用微信服务异常{}", e);
|
||||
throw new ServiceException(ErrorCodeEnum.WX_SERVICE_ERROR);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.cool.store.service;
|
||||
|
||||
import com.cool.store.dto.wx.MiniProgramLoginDTO;
|
||||
import com.cool.store.dto.wx.MiniProgramMsgDTO;
|
||||
import com.cool.store.vo.wx.CodeSessionVO;
|
||||
import com.cool.store.vo.wx.MiniProgramUserVO;
|
||||
|
||||
/**
|
||||
* @author zhangchenbiao
|
||||
* @FileName: WechatMiniAppService
|
||||
* @Description:
|
||||
* @date 2023-05-29 14:28
|
||||
*/
|
||||
public interface WechatMiniAppService {
|
||||
|
||||
|
||||
CodeSessionVO miniProgramLogin(MiniProgramLoginDTO param);
|
||||
|
||||
|
||||
MiniProgramUserVO queryMiniProgramUser(MiniProgramMsgDTO param);
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.cool.store.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.dto.wx.CodeSessionDTO;
|
||||
import com.cool.store.dto.wx.MiniProgramLoginDTO;
|
||||
import com.cool.store.dto.wx.MiniProgramMsgDTO;
|
||||
import com.cool.store.enums.ErrorCodeEnum;
|
||||
import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.http.WechatRest;
|
||||
import com.cool.store.service.WechatMiniAppService;
|
||||
import com.cool.store.utils.AesUtil;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.vo.wx.CodeSessionVO;
|
||||
import com.cool.store.vo.wx.MiniProgramUserVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author zhangchenbiao
|
||||
* @FileName: WechatMiniAppServiceImpl
|
||||
* @Description:
|
||||
* @date 2023-05-29 14:29
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WechatMiniAppServiceImpl implements WechatMiniAppService {
|
||||
|
||||
@Resource
|
||||
private RedisUtilPool redisUtilPool;
|
||||
@Resource
|
||||
private WechatRest wechatRest;
|
||||
|
||||
@Override
|
||||
public CodeSessionVO miniProgramLogin(MiniProgramLoginDTO param) {
|
||||
String jsCode = param.getJsCode();
|
||||
String lockKey = "codeSession:" + param.getAppid() + CommonConstants.MOSAICS + jsCode;
|
||||
boolean lock = redisUtilPool.lock(lockKey);
|
||||
if (!lock) {
|
||||
throw new ServiceException(ErrorCodeEnum.OPERATION_OVER_TIME);
|
||||
}
|
||||
String appid = param.getAppid();
|
||||
String secret = redisUtilPool.getString(MessageFormat.format(CommonConstants.WX_APP_SECRET_KEY, appid));
|
||||
if(StringUtils.isBlank(secret)){
|
||||
throw new ServiceException(ErrorCodeEnum.GET_APP_SECRET_ERROR);
|
||||
}
|
||||
CodeSessionDTO codeSession = wechatRest.miniProgramJsCodeSession(appid, secret, jsCode);
|
||||
String openid = codeSession.getOpenid();
|
||||
String sessionCacheKey = MessageFormat.format(CommonConstants.MINI_PROGRAM_SESSION_KEY, appid, openid);
|
||||
redisUtilPool.setString(sessionCacheKey, codeSession.getSessionKey(), CommonConstants.THREE_DAY_SECONDS);
|
||||
String unionId = codeSession.getUnionId();
|
||||
log.info("小程序登录:{}", unionId);
|
||||
//todo 保存授权信息 判断是否第一次授权
|
||||
return CodeSessionVO.builder().openid(openid).unionId(unionId).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProgramUserVO queryMiniProgramUser(MiniProgramMsgDTO param) {
|
||||
String sessionCacheKey = MessageFormat.format(CommonConstants.MINI_PROGRAM_SESSION_KEY, param.getAppid(), param.getOpenid());
|
||||
String sessionKey = redisUtilPool.getString(sessionCacheKey);
|
||||
if (StringUtils.isBlank(sessionKey)) {
|
||||
throw new ServiceException(ErrorCodeEnum.SESSION_KEY_ERROR);
|
||||
}
|
||||
log.info("sessionKey {}", sessionKey);
|
||||
String decryptUser = AesUtil.decryptWechat(sessionKey, param.getEncryptedData(), param.getIvStr());
|
||||
log.info("解密用户信息:{}", decryptUser);
|
||||
MiniProgramUserVO miniProgramUser = JSON.parseObject(decryptUser, MiniProgramUserVO.class);
|
||||
if (Objects.isNull(miniProgramUser)) {
|
||||
throw new ServiceException("获取小程序用户信息失败");
|
||||
}
|
||||
return miniProgramUser;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user