提交 b2dcaebe authored 作者: 吕本才's avatar 吕本才

接口和配置文件更新

上级 16c6d568
target/**
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
.mvn
logs
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
mvnw
mvnw.cmd
package com.link.hub.config.advice;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sfa.common.core.domain.R;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* @author : liqiulin
* @date : 2024-10-28 17
* @describe :自动封装
*/
@RestControllerAdvice
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object>{
/**
* response是R类型或者注释了NotControllerResponseAdvice都不进行包装
*/
@Override
public boolean supports(MethodParameter methodParameter, Class converterType) {
// if (methodParameter.getParameterType().isAssignableFrom(AjaxResult.class)) {
// return false;
// }
return !methodParameter.getParameterType().isAssignableFrom(R.class);
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
// String类型不能直接包装
if (methodParameter.getGenericParameterType().equals(String.class)) {
ObjectMapper objectMapper = new ObjectMapper();
try {
// 将数据包装在ResultVo里后转换为json串进行返回
return objectMapper.writeValueAsString(R.ok(body));
} catch (JsonProcessingException e) {
throw new RuntimeException();
}
}
// 包装成R返回
return R.ok(body);
}
}
......@@ -22,9 +22,18 @@ public class WechatMiniProgramController {
private WechatMiniProgramService wechatMiniProgramService;
@GetMapping("/getUserInfo")
public R getUserInfo(String code) {
public MiniProgramOpenIdVO getUserInfo(String code) {
MiniProgramOpenIdVO userInfo = wechatMiniProgramService.getUserInfo(code);
return R.ok(userInfo);
return userInfo;
}
/**
* 是否关注公众号
* @param openid
*/
@GetMapping("/isSubscribe")
public R isSubscribe(String openid) {
return R.ok(wechatMiniProgramService.isSubscribe(openid));
}
......
package com.link.hub.domain.weChatMiniProgram.dao;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.domain.weChatMiniProgram.wq.WechatMiniProgramUserWq;
public interface WechatMiniProgramUserDao {
WechatMiniProgramUser queryMiniProgramUserWq(WechatMiniProgramUserWq wechatMiniProgramUserWq);
void insert(WechatMiniProgramUser wechatMiniProgramUser);
}
package com.link.hub.domain.weChatMiniProgram.dao.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.hub.domain.weChatMiniProgram.dao.WechatMiniProgramUserDao;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.domain.weChatMiniProgram.mapper.WechatMiniProgramUserMapper;
import com.link.hub.domain.weChatMiniProgram.wq.WechatMiniProgramUserWq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
......@@ -16,4 +20,17 @@ public class WechatMiniProgramUserDaoImpl implements WechatMiniProgramUserDao {
WechatMiniProgramUserMapper wechatMiniProgramUserMapper;
@Override
public WechatMiniProgramUser queryMiniProgramUserWq(WechatMiniProgramUserWq wechatMiniProgramUserWq) {
LambdaQueryWrapper<WechatMiniProgramUser> queryWrapper = new LambdaQueryWrapper<WechatMiniProgramUser>();
queryWrapper.eq(ObjectUtil.isNotEmpty(wechatMiniProgramUserWq.getOpenid()),WechatMiniProgramUser::getOpenid, wechatMiniProgramUserWq.getOpenid());
WechatMiniProgramUser wechatMiniProgramUser = wechatMiniProgramUserMapper.selectOne(queryWrapper);
return wechatMiniProgramUser;
}
@Override
public void insert(WechatMiniProgramUser wechatMiniProgramUser) {
wechatMiniProgramUserMapper.insert(wechatMiniProgramUser);
}
}
package com.link.hub.domain.weChatMiniProgram.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface WechatMiniProgramUserMapper {
public interface WechatMiniProgramUserMapper extends BaseMapper<WechatMiniProgramUser> {
}
package com.link.hub.domain.weChatMiniProgram.wq;
import lombok.Data;
@Data
public class WechatMiniProgramUserWq {
private String openid;
}
package com.link.hub.pojo.weChatMiniProgram.dto;
import lombok.Data;
@Data
public class MiniProgramOpenIdDTO {
private String openid;
private String unionid;
}
......@@ -2,18 +2,14 @@ package com.link.hub.pojo.weChatMiniProgram.vo;
import lombok.Data;
import java.util.Date;
@Data
public class MiniProgramOpenIdVO {
private String openid;
private String session_key;
private String unionid;
private Date subscribeTime;
private String token;
// private Boolean subscribeFlag =false;
private String openid;
private String session_key;
private String unionid;
private String token;
private Long userId;
//private Boolean subscribeFlag =false;
//private Date subscribeTime;
}
......@@ -4,4 +4,6 @@ import com.link.hub.pojo.weChatMiniProgram.vo.MiniProgramOpenIdVO;
public interface WechatMiniProgramService {
MiniProgramOpenIdVO getUserInfo(String code);
Object isSubscribe(String openid);
}
package com.link.hub.service.weChatMiniProgram;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.pojo.weChatMiniProgram.dto.MiniProgramOpenIdDTO;
public interface WechatMiniProgramUserService {
WechatMiniProgramUser queryMiniProgramUserByOpenId(String openid);
Long saveMiniProgramUser(MiniProgramOpenIdDTO miniProgramOpenIdDTO);
}
package com.link.hub.service.weChatMiniProgram.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import com.link.hub.config.WeChatMiniProgramConfig;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.pojo.weChatMiniProgram.dto.MiniProgramOpenIdDTO;
import com.link.hub.pojo.weChatMiniProgram.vo.MiniProgramOpenIdVO;
import com.link.hub.service.weChatMiniProgram.WechatMiniProgramService;
import com.link.hub.service.weChatMiniProgram.WechatMiniProgramUserService;
import com.sfa.common.core.constant.SecurityConstants;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.core.utils.JwtUtils;
import com.sfa.common.core.utils.ip.IpUtils;
import com.sfa.common.core.utils.uuid.IdUtils;
import com.sfa.common.core.utils.wechat.TencentUtils;
import com.sfa.common.core.utils.wechat.WeChatPlatFormUtils;
import com.sfa.common.security.service.TokenService;
import com.sfa.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Value;
......@@ -37,41 +40,77 @@ public class WechatMiniProgramServiceServiceImpl implements WechatMiniProgramSer
@Override
public MiniProgramOpenIdVO getUserInfo(String code) {
JSONObject jsonObject = TencentUtils.getOpenid(code, weChatMiniProgramConfig.getAppId(), weChatMiniProgramConfig.getAppSecret());
JSONObject jsonObject = WeChatPlatFormUtils.getOpenid(code, weChatMiniProgramConfig.getAppId(), weChatMiniProgramConfig.getAppSecret());
// 从jsonObject中获取openid
String openid = jsonObject.getString("openid");
String unionid = jsonObject.getString("unionid");
// 返回结果
MiniProgramOpenIdVO miniProgramOpenIdVO = new MiniProgramOpenIdVO();
miniProgramOpenIdVO.setOpenid(openid);
miniProgramOpenIdVO.setUnionid(unionid);
// 查询是否关注了微信公众号
// miniProgramOpenIdVO.setSubscribeFlag(true);
miniProgramOpenIdVO.setSubscribeTime(DateUtil.date());
// 保存小程序用户信息
// String userId = miniProgramUserService.saveMiniProgramUser(openid);
if (ObjectUtil.isEmpty(openid)) {
throw new ServiceException("获取openid失败");
}
WechatMiniProgramUser wechatMiniProgramUser = miniProgramUserService.queryMiniProgramUserByOpenId(openid);
Long userId = null;
if (ObjectUtil.isNotEmpty(wechatMiniProgramUser)) {
// 查询到数据不再新增
userId = wechatMiniProgramUser.getId();
} else {
// 保存小程序用户信息 新增小程序用户信息
MiniProgramOpenIdDTO miniProgramOpenIdDTO = new MiniProgramOpenIdDTO();
miniProgramOpenIdDTO.setOpenid(openid);
miniProgramOpenIdDTO.setUnionid(unionid);
userId = miniProgramUserService.saveMiniProgramUser(miniProgramOpenIdDTO);
}
LoginUser loginUser = new LoginUser();
String token = IdUtils.fastUUID();
Long userId = 1L;
String userName = "openid";
loginUser.setToken(token);
loginUser.setUserid(userId);
loginUser.setUsername(userName);
loginUser.setIpaddr(IpUtils.getIpAddr());
tokenService.saveToken(loginUser, expireTime);
tokenService.saveMiniProgramToken(loginUser, expireTime);
// 返回token
Map<String, Object> claimsMap = new HashMap<String, Object>();
claimsMap.put(SecurityConstants.USER_KEY, token);
claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
// 接口返回信息
Map<String, Object> rspMap = new HashMap<String, Object>();
rspMap.put("access_token", JwtUtils.createToken(claimsMap));
rspMap.put("expires_in", expireTime);
loginUser.setLoginTime(System.currentTimeMillis());
miniProgramOpenIdVO.setToken(JwtUtils.createToken(claimsMap));
String jwtToken = JwtUtils.createToken(claimsMap);
// 返回结果
MiniProgramOpenIdVO miniProgramOpenIdVO = new MiniProgramOpenIdVO();
miniProgramOpenIdVO.setOpenid(openid);
miniProgramOpenIdVO.setUnionid(unionid);
// 查询是否关注了微信公众号
// miniProgramOpenIdVO.setSubscribeFlag(true);
// miniProgramOpenIdVO.setSubscribeTime(DateUtil.date());
miniProgramOpenIdVO.setToken(jwtToken);
miniProgramOpenIdVO.setUserId(userId);
return miniProgramOpenIdVO;
}
@Override
public Object isSubscribe(String openid) {
/**
* 通过发送模板消息判断用户是否关注公众号
* @param openId
* @param templateId
* @param accessToken
* @return true表示已关注,false表示未关注
*/
// 用户的OpenID
String openId = "用户OpenID";
// 一个不存在的模板ID
String templateId = "一个不存在的模板ID";
// 公众号的access_token
JSONObject bodyJson = WeChatPlatFormUtils.getMiniappToken(weChatMiniProgramConfig.getAppId(), weChatMiniProgramConfig.getAppSecret());
String accessToken = bodyJson.getString("access_token");
return WeChatPlatFormUtils.isSubscribe(openId, templateId, accessToken);
}
}
package com.link.hub.service.weChatMiniProgram.impl;
import cn.hutool.core.date.DateUtil;
import com.link.hub.domain.weChatMiniProgram.dao.WechatMiniProgramUserDao;
import com.link.hub.domain.weChatMiniProgram.entity.WechatMiniProgramUser;
import com.link.hub.domain.weChatMiniProgram.wq.WechatMiniProgramUserWq;
import com.link.hub.pojo.weChatMiniProgram.dto.MiniProgramOpenIdDTO;
import com.link.hub.service.weChatMiniProgram.WechatMiniProgramUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 小程序用户服务实现
......@@ -10,4 +17,25 @@ import org.springframework.stereotype.Service;
@Service
public class WechatMiniProgramUserServiceServiceImpl implements WechatMiniProgramUserService {
@Resource
private WechatMiniProgramUserDao wechatMiniProgramUserDao;
@Override
public WechatMiniProgramUser queryMiniProgramUserByOpenId(String openid) {
WechatMiniProgramUserWq wechatMiniProgramUserWq = new WechatMiniProgramUserWq();
wechatMiniProgramUserWq.setOpenid(openid);
WechatMiniProgramUser wechatMiniProgramUser = wechatMiniProgramUserDao.queryMiniProgramUserWq(wechatMiniProgramUserWq);
return wechatMiniProgramUser;
}
@Override
public Long saveMiniProgramUser(MiniProgramOpenIdDTO miniProgramOpenIdDTO) {
WechatMiniProgramUser wechatMiniProgramUser = new WechatMiniProgramUser();
wechatMiniProgramUser.setOpenid(miniProgramOpenIdDTO.getOpenid());
wechatMiniProgramUser.setCreateTime(DateUtil.date());
wechatMiniProgramUser.setUpdateTime(DateUtil.date());
wechatMiniProgramUserDao.insert(wechatMiniProgramUser);
return wechatMiniProgramUser.getId();
}
}
......@@ -10,3 +10,4 @@ spring:
file-extension: yaml
group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
......@@ -2,4 +2,4 @@ spring:
profiles:
active: dev
application:
name: wangxiaolu-link-module-fortune-hub
name: wangxiaolu-link-fortune-hub
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
group: sfa
namespace: 9fb64726-e415-43e4-9e79-9be8d2666671
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: sfa
namespace: 9fb64726-e415-43e4-9e79-9be8d2666671
spring:
cloud:
nacos:
discovery:
server-addr: 10.0.0.170:8848
group: sfa
namespace: e2996044-6ddc-4988-8810-602e05d01ccf
config:
server-addr: 10.0.0.170:8848
file-extension: yaml
group: sfa
namespace: e2996044-6ddc-4988-8810-602e05d01ccf
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.100.38:8848
group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
config:
server-addr: 192.168.100.38:8848
file-extension: yaml
group: sfa
namespace: 24aed289-30a5-4e5c-8110-1b96281d1265
spring:
profiles:
active: dev
application:
name: wangxiaolu-link-module-fortune-hub
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="wangxiaolu-link-module-fortune-hub"/>
<property name="MODEL_NAME" value="fortune-hub"/>
<contextName>${APP_NAME}</contextName>
<!-- 日志存放路径 对应yml文件中spring.profiles.active配置-->
<springProfile name="dev">
<property name="LOG_PATH" value="./logs/${APP_NAME}" />
</springProfile>
<springProfile name="qa,live,master">
<property name="LOG_PATH" value="/var/logs/sfa/${APP_NAME}" />
</springProfile>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} --- [%thread] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} --- [%thread] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${MODEL_NAME}-today.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>false</cleanHistoryOnStart>
<fileNamePattern>${LOG_PATH}/${MODEL_NAME}-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>200MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>0</totalSizeCap>
</rollingPolicy>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="errorFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${MODEL_NAME}-error-today.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>false</cleanHistoryOnStart>
<fileNamePattern>${LOG_PATH}/${MODEL_NAME}-error-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>200MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>0</totalSizeCap>
</rollingPolicy>
<!--
此日志文件只记录debug级别的
onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 控制台-->
<root level="INFO">
<appender-ref ref="console" />
</root>
<!-- 文件日志-->
<root level="INFO">
<appender-ref ref="rollingFile" />
<appender-ref ref="errorFile" />
</root>
</configuration>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论