feat(cms): 增加内部接口以激活站点状态

- 新增 /internal/activate POST接口,通过X-Internal-Key进行鉴权
- 实现根据请求体更新站点状态和运行标志
- 更新成功后清除对应站点缓存,保证状态及时同步
- 添加配置项 internal.key 用于内部接口密钥校验
- 处理鉴权失败和参数缺失的异常响应
- 采用日志记录缓存清理异常信息
This commit is contained in:
2026-08-10 19:47:43 +08:00
parent 73b5efeb8f
commit 975ec6758b
@@ -22,6 +22,7 @@ import com.gxwebsoft.common.system.entity.User;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -52,6 +53,9 @@ public class CmsWebsiteController extends BaseController {
@Resource @Resource
private CmsWebsiteSettingService cmsWebsiteSettingService; private CmsWebsiteSettingService cmsWebsiteSettingService;
@Value("${internal.key:websopy-internal-2025}")
private String internalKey;
private static final String SITE_INFO_KEY_PREFIX = "SiteInfo:"; private static final String SITE_INFO_KEY_PREFIX = "SiteInfo:";
private static final String MP_INFO_KEY_PREFIX = "MpInfo:"; private static final String MP_INFO_KEY_PREFIX = "MpInfo:";
private static final String SELECT_PAYMENT_KEY_PREFIX = "SelectPayment:"; private static final String SELECT_PAYMENT_KEY_PREFIX = "SelectPayment:";
@@ -679,5 +683,47 @@ public class CmsWebsiteController extends BaseController {
return success(cmsWebsiteService.pageReviews(param)); return success(cmsWebsiteService.pageReviews(param));
} }
/**
* 内部接口:由 websopy 支付回调在服务端调用,将站点置为「运行中(1)」。
* 通过 X-Internal-Key 头做简单鉴权(仅限内网/可信服务调用,密钥与 websopy 端保持一致)。
*/
@PostMapping("/internal/activate")
public ApiResult<?> activateInternal(
@RequestHeader(value = "X-Internal-Key", required = false) String key,
@RequestBody Map<String, Object> body) {
if (key == null || !key.equals(internalKey)) {
return fail("非法请求");
}
Integer websiteId = body.get("websiteId") instanceof Number
? ((Number) body.get("websiteId")).intValue() : null;
if (websiteId == null) {
return fail("websiteId 不能为空");
}
Integer status = body.get("status") instanceof Number
? ((Number) body.get("status")).intValue() : 1;
Integer running = body.get("running") instanceof Number
? ((Number) body.get("running")).intValue() : 0;
CmsWebsite site = new CmsWebsite();
site.setWebsiteId(websiteId);
site.setStatus(status);
site.setRunning(running);
if (cmsWebsiteService.updateById(site)) {
// 失效站点缓存,保证后台/公开站尽快读到新状态
try {
CmsWebsite exist = cmsWebsiteService.getOne(new LambdaQueryWrapper<CmsWebsite>()
.eq(CmsWebsite::getWebsiteId, websiteId).last("limit 1"));
if (exist != null && ObjectUtil.isNotEmpty(exist.getTenantId())) {
redisUtil.delete(SITE_INFO_KEY_PREFIX.concat(exist.getTenantId().toString()));
redisUtil.delete(MP_INFO_KEY_PREFIX.concat(exist.getTenantId().toString()));
}
} catch (Exception e) {
log.warn("清除站点缓存失败: {}", e.getMessage());
}
return success("站点已激活");
}
return fail("激活失败");
}
} }