From 04b5a4e7bc1ec92c8ab6508ea8c5141910c1edcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=B9=E7=BA=A2?= Date: Mon, 17 Nov 2025 14:14:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=89=93=E6=A0=87=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/enums/ResponseCodeEnum.java | 3 +- .../wallet/AddTagCallbackNoticeRequest.java | 21 ++++ .../request/wallet/UpdatePasswordRequest.java | 27 ++++++ .../store/response/bigdata/ApiResponse.java | 19 +++- .../service/wallet/WalletApiService.java | 8 ++ .../store/service/wallet/WalletService.java | 7 ++ .../wallet/impl/WalletServiceImpl.java | 5 + .../store/config/OpenApiValidateFilter.java | 97 +++++++++++++++++++ .../controller/webb/OpenApiController.java | 10 ++ 9 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java index 3305b8d0d..8ef4d447e 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ResponseCodeEnum.java @@ -10,7 +10,8 @@ public enum ResponseCodeEnum { /** * 成功返回 */ - SUCCESS(200000, "SUCCESS"); + SUCCESS(200000, "SUCCESS"), + SUCCESS_WALLET(200, "SUCCESS"); /** * 返回码 diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java new file mode 100644 index 000000000..4d5a495b0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/AddTagCallbackNoticeRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/17 13:49 + * @Version 1.0 + */ +@Data +public class AddTagCallbackNoticeRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "状态1.打标成功 2.打标失败 3.处理中(打标状态)", required = true) + private Integer status; + @ApiModelProperty(name = "1.法人 2.非法人", required = true) + private Integer addTagType; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java new file mode 100644 index 000000000..a9e89b9b4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/UpdatePasswordRequest.java @@ -0,0 +1,27 @@ +package com.cool.store.request.wallet; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/17 11:20 + * @Version 1.0 + */ +@Data +public class UpdatePasswordRequest { + + @ApiModelProperty(name = "CRM门店编号", required = true) + private String outStoreId; + @ApiModelProperty(name = "维护类型 1.设置密码 2.修改密码", required = true) + private Integer upholdType; + @ApiModelProperty(name = "新支付密码(sm3加密后字符串)", required = true) + private String newPayPwd; + @ApiModelProperty(name = "确认新支付密码(sm3加密后字符串)", required = true) + private String confirmPayPwd; + @ApiModelProperty(name = "当前使用的支付密码(sm3加密后字符串),维护类型为修改密码时必填", required = false) + private String currentPayPwd; + + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java index 96e2f49ff..a822375d2 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/bigdata/ApiResponse.java @@ -3,9 +3,12 @@ package com.cool.store.response.bigdata; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ResponseCodeEnum; +import com.cool.store.response.ResponseResult; import lombok.Data; import org.slf4j.MDC; +import java.text.MessageFormat; + /** * @Author suzhuhong * @Date 2025/4/1 10:49 @@ -31,7 +34,19 @@ public class ApiResponse { return new ApiResponse(ResponseCodeEnum.SUCCESS.getCode(), "ok", data); } - public static ApiResponse error(ErrorCodeEnum errorCodeEnum) { - return new ApiResponse(errorCodeEnum.getCode(), errorCodeEnum.getMessage(), null); + /** + * 钱包系统 响应用200 + * @param data + * @param + * @return + */ + public static ApiResponse successByWallet(T data) { + return new ApiResponse(ResponseCodeEnum.SUCCESS_WALLET.getCode(), "ok", data); + } + + + public static ApiResponse fail(ErrorCodeEnum responseEnum, Object... objects){ + String message = MessageFormat.format(responseEnum.getMessage(), objects); + return new ApiResponse(responseEnum.getCode(), message, false); } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java index 4b77cea30..edbc36273 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletApiService.java @@ -161,6 +161,14 @@ public class WalletApiService { return walletHttpClientRest.postWithSign("https://api.dev.wenmatech.com:443/open/crm/base/v1/findPageBank", request, BankListDTO.class); } + /** + * 修改密码 + * @param request + * @return + */ + public String upholdPwd(UpdatePasswordRequest request){ + return walletHttpClientRest.postWithSign("https://api.dev.wenmatech.com:443/open/crm/account/v1/upholdPwd", request, String.class); + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java index de942f04d..33ea362d2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/WalletService.java @@ -49,4 +49,11 @@ public interface WalletService { * @param storeId 主数据门店id */ void addTagIfUploadLicense(Long shopId, String storeId); + + /** + * 打标成功回调通知 + * @param request + * @return + */ + Boolean addTagCallback(AddTagCallbackNoticeRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java index c642f5db8..eb793d1ae 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java @@ -180,6 +180,11 @@ public class WalletServiceImpl implements WalletService { return CollectionUtils.isNotEmpty(accountInfo) && accountInfo.size() == 1 && accountInfo.get(0).getLabelingStatus().equals(0); } + @Override + public Boolean addTagCallback(AddTagCallbackNoticeRequest request) { + return Boolean.TRUE; + } + /** * 查询并校验门店是否存在以及阶段是否处于平安钱包未开通状态 */ diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java index 624d2a602..8f660d4a4 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java @@ -5,7 +5,9 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; import com.cool.store.response.ResponseResult; +import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.utils.OpenSignatureUtil; +import com.cool.store.utils.RsaSignUtil; import com.cool.store.utils.UUIDUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -42,6 +44,8 @@ public class OpenApiValidateFilter implements Filter { private String coolAppKey; @Value("${cool.api.secret}") private String coolAppSecret; + @Value("${cool.api.rsa.private.key}") + private String coolPrivateKey; private static final Set WHITELIST_URIS = new HashSet<>(Arrays.asList( "/zxjp/open/v1/statusRefresh", "/zxjp/open/v1/getStoreUser", @@ -52,6 +56,8 @@ public class OpenApiValidateFilter implements Filter { "/zxjp/open/v1/getYlsToken", "/zxjp/open/v1/getStoreList", "/zxjp/open/v1/changeReceiptStatus", "/zxjp/open/v1/getStoreUser")); + // 添加钱包接口路径前缀常量 + private static final String WALLET_API_PATTERN = "^/zxjp/open/v\\d+/wallet/.*$"; @Override public void init(FilterConfig filterConfig) throws ServletException { } @@ -70,6 +76,11 @@ public class OpenApiValidateFilter implements Filter { filterChain.doFilter(servletRequest, response); return; } + // 针对钱包接口的专用验签处理 所有符合 /zxjp/open/v{版本号}/wallet/ 格式的接口都会走钱包专用的验签流程。 + if (uri.matches(WALLET_API_PATTERN)) { + handleWalletApiValidation(request, response, filterChain); + return; + } HttpServletResponse res = (HttpServletResponse) response; // 1. 验证时间戳 @@ -186,4 +197,90 @@ public class OpenApiValidateFilter implements Filter { @Override public void destroy() { } + + + private void handleWalletApiValidation(HttpServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + + try { + // 读取请求体 + StringBuilder requestBody = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + String line; + while ((line = reader.readLine()) != null) { + requestBody.append(line); + } + } + + String jsonBody = requestBody.toString(); + + // 1. 验证时间戳 + String timestampStr = extractTimestampFromJson(jsonBody); + if (timestampStr == null) { + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "缺少timestamp参数"); + return; + } + + long timestamp = Long.parseLong(timestampStr) / 1000; + long currentTime = System.currentTimeMillis() / 1000; + long timeDiff = Math.abs(currentTime - timestamp); + + if (timeDiff > 600) { + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "请求已过期,请保证timestamp时间在10分钟之内"); + return; + } + + // 2. 钱包接口专用验签逻辑 + if (!verifyWalletSignatureFromBody(jsonBody)) { + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "签名校验失败"); + return; + } + + filterChain.doFilter(request, response); + } catch (Exception e) { + log.error("钱包接口验签异常: ", e); + writeErrorResponse(res, ErrorCodeEnum.SIGN_FAIL, "验签异常"); + } + } + + /** + * 从JSON中提取timestamp字段 + */ + private String extractTimestampFromJson(String jsonBody) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + Map params = objectMapper.readValue(jsonBody, new TypeReference>() {}); + Object timestamp = params.get("timestamp"); + return timestamp != null ? timestamp.toString() : null; + } catch (Exception e) { + log.error("提取timestamp失败: ", e); + return null; + } + } + + /** + * 钱包接口签名验证方法 - 签名在请求体中 + */ + private boolean verifyWalletSignatureFromBody(String jsonBody) { + try { + // 解析请求参数 + ObjectMapper objectMapper = new ObjectMapper(); + Map params = objectMapper.readValue(jsonBody, new TypeReference>() {}); + + // 使用RsaSignUtil.verifyWalletSign进行验签 + return RsaSignUtil.verifyWalletSign(params, coolPrivateKey); + } catch (Exception e) { + log.error("钱包接口签名验证失败: ", e); + return false; + } + } + + /** + * 写入错误响应 + */ + private void writeErrorResponse(HttpServletResponse response, ErrorCodeEnum errorCode, String message) throws IOException { + response.setStatus(HttpStatus.OK.value()); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(JSON.toJSONString(ApiResponse.fail(errorCode, message))); + } } \ No newline at end of file diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java index c44825039..67d6493c0 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java @@ -11,11 +11,13 @@ import com.cool.store.request.StoreCodeDTO; import com.cool.store.request.*; import com.cool.store.request.notice.ThirdHandleMessageRequest; import com.cool.store.request.notice.ThirdMatterRequest; +import com.cool.store.request.wallet.AddTagCallbackNoticeRequest; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.*; +import com.cool.store.service.wallet.WalletService; import com.cool.store.utils.poi.StringUtils; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; @@ -57,6 +59,8 @@ public class OpenApiController { WechatMiniAppService wechatMiniAppService; @Autowired WeChatHandler weChatHandler; + @Resource + WalletService walletService; @PostMapping("/statusRefresh") public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ @@ -214,4 +218,10 @@ public class OpenApiController { } return echostr; } + + @ApiOperation("打标回调通知接口") + @PostMapping("/wallet/addTagCallback") + public ApiResponse addTagCallback(@RequestBody @Validated AddTagCallbackNoticeRequest request) { + return ApiResponse.successByWallet(walletService.addTagCallback(request)); + } }