diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java index d9c09e79..0b1fbee6 100644 --- a/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java +++ b/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java @@ -95,6 +95,9 @@ public interface UserDao extends HiverBaseDao { @Query("select u from User u where u.unionid = ?1 ") User findByUnionid(String unionid); + @Query("select u from User u where u.officialAccountOpenid = ?1 ") + User findByOfficialAccountOpenid(String officialAccountOpenid); + @Query("select u from User u where u.miniProgramOpenid = ?1 ") User findByMiniProgramOpenid(String miniProgramOpenid); diff --git a/hiver-core/src/main/java/cc/hiver/core/service/UserService.java b/hiver-core/src/main/java/cc/hiver/core/service/UserService.java index f9340eed..94e439a3 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/UserService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/UserService.java @@ -133,6 +133,8 @@ public interface UserService extends HiverBaseService { User findByUnionid(String unionid); + User findByOfficialAccountOpenid(String officialAccountOpenid); + User findByMiniProgramOpenid(String miniProgramOpenid); void setUserPhoneToNull(String userPhone); diff --git a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java index 9971e238..65f5881f 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java @@ -19,9 +19,9 @@ public interface WorkerService extends HiverBaseService { /** * 多条件分页获取抢单工 * - * @param Worker - * @param searchVo - * @param pageable + * @param + * @param + * @param * @return */ Page findByCondition(WorkerQueryVO worker); diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java index 67bd1788..5b570c13 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java @@ -325,8 +325,8 @@ public class UserServiceImpl implements UserService { */ @Override public void unSubscribeWxServer(WxMpUser user) { - final String unionid = user.getUnionId(); - User wechatUser = findByUnionid(unionid); + final String officialAccountOpenid = user.getOpenId(); + User wechatUser = findByOfficialAccountOpenid(officialAccountOpenid); // 接触微信公众号的openId wechatUser.setOfficialAccountOpenid(""); save(wechatUser); @@ -337,6 +337,11 @@ public class UserServiceImpl implements UserService { return userDao.findByUnionid(unionid); } + @Override + public User findByOfficialAccountOpenid(String officialAccountOpenid) { + return userDao.findByOfficialAccountOpenid(officialAccountOpenid); + } + @Override public User findByMiniProgramOpenid(String miniProgramOpenid) { return userDao.findByMiniProgramOpenid(miniProgramOpenid); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java index babba342..8e006546 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerRelaPriceController.java @@ -17,7 +17,9 @@ package cc.hiver.mall.controller; import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.vo.Result; +import cc.hiver.core.entity.User; import cc.hiver.core.entity.Worker; +import cc.hiver.core.service.UserService; import cc.hiver.core.service.WorkerService; import cc.hiver.mall.entity.WorkerRelaPrice; import cc.hiver.mall.pojo.vo.WorkerRealPriceVo; @@ -47,6 +49,9 @@ public class WorkerRelaPriceController { @Autowired private WorkerService workerService; + @Autowired + private UserService userService; + @RequestMapping(value = "/getByWorkerId", method = RequestMethod.GET) @ApiOperation("根据配送员id获取") public Result getByProductId(@RequestParam String workerId) { @@ -64,21 +69,42 @@ public class WorkerRelaPriceController { @PostMapping(value = "/batchAdd") @ApiOperation("批量新增") - public Result batchAdd(@RequestBody WorkerRealPriceVo workerRealPriceVo) { + public Result batchAdd(@RequestBody WorkerRealPriceVo workerRealPriceVo) { + User user = userService.findById(workerRealPriceVo.getUserId()); + Worker worker = workerService.findByUserId(workerRealPriceVo.getUserId()); if(workerRealPriceVo != null){ - workerRelaPriceService.deleteByWorkerId(workerRealPriceVo.getWorkerRelaPriceList().get(0).getWorkerId()); + workerRelaPriceService.deleteByWorkerId(worker.getWorkerId()); } //更新配送员信息 - Worker worker = new Worker(); - worker.setWorkerId(workerRealPriceVo.getWorkerRelaPriceList().get(0).getWorkerId()); worker.setWorkerName(workerRealPriceVo.getWorkerName()); worker.setCardPicture(workerRealPriceVo.getCardPicture()); worker.setHighFloorFee(workerRealPriceVo.getHighFloorFee()); workerService.update(worker); // 批量新增配送规则 + if(workerRealPriceVo.getWorkerRelaPriceList() != null){ + workerRealPriceVo.getWorkerRelaPriceList().forEach(workerRelaPrice -> { + workerRelaPrice.setWorkerId(worker.getWorkerId()); + }); + } final boolean b = workerRelaPriceService.saveBatch(workerRealPriceVo.getWorkerRelaPriceList()); if (b) { - return ResultUtil.success("保存成功!"); + return new ResultUtil().setData(user); + } else { + return ResultUtil.error("保存失败!"); + } + } + + @PostMapping(value = "/batchUpdate") + @ApiOperation("批量更新") + public Result batchUpdate(@RequestBody WorkerRealPriceVo workerRealPriceVo) { + Worker worker = workerService.findByUserId(workerRealPriceVo.getUserId()); + //更新配送员信息 接受指派单 + worker.setGetPushOrder(1); + workerService.update(worker); + // 批量更新配送规则 + final boolean b = workerRelaPriceService.saveOrUpdateBatch(workerRealPriceVo.getWorkerRelaPriceList()); + if (b) { + return ResultUtil.success("更新成功!"); } else { return ResultUtil.error("保存失败!"); } diff --git a/hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java b/hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java index 86f1ee6b..c63e8892 100644 --- a/hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java +++ b/hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java @@ -38,8 +38,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -231,39 +236,95 @@ public class WechatController { * 公众号回调接口(验证成功之后) * @author 王富康 * @date 2025/1/15 - * @param requestBody * @param signature * @param timestamp * @param nonce * @return String */ - @RequestMapping("echo") + @RequestMapping(value = "/echo", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody - public String configAccess(@RequestBody String requestBody, @RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce) { - // 校验签名 - if (!wxMpService.checkSignature(timestamp, nonce, signature)) { - log.error("签名校验 ===》 非法请求"); - // 消息签名不正确,说明不是公众平台发过来的消息 - return null; - } - log.error("签名校验 ===》 验证成功"); - - // 解析消息体,封装为对象 - final WxMpXmlMessage xmlMessage = WxMpXmlMessage.fromXml(requestBody); - WxMpXmlOutMessage outMessage = null; - try { - // 将消息路由给对应的处理器,获取响应 - outMessage = wxMpMessageRouter.route(xmlMessage); - } catch (Exception e) { - log.error("消息路由异常", e); + public String configAccess(HttpServletRequest request, + @RequestParam(value = "signature", required = false) String signature, + @RequestParam(value = "timestamp", required = false) String timestamp, + @RequestParam(value = "nonce", required = false) String nonce, + @RequestParam(value = "echostr", required = false) String echostr) { + + String method = request.getMethod(); + log.info("====== 收到微信请求 [{}] ======", method); + + // 1. 处理 GET 请求 (验证) + if ("GET".equalsIgnoreCase(method)) { + if (!wxMpService.checkSignature(timestamp, nonce, signature)) { + log.error("签名校验失败 (GET)"); + return "error"; + } + log.info("验证成功,返回 echostr: {}", echostr); + return echostr; } - if (outMessage != null) { - log.info("到了返回了========" + outMessage.toXml()); - } else { - log.info("到了返回了========outMessage为空!"); + + // 2. 处理 POST 请求 (消息推送) + if ("POST".equalsIgnoreCase(method)) { + if (!wxMpService.checkSignature(timestamp, nonce, signature)) { + log.error("签名校验失败 (POST)"); + return ""; + } + + // 【核心修复】兼容 Java 8 的流读取方式 + String requestBody = ""; + try { + InputStream inputStream = request.getInputStream(); + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + result.write(buffer, 0, length); + } + // 微信默认 UTF-8 编码 + requestBody = result.toString(StandardCharsets.UTF_8.name()); + } catch (IOException e) { + log.error("读取请求体 IO 异常", e); + return "success"; + } + + log.info(">>> 原始 XML 内容:\n{}", requestBody); + + if (requestBody == null || requestBody.trim().isEmpty()) { + log.error("!!! 请求体为空,无法解析 !!!"); + return "success"; + } + + // 解析 XML + WxMpXmlMessage xmlMessage; + try { + xmlMessage = WxMpXmlMessage.fromXml(requestBody); + } catch (Exception e) { + log.error("XML 解析异常", e); + log.error("原始内容可能是: {}", requestBody.substring(0, Math.min(100, requestBody.length()))); + return "success"; + } + + log.info("解析结果 -> MsgType: {}, Event: {}, FromUser: {}", + xmlMessage.getMsgType(), xmlMessage.getEvent(), xmlMessage.getFromUser()); + + // 路由 + WxMpXmlOutMessage outMessage = null; + try { + outMessage = wxMpMessageRouter.route(xmlMessage); + } catch (Exception e) { + log.error("消息路由异常", e); + } + + if (outMessage != null) { + String xmlStr = outMessage.toXml(); + log.info("返回消息: {}", xmlStr); + return xmlStr; + } else { + log.info("路由未匹配,返回 success"); + return "success"; + } } - // 将响应消息转换为xml格式返回 - return outMessage == null ? null : outMessage.toXml(); + + return ""; } /**