From 83396a38be3c69c81f8acc4681c18f5dd0e698be Mon Sep 17 00:00:00 2001 From: xin <1099200748@qq.com> Date: Tue, 08 Jul 2025 21:17:41 +0800 Subject: [PATCH] 完善提交订单逻辑 --- oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderReturnQueryCriteria.java | 3 oying-system/src/main/resources/config/application-dev.yml | 8 oying-system/src/main/resources/mapper/sh/OrderMapper.xml | 15 + oying-system/src/main/java/com/oying/modules/hwc/service/CallbackService.java | 11 + oying-system/src/main/java/com/oying/modules/hwc/rest/SwiftPassController.java | 8 oying-system/src/main/java/com/oying/modules/sh/mapper/OrderReturnMapper.java | 4 oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java | 113 ++++++++++++++ oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java | 16 + oying-system/src/main/resources/config/application-prod.yml | 8 oying-system/src/main/java/com/oying/modules/sh/domain/OrderReturn.java | 18 + oying-common/src/main/java/com/oying/utils/enums/PayTypeEnum.java | 5 pom.xml | 7 oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java | 107 +++---------- oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java | 41 +++++ oying-system/src/main/java/com/oying/modules/security/config/SwiftPassProperties.java | 4 oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java | 9 + oying-system/src/main/resources/mapper/sh/OrderReturnMapper.xml | 15 + oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java | 7 oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java | 13 - oying-system/src/main/java/com/oying/modules/system/domain/UserStore.java | 2 oying-system/src/main/java/com/oying/modules/sh/service/OrderReturnService.java | 4 oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java | 14 + oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java | 24 ++ 23 files changed, 336 insertions(+), 120 deletions(-) diff --git a/oying-common/src/main/java/com/oying/utils/enums/PayTypeEnum.java b/oying-common/src/main/java/com/oying/utils/enums/PayTypeEnum.java index cdca695..305d014 100644 --- a/oying-common/src/main/java/com/oying/utils/enums/PayTypeEnum.java +++ b/oying-common/src/main/java/com/oying/utils/enums/PayTypeEnum.java @@ -13,7 +13,10 @@ public enum PayTypeEnum { /* 支付类型 汇旺财 */ - HWC("HWC", "汇旺财"), + HWC("HWC", "汇旺财1721415002"), + + /* 支付类型 汇旺财 */ + HWC2("HWC2", "汇旺财1721753752"), UNKNOWN("UNKNOWN", "暂未开放"); diff --git a/oying-system/src/main/java/com/oying/modules/hwc/rest/SwiftPassController.java b/oying-system/src/main/java/com/oying/modules/hwc/rest/SwiftPassController.java index f544bdb..9718207 100644 --- a/oying-system/src/main/java/com/oying/modules/hwc/rest/SwiftPassController.java +++ b/oying-system/src/main/java/com/oying/modules/hwc/rest/SwiftPassController.java @@ -1,7 +1,7 @@ package com.oying.modules.hwc.rest; import com.oying.annotation.rest.AnonymousPostMapping; -import com.oying.modules.hwc.service.SwiftPassService; +import com.oying.modules.hwc.service.CallbackService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -22,17 +22,17 @@ @RequestMapping("/api/swiftPass") public class SwiftPassController { - private final SwiftPassService swiftPassService; + private final CallbackService callbackService; @ApiOperation("HWS支付回调") @AnonymousPostMapping(value = "/alipayCallback") public void alipayCallback(HttpServletRequest request, HttpServletResponse response) { - swiftPassService.alipayCallback(request, response); + callbackService.alipayCallback(request, response); } @ApiOperation("HWS退款回调") @AnonymousPostMapping(value = "/returnNotify") public void returnNotify(HttpServletRequest request, HttpServletResponse response) { - swiftPassService.returnNotify(request, response); + callbackService.returnNotify(request, response); } } diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/CallbackService.java b/oying-system/src/main/java/com/oying/modules/hwc/service/CallbackService.java new file mode 100644 index 0000000..ff0a1e9 --- /dev/null +++ b/oying-system/src/main/java/com/oying/modules/hwc/service/CallbackService.java @@ -0,0 +1,11 @@ +package com.oying.modules.hwc.service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public interface CallbackService { + + void alipayCallback(HttpServletRequest request, HttpServletResponse response); + + void returnNotify(HttpServletRequest request, HttpServletResponse response); +} diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java b/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java index 20be22e..5c6c7c5 100644 --- a/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java +++ b/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java @@ -4,10 +4,7 @@ import com.oying.modules.hwc.domain.HwcResponse; import com.oying.utils.enums.PayTypeEnum; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; -import java.io.IOException; import java.util.Map; /** @@ -32,9 +29,9 @@ * * @see [类、类#方法、类#成员] */ - JSONObject query(String orderNum, PayTypeEnum status) throws IOException; + JSONObject query(String orderNum, PayTypeEnum status); - void closeOrder(String outTradeNo, PayTypeEnum status) throws IOException; + void closeOrder(String outTradeNo, PayTypeEnum status); /** * <一句话功能简述> @@ -43,9 +40,5 @@ * @see [类、类#方法、类#成员] */ Map<String, String> refund(String returnNum, String orderNum, @NotNull(message = "备注不能为空") String reason, - long refund, long total, PayTypeEnum payType) throws IOException; - - void alipayCallback(HttpServletRequest request, HttpServletResponse response); - - void returnNotify(HttpServletRequest request, HttpServletResponse response); + long refund, long total, PayTypeEnum payType); } diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java new file mode 100644 index 0000000..23ff7af --- /dev/null +++ b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java @@ -0,0 +1,113 @@ +package com.oying.modules.hwc.service.impl; + +import com.oying.exception.BadRequestException; +import com.oying.modules.hwc.service.CallbackService; +import com.oying.modules.hwc.utils.SignUtil; +import com.oying.modules.hwc.utils.XmlUtils; +import com.oying.modules.security.config.SwiftPassProperties; +import com.oying.modules.sh.domain.Order; +import com.oying.modules.sh.domain.OrderReturn; +import com.oying.modules.sh.service.OrderReturnService; +import com.oying.modules.sh.service.OrderService; +import com.oying.utils.enums.PayStateEnum; +import com.oying.utils.enums.PayTypeEnum; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * @author xin + * @description + * @date 2025/7/8 18:47 + */ +@SuppressWarnings({"unchecked", "all"}) +@Slf4j +@Service +@RequiredArgsConstructor +public class CallbackServiceImpl implements CallbackService { + + private final OrderService orderService; + private final OrderReturnService returnService; + private final SwiftPassProperties properties; + + @Override + @Transactional(rollbackFor = Exception.class) + public void alipayCallback(HttpServletRequest request, HttpServletResponse response) { + try { + String resString = XmlUtils.parseRequest(request); + String respString = "error"; + if (!resString.isEmpty()) { + Map<String, String> map = XmlUtils.toMap(resString.getBytes(), "utf-8"); + String sign_type = map.get("sign_type"); + String reSign = map.get("sign"); + if (map.containsKey("sign")) { + Order order = orderService.getByOrderNum(map.get("out_trade_no")); + PayTypeEnum status = PayTypeEnum.find(order.getPayType()); + if (SignUtil.verifySign(reSign, sign_type, map, properties, status)) { + log.error("验证签名错误!:{}", map.toString()); + } else { + if ("0".equals(map.get("status"))) { + if ("0".equals(map.get("result_code"))) { + //业务处理 + if (PayStateEnum.SUCCESS.getKey().equals(order.getPayState())) { + // 已处理 + respString = "success"; + } else { + PayStateEnum stateEnum = PayStateEnum.NOTPAY; + if ("0".equals(map.get("pay_result"))) { + stateEnum = PayStateEnum.SUCCESS; + } + orderService.updatePayStatus(map.get("out_trade_no"), stateEnum, map.get("pay_info"), map.get("time_end")); + // 处理成功 + respString = "success"; + } + } + } + } + } + } + response.getWriter().write(respString); + } catch (Exception e) { + throw new BadRequestException("操作失败,原因:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void returnNotify(HttpServletRequest request, HttpServletResponse response) { + try { + String resString = XmlUtils.parseRequest(request); + String respString = "error"; + if (!resString.isEmpty()) { + Map<String, String> map = XmlUtils.toMap(resString.getBytes(), "utf-8"); + String sign_type = map.get("sign_type"); + String reSign = map.get("sign"); + if (map.containsKey("sign")) { + OrderReturn order = returnService.getByReturnNum(map.get("out_refund_no")); + PayTypeEnum status = PayTypeEnum.find(order.getPayType()); + if (SignUtil.verifySign(reSign, sign_type, map, properties, status)) { + log.error("验证签名错误!:{}", map.toString()); + } else { + if ("0".equals(map.get("status"))) { + if ("0".equals(map.get("result_code"))) { + // 业务处理 + returnService.updatePayStatus(map.get("out_refund_no"), map.get("refund_status"), + map.get("refund_time")); + // 业务处理 + respString = "success"; + } + } + } + } + } + response.getWriter().write(respString); + } catch (Exception e) { + System.out.println("操作失败,原因:" + e.getMessage()); + } + } +} diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java index e300f79..4a63f07 100644 --- a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java @@ -1,6 +1,7 @@ package com.oying.modules.hwc.service.impl; import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; import com.oying.exception.BadRequestException; import com.oying.modules.hwc.domain.HwcResponse; import com.oying.modules.hwc.service.SwiftPassService; @@ -9,8 +10,6 @@ import com.oying.modules.hwc.utils.XmlUtils; import com.oying.modules.security.config.SwiftPassProperties; import com.oying.modules.security.config.WeiXinProperties; -import com.oying.modules.sh.service.OrderReturnService; -import com.oying.modules.sh.service.OrderService; import com.oying.utils.CloseUtil; import com.oying.utils.enums.PayTypeEnum; import lombok.RequiredArgsConstructor; @@ -24,9 +23,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; import java.util.*; /** @@ -48,14 +44,12 @@ private final static String service_close = "unified.trade.close"; private final SwiftPassProperties properties; - private final OrderService orderService; - private final OrderReturnService returnService; private final WeiXinProperties weiXinProperties; @Override @Transactional(rollbackFor = Exception.class) public HwcResponse pay(String ip, String total, String timeExpire, String description, String openId, - String orderNum, PayTypeEnum status) { + String orderNum, PayTypeEnum status) { SortedMap<String, String> map = new TreeMap<>(); map.put("service", service_pay); map.put("version", version); @@ -75,6 +69,9 @@ switch (status) { case HWC: map.put("mch_id", properties.getMchId()); + break; + case HWC2: + map.put("mch_id", properties.getMchId2()); break; default: throw new BadRequestException("汇旺财类型错误"); @@ -106,9 +103,8 @@ throw new BadRequestException("验证签名错误"); } else { if ("0".equals(resultMap.get("status")) && "0".equals(resultMap.get("result_code"))) { -// Gson gson = new Gson(); -// return gson.fromJson(resultMap.get("pay_info"), HwcResponse.class); - return null; + Gson gson = new Gson(); + return gson.fromJson(resultMap.get("pay_info"), HwcResponse.class); } else { throw new BadRequestException(resultMap.get("err_code") + " : " + resultMap.get("err_msg") + "\n" + resultMap.get("status") + " : " + resultMap.get("message")); @@ -132,7 +128,7 @@ } @Override - public JSONObject query(String orderNum, PayTypeEnum status) throws IOException { + public JSONObject query(String orderNum, PayTypeEnum status) { // 参数 SortedMap<String, String> map = new TreeMap<>(); map.put("service", service_query); @@ -143,6 +139,9 @@ switch (status) { case HWC: map.put("mch_id", properties.getMchId()); + break; + case HWC2: + map.put("mch_id", properties.getMchId2()); break; default: throw new BadRequestException("汇旺财类型错误"); @@ -190,16 +189,16 @@ throw new BadRequestException("操作失败,原因:" + e.getMessage()); } finally { if (response != null) { - response.close(); + CloseUtil.close(response); } if (client != null) { - client.close(); + CloseUtil.close(client); } } } @Override - public void closeOrder(String outTradeNo, PayTypeEnum status) throws IOException { + public void closeOrder(String outTradeNo, PayTypeEnum status) { // 参数 SortedMap<String, String> map = new TreeMap<>(); map.put("service", service_close); @@ -210,6 +209,9 @@ switch (status) { case HWC: map.put("mch_id", properties.getMchId()); + break; + case HWC2: + map.put("mch_id", properties.getMchId2()); break; default: throw new BadRequestException("汇旺财类型错误"); @@ -254,10 +256,10 @@ throw new BadRequestException("操作失败,原因:" + e.getMessage()); } finally { if (response != null) { - response.close(); + CloseUtil.close(response); } if (client != null) { - client.close(); + CloseUtil.close(client); } } } @@ -265,7 +267,7 @@ @Override @Transactional(rollbackFor = Exception.class) public Map<String, String> refund(String returnNum, String orderNum, String reason, long refund, - long total, PayTypeEnum payType) throws IOException { + long total, PayTypeEnum payType) { // 参数 SortedMap<String, String> map = new TreeMap<>(); map.put("service", service_refund); @@ -281,6 +283,10 @@ case HWC: map.put("mch_id", properties.getMchId()); map.put("op_user_id", properties.getMchId()); + break; + case HWC2: + map.put("mch_id", properties.getMchId2()); + map.put("op_user_id", properties.getMchId2()); break; default: throw new BadRequestException("汇旺财类型错误"); @@ -324,74 +330,13 @@ throw new BadRequestException("操作失败,原因:" + e); } finally { if (response != null) { - response.close(); + CloseUtil.close(response); } if (client != null) { - client.close(); + CloseUtil.close(client); } } } - @Override - @Transactional(rollbackFor = Exception.class) - public void alipayCallback(HttpServletRequest request, HttpServletResponse response) { - try { - String resString = XmlUtils.parseRequest(request); - String respString = "error"; - if (!resString.isEmpty()) { - Map<String, String> map = XmlUtils.toMap(resString.getBytes(), "utf-8"); - String sign_type = map.get("sign_type"); - String reSign = map.get("sign"); - if (map.containsKey("sign")) { -// OrderDto order = orderService.findByOrderNum(map.get("out_trade_no")); - PayTypeEnum status = PayTypeEnum.find("order.getPayType()"); - if (SignUtil.verifySign(reSign, sign_type, map, properties, status)) { - System.out.println("验证签名错误!:" + map); - } else { - if ("0".equals(map.get("status"))) { - if ("0".equals(map.get("result_code"))) { - //业务处理 - respString = "success"; - response.getWriter().write(respString); - } - } - } - } - } - response.getWriter().write(respString); - } catch (Exception e) { - throw new BadRequestException("操作失败,原因:" + e.getMessage()); - } - } - @Override - @Transactional(rollbackFor = Exception.class) - public void returnNotify(HttpServletRequest request, HttpServletResponse response) { - try { - String resString = XmlUtils.parseRequest(request); - String respString = "error"; - if (!resString.isEmpty()) { - Map<String, String> map = XmlUtils.toMap(resString.getBytes(), "utf-8"); - String sign_type = map.get("sign_type"); - String reSign = map.get("sign"); - if (map.containsKey("sign")) { -// ReturnOrder returnOrder = returnOrderRepository.findByReturnNum(map.get("out_refund_no")); - PayTypeEnum status = PayTypeEnum.find("order.getPayType()"); - if (SignUtil.verifySign(reSign, sign_type, map, properties, status)) { - System.out.println("验证签名错误!:" + map); - } else { - if ("0".equals(map.get("status"))) { - if ("0".equals(map.get("result_code"))) { - // 业务处理 - respString = "success"; - } - } - } - } - } - response.getWriter().write(respString); - } catch (Exception e) { - System.out.println("操作失败,原因:" + e.getMessage()); - } - } } diff --git a/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java b/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java index b2a80cb..1bb9545 100644 --- a/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java +++ b/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java @@ -27,8 +27,11 @@ throw new BadRequestException(e1.getMessage()); } } else { - if (status.equals(PayTypeEnum.HWC)) { - return MD5.sign(preStr, "&key=" + properties.getKey(), "utf-8"); + switch (status) { + case HWC: + return MD5.sign(preStr, "&key=" + properties.getKey(), "utf-8"); + case HWC2: + return MD5.sign(preStr, "&key=" + properties.getKey2(), "utf-8"); } throw new BadRequestException("汇旺财类型错误"); } @@ -45,8 +48,11 @@ String preStr = builder.toString(); return !SignUtil.verifySign(preStr, sign, "RSA_1_256", properties.getPlatPublicKey()); } else if ("MD5".equals(signType)) { - if (status.equals(PayTypeEnum.HWC)) { - return !SignUtils.checkParam(resultMap, properties.getKey()); + switch (status) { + case HWC: + return !SignUtils.checkParam(resultMap, properties.getKey()); + case HWC2: + return !SignUtils.checkParam(resultMap, properties.getKey2()); } throw new BadRequestException("汇旺财类型错误"); } diff --git a/oying-system/src/main/java/com/oying/modules/security/config/SwiftPassProperties.java b/oying-system/src/main/java/com/oying/modules/security/config/SwiftPassProperties.java index e420159..14e156a 100644 --- a/oying-system/src/main/java/com/oying/modules/security/config/SwiftPassProperties.java +++ b/oying-system/src/main/java/com/oying/modules/security/config/SwiftPassProperties.java @@ -17,12 +17,16 @@ public class SwiftPassProperties { // 交易密钥1 private String key; + // 交易密钥2 + private String key2; // 平台私钥 private String mchPrivateKey; // 平台公钥 private String platPublicKey; // 门店编号1 private String mchId; + // 门店编号2 + private String mchId2; // 签名方式 private String signType; // 原生JS diff --git a/oying-system/src/main/java/com/oying/modules/sh/domain/OrderReturn.java b/oying-system/src/main/java/com/oying/modules/sh/domain/OrderReturn.java index a9c58a6..06a4865 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/domain/OrderReturn.java +++ b/oying-system/src/main/java/com/oying/modules/sh/domain/OrderReturn.java @@ -4,11 +4,13 @@ import cn.hutool.core.bean.BeanUtil; import io.swagger.annotations.ApiModelProperty; import cn.hutool.core.bean.copier.CopyOptions; + import java.sql.Timestamp; import java.math.BigDecimal; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.io.Serializable; + import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -16,10 +18,10 @@ import lombok.Setter; /** -* @description / -* @author lixin -* @date 2025-06-11 -**/ + * @author lixin + * @description / + * @date 2025-06-11 + **/ @Getter @Setter @TableName("sh_order_return") @@ -44,6 +46,10 @@ @NotBlank @ApiModelProperty(value = "订单号") private String orderNum; + + @NotBlank + @ApiModelProperty(value = "支付类型") + private String payType; @NotNull @ApiModelProperty(value = "用户") @@ -110,7 +116,7 @@ @ApiModelProperty(value = "审核信息") private String auditMessage; - public void copy(OrderReturn source){ - BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); + public void copy(OrderReturn source) { + BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); } } diff --git a/oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderReturnQueryCriteria.java b/oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderReturnQueryCriteria.java index cd54935..710cd22 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderReturnQueryCriteria.java +++ b/oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderReturnQueryCriteria.java @@ -27,6 +27,9 @@ @ApiModelProperty(value = "订单号") private String orderNum; + @ApiModelProperty(value = "支付类型") + private String payType; + @ApiModelProperty(value = "用户") private Long userId; diff --git a/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java b/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java index f300317..e7fb24b 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java +++ b/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java @@ -3,6 +3,7 @@ import com.oying.modules.sh.domain.Order; import com.oying.modules.sh.domain.dto.OrderQueryCriteria; import java.util.List; + import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -19,4 +20,10 @@ IPage<Order> findAll(@Param("criteria") OrderQueryCriteria criteria, Page<Object> page); List<Order> findAll(@Param("criteria") OrderQueryCriteria criteria); + + Order getByOrderNum(String orderNum); + + void updatePayStatus(String orderNum, String payState, String payMessage, String payTime); + + void updateCloseStatus(String orderNum, String payState); } diff --git a/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderReturnMapper.java b/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderReturnMapper.java index 401db5c..451b94f 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderReturnMapper.java +++ b/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderReturnMapper.java @@ -19,4 +19,8 @@ IPage<OrderReturn> findAll(@Param("criteria") OrderReturnQueryCriteria criteria, Page<Object> page); List<OrderReturn> findAll(@Param("criteria") OrderReturnQueryCriteria criteria); + + OrderReturn getByReturnNum(String returnNum); + + void updatePayStatus(String returnNum, String status, String time); } diff --git a/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java b/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java index 32d8f30..3ee152d 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java +++ b/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java @@ -64,7 +64,7 @@ } @GetMapping("mini") - @ApiOperation("小程序:查询订单信息") + @ApiOperation("小程序:查询订单信息列") public ResponseEntity<Object> miniQueryOrder(OrderQueryCriteria criteria) { Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize()); criteria.setUserId(SecurityUtils.getCurrentUserId()); @@ -92,4 +92,18 @@ orderService.deleteAll(ids); return new ResponseEntity<>(R.success(), HttpStatus.OK); } + + @Log("关闭订单") + @ApiOperation("关闭订单") + @PostMapping(value = "/closeOrder") + public ResponseEntity<Object> closeOrder(@RequestParam String orderNum) { + orderService.closeOrder(orderNum); + return new ResponseEntity<>(R.success(), HttpStatus.OK); + } + + @ApiOperation("订单号查询订单") + @GetMapping(value = "/getByOrderNum") + public ResponseEntity<Object> getByOrderNum(@RequestParam String orderNum) { + return new ResponseEntity<>(R.success(orderService.getByOrderNum(orderNum)), HttpStatus.OK); + } } diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/OrderReturnService.java b/oying-system/src/main/java/com/oying/modules/sh/service/OrderReturnService.java index cabc3b3..bdab037 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/service/OrderReturnService.java +++ b/oying-system/src/main/java/com/oying/modules/sh/service/OrderReturnService.java @@ -56,4 +56,8 @@ * @throws IOException / */ void download(List<OrderReturn> all, HttpServletResponse response) throws IOException; + + OrderReturn getByReturnNum(String outRefundNo); + + void updatePayStatus(String outRefundNo, String status, String time); } diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java b/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java index e19d9e9..1ae08fb 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java +++ b/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java @@ -14,6 +14,7 @@ import com.oying.modules.sh.domain.request.SubmitOrder; import com.oying.modules.sh.domain.vo.OrderInfo; import com.oying.utils.PageResult; +import com.oying.utils.enums.PayStateEnum; /** * @author lixin @@ -42,6 +43,12 @@ OrderInfo generatorOrder(GeneratorOrder generator); Order submitOrder(SubmitOrder submit, HttpServletRequest request); + + Order getByOrderNum(String orderNum); + + void paySuccess(Order order); + + void updatePayStatus(String outTradeNo, PayStateEnum stateEnum, String payInfo, String timeEnd); /** * 创建 @@ -72,4 +79,6 @@ * @throws IOException / */ void download(List<Order> all, HttpServletResponse response) throws IOException; + + void closeOrder(String orderNum); } diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java index b362171..1c7ced3 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java @@ -12,19 +12,21 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.oying.utils.PageUtil; + import java.util.List; import java.util.Map; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.LinkedHashMap; + import com.oying.utils.PageResult; /** -* @description 服务实现 -* @author lixin -* @date 2025-06-11 -**/ + * @author lixin + * @description 服务实现 + * @date 2025-06-11 + **/ @Service @RequiredArgsConstructor public class OrderReturnServiceImpl extends ServiceImpl<OrderReturnMapper, OrderReturn> implements OrderReturnService { @@ -32,16 +34,26 @@ private final OrderReturnMapper orderReturnMapper; @Override - public PageResult<OrderReturn> queryAll(OrderReturnQueryCriteria criteria, Page<Object> page){ + public PageResult<OrderReturn> queryAll(OrderReturnQueryCriteria criteria, Page<Object> page) { return PageUtil.toPage(orderReturnMapper.findAll(criteria, page)); } @Override - public List<OrderReturn> queryAll(OrderReturnQueryCriteria criteria){ + public List<OrderReturn> queryAll(OrderReturnQueryCriteria criteria) { return orderReturnMapper.findAll(criteria); } @Override + public OrderReturn getByReturnNum(String returnNum) { + return orderReturnMapper.getByReturnNum(returnNum); + } + + @Override + public void updatePayStatus(String returnNum, String status, String time) { + orderReturnMapper.updatePayStatus(returnNum, status, time); + } + + @Override @Transactional(rollbackFor = Exception.class) public void create(OrderReturn resources) { orderReturnMapper.insert(resources); diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java index 82885bb..c185dc3 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java @@ -196,6 +196,47 @@ @Override @Transactional(rollbackFor = Exception.class) + public Order getByOrderNum(String orderNum) { + return orderMapper.getByOrderNum(orderNum); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void paySuccess(Order order) { + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updatePayStatus(String orderNum, PayStateEnum payState, String payMessage, String payTime) { + orderMapper.updatePayStatus(orderNum, payState.getKey(), payMessage, payTime); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void closeOrder(String orderNum) { + Order order = getByOrderNum(orderNum); + if (order == null) { + throw new BadRequestException("订单不存在"); + } + PayTypeEnum anEnum = PayTypeEnum.find(order.getPayType()); + switch (anEnum) { + case HWC: + case HWC2: + JSONObject object = swiftPassService.query(orderNum, anEnum); + if (object.getString("trade_state").equals(PayStateEnum.SUCCESS.getKey())) { + throw new BadRequestException("订单已支付"); + } + if (object.getString("trade_state").equals(PayStateEnum.CLOSED.getKey())) { + throw new BadRequestException("订单已关闭"); + } + swiftPassService.closeOrder(orderNum, anEnum); + break; + } + orderMapper.updateCloseStatus(orderNum, PayStateEnum.CLOSED.getKey()); + } + + @Override + @Transactional(rollbackFor = Exception.class) public void create(Order resources) { orderMapper.insert(resources); } diff --git a/oying-system/src/main/java/com/oying/modules/system/domain/UserStore.java b/oying-system/src/main/java/com/oying/modules/system/domain/UserStore.java index c90c772..8a0cb9b 100644 --- a/oying-system/src/main/java/com/oying/modules/system/domain/UserStore.java +++ b/oying-system/src/main/java/com/oying/modules/system/domain/UserStore.java @@ -28,11 +28,9 @@ @ApiModelProperty(value = "ID", hidden = true) private Long managerId; - @TableId(value = "store_id") @ApiModelProperty(value = "门店id") private Long storeId; - @TableId(value = "user_id") @ApiModelProperty(value = "用户id") private Long userId; diff --git a/oying-system/src/main/resources/config/application-dev.yml b/oying-system/src/main/resources/config/application-dev.yml index 4aa5a20..afb8b1c 100644 --- a/oying-system/src/main/resources/config/application-dev.yml +++ b/oying-system/src/main/resources/config/application-dev.yml @@ -152,12 +152,16 @@ swift-pass: # 密钥 key: vJB6683s4NtQtXBgHTvE1hWOUtcre7nj + # 密钥2 + key-2: s7Jf1eEM5QlxihWSxZh673pDhGY7p0s0 # 私钥 mch-private-key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2YNuGqSAFcIVOc9mnmIbnVfQoyyMBoyGqTD3beiy/UsXZrGF4OIrPEevwXnwHktURupjHAKvt92PL4L9wTz7cknaQkF0NH5saOdY3sL88xH7F3qSgIwHPvkRileFeEHx+pKnXBms8yiliDqPk0MV3iRRoXKhRnojrWAYJhyz+1iJ13qWXCWcpr9hf77Uu/r1N7wsJKN4Z75M2qQC6LgRTaHoBroLGVtld4PM30ee6o9RR8yiFVx4FDVukinGR15nTsrNh+sUx3piVXqYrq23UPjUWVtJlf9cEvfNVXCMsa71LGEzUl0zxDfeyXRQhel3E27p2oovEYvhl5s+pZhtXAgMBAAECggEBAKXZLKinccwgh8lRBrQmuz7x5ieWms3pWDryPCozTy/pCKyq2rQlzu0BIiqi8W09tG773eTSEodDOkhzqANsvQB+XD2YWlYN0NEnmUtpem67TYGItvI9A2+0WaHBJIGSwnO0MBKu7qQIP1vBbn8s7vWF/b3tzM70ORSzJkJR37QY435+ZG9rKMKyL/tuGW7E5AgrHmyl2aK9me3vgUrZct2e9l5XLrn9oU1niEmbDbFARhphXDCEPIvFiu7WtFDBmp/jEOc4u/y/sYMjS1RWpO9iOyTZDO8Mi9iofXugmoot4Tn0lBckeR6YVRb/I3EcVADoMfk1iaN1aWv1u+Ska8ECgYEA3ZFYMvo5y7SztrEbyLpWGsp6aM4a5ght8p52/rFhSHD5CGS7Uywhp4LxxIjLTRBNa/UkBzOq1Xt1+PVDNHf0E1yYZqEv9OXWC0yiCsnwO6b7o9hc3VnnX4jw7FkS0+pjfgCK4/A9hFj9xUI+qX3L3+pOCseioUeYofqTc2bn7ncCgYEA0rhvvNO30EisLACdOIem8XgbL4LjKJ47FnYS/TEZ9cDhJW5G2pAxgyFsqhN/GuTVg8uSQ7a6PlcBxzTuOwdZg05RcCAdmsXUdGjVbKk2i4CBp0K1j4QYfr8Wt18x0RLfzIQDrZQajWssVGjo8sfMn8qmjbRNbMmokRTflGIkEiECgYEAxChaYn9fzbYEaRixlWtKsdtSthjKfZ8239ZlWSVnEEBcaY7svTzT6r6mFq5Y9rgZIxvbsriOZQQxtKBGyFvubXnLvwizMWiNsGE/ELgphFZYcH0r8hgXHGBbk5NkdNMNFE+cpyJZBCPZP9tfKKUjavC/+RE3LPv66GS0SDXx3g8CgYAYOIT3cmqFcWUA5c0si0MgLEsLqgLMT2vBSC8klTlDqzj14XgZdUuLpBLmdbk9cSIttP+J8v3zXnLg3++mL1EVq7HmrnpYqPajrs0hYU3YuRuuCxfteCSMpRBKYZHLU10QF/iIQibPLIt65FgqV9boYxXD4f6oS4Gps3mDh8hXoQKBgBKojPBWgp4/WBMfh8nUzFzTiW7ACyG2jAxGtu0dtqfwx2LkesUKGhD1JGlxdDQ6jSv9tbhAgbZjTAULSo03626ZaiSDF+nCwFsobd3wRiij8LiL9amW5t6XBeX6bS5SCh45GbgnNBtzBqUI19/CGH09YXNpCYnADsY4fab4wNpR # 公钥 plat-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmDbhqkgBXCFTnPZp5iG51X0KMsjAaMhqkw923osv1LF2axheDiKzxHr8F58B5LVEbqYxwCr7fdjy+C/cE8+3JJ2kJBdDR+bGjnWN7C/PMR+xd6koCMBz75EYpXhXhB8fqSp1wZrPMopYg6j5NDFd4kUaFyoUZ6I61gGCYcs/tYidd6llwlnKa/YX++1Lv69Te8LCSjeGe+TNqkAui4EU2h6Aa6CxlbZXeDzN9HnuqPUUfMohVceBQ1bpIpxkdeZ07KzYfrFMd6YlV6mK6tt1D41FlbSZX/XBL3zVVwjLGu9SxhM1JdM8Q33sl0UIXpdxNu6dqKLxGL4ZebPqWYbVwIDAQAB # 门店编号 mch-id: 1030238092 + # 门店编号2 + mch-id-2: 1030238093 # 签名方式 sign-type: MD5 # 原生JS @@ -167,9 +171,9 @@ # 请求url req-url: https://pay.hstypay.com/v2/pay/gateway # 支付通知地址 - notify-url: http://1.95.124.88:8088/oying/api/swiftPass/alipayCallback + notify-url: http://1.95.124.88:8088/api/swiftPass/alipayCallback # 退款通知地址 - refund-url: https://1.95.124.88:8088/oying/api/swiftPass/returnNotify + refund-url: https://1.95.124.88:8088/api/swiftPass/returnNotify obs: access_key_id: RZ1UIOZDZ58DD4NWPD6Q diff --git a/oying-system/src/main/resources/config/application-prod.yml b/oying-system/src/main/resources/config/application-prod.yml index 57f5446..2f4bb75 100644 --- a/oying-system/src/main/resources/config/application-prod.yml +++ b/oying-system/src/main/resources/config/application-prod.yml @@ -163,12 +163,16 @@ swift-pass: # 密钥 key: vJB6683s4NtQtXBgHTvE1hWOUtcre7nj + # 密钥2 + key-2: s7Jf1eEM5QlxihWSxZh673pDhGY7p0s0 # 私钥 mch-private-key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2YNuGqSAFcIVOc9mnmIbnVfQoyyMBoyGqTD3beiy/UsXZrGF4OIrPEevwXnwHktURupjHAKvt92PL4L9wTz7cknaQkF0NH5saOdY3sL88xH7F3qSgIwHPvkRileFeEHx+pKnXBms8yiliDqPk0MV3iRRoXKhRnojrWAYJhyz+1iJ13qWXCWcpr9hf77Uu/r1N7wsJKN4Z75M2qQC6LgRTaHoBroLGVtld4PM30ee6o9RR8yiFVx4FDVukinGR15nTsrNh+sUx3piVXqYrq23UPjUWVtJlf9cEvfNVXCMsa71LGEzUl0zxDfeyXRQhel3E27p2oovEYvhl5s+pZhtXAgMBAAECggEBAKXZLKinccwgh8lRBrQmuz7x5ieWms3pWDryPCozTy/pCKyq2rQlzu0BIiqi8W09tG773eTSEodDOkhzqANsvQB+XD2YWlYN0NEnmUtpem67TYGItvI9A2+0WaHBJIGSwnO0MBKu7qQIP1vBbn8s7vWF/b3tzM70ORSzJkJR37QY435+ZG9rKMKyL/tuGW7E5AgrHmyl2aK9me3vgUrZct2e9l5XLrn9oU1niEmbDbFARhphXDCEPIvFiu7WtFDBmp/jEOc4u/y/sYMjS1RWpO9iOyTZDO8Mi9iofXugmoot4Tn0lBckeR6YVRb/I3EcVADoMfk1iaN1aWv1u+Ska8ECgYEA3ZFYMvo5y7SztrEbyLpWGsp6aM4a5ght8p52/rFhSHD5CGS7Uywhp4LxxIjLTRBNa/UkBzOq1Xt1+PVDNHf0E1yYZqEv9OXWC0yiCsnwO6b7o9hc3VnnX4jw7FkS0+pjfgCK4/A9hFj9xUI+qX3L3+pOCseioUeYofqTc2bn7ncCgYEA0rhvvNO30EisLACdOIem8XgbL4LjKJ47FnYS/TEZ9cDhJW5G2pAxgyFsqhN/GuTVg8uSQ7a6PlcBxzTuOwdZg05RcCAdmsXUdGjVbKk2i4CBp0K1j4QYfr8Wt18x0RLfzIQDrZQajWssVGjo8sfMn8qmjbRNbMmokRTflGIkEiECgYEAxChaYn9fzbYEaRixlWtKsdtSthjKfZ8239ZlWSVnEEBcaY7svTzT6r6mFq5Y9rgZIxvbsriOZQQxtKBGyFvubXnLvwizMWiNsGE/ELgphFZYcH0r8hgXHGBbk5NkdNMNFE+cpyJZBCPZP9tfKKUjavC/+RE3LPv66GS0SDXx3g8CgYAYOIT3cmqFcWUA5c0si0MgLEsLqgLMT2vBSC8klTlDqzj14XgZdUuLpBLmdbk9cSIttP+J8v3zXnLg3++mL1EVq7HmrnpYqPajrs0hYU3YuRuuCxfteCSMpRBKYZHLU10QF/iIQibPLIt65FgqV9boYxXD4f6oS4Gps3mDh8hXoQKBgBKojPBWgp4/WBMfh8nUzFzTiW7ACyG2jAxGtu0dtqfwx2LkesUKGhD1JGlxdDQ6jSv9tbhAgbZjTAULSo03626ZaiSDF+nCwFsobd3wRiij8LiL9amW5t6XBeX6bS5SCh45GbgnNBtzBqUI19/CGH09YXNpCYnADsY4fab4wNpR # 公钥 plat-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmDbhqkgBXCFTnPZp5iG51X0KMsjAaMhqkw923osv1LF2axheDiKzxHr8F58B5LVEbqYxwCr7fdjy+C/cE8+3JJ2kJBdDR+bGjnWN7C/PMR+xd6koCMBz75EYpXhXhB8fqSp1wZrPMopYg6j5NDFd4kUaFyoUZ6I61gGCYcs/tYidd6llwlnKa/YX++1Lv69Te8LCSjeGe+TNqkAui4EU2h6Aa6CxlbZXeDzN9HnuqPUUfMohVceBQ1bpIpxkdeZ07KzYfrFMd6YlV6mK6tt1D41FlbSZX/XBL3zVVwjLGu9SxhM1JdM8Q33sl0UIXpdxNu6dqKLxGL4ZebPqWYbVwIDAQAB # 门店编号 mch-id: 1030238092 + # 门店编号2 + mch-id-2: 1030238093 # 签名方式 sign-type: MD5 # 原生JS @@ -178,9 +182,9 @@ # 请求url req-url: https://pay.hstypay.com/v2/pay/gateway # 支付通知地址 - notify-url: http://1.95.124.88:8088/oying/api/swiftPass/alipayCallback + notify-url: http://1.95.124.88:8088/api/swiftPass/alipayCallback # 退款通知地址 - refund-url: https://1.95.124.88:8088/oying/api/swiftPass/returnNotify + refund-url: https://1.95.124.88:8088/api/swiftPass/returnNotify obs: access_key_id: RZ1UIOZDZ58DD4NWPD6Q diff --git a/oying-system/src/main/resources/mapper/sh/OrderMapper.xml b/oying-system/src/main/resources/mapper/sh/OrderMapper.xml index 44a5e20..c647e5f 100644 --- a/oying-system/src/main/resources/mapper/sh/OrderMapper.xml +++ b/oying-system/src/main/resources/mapper/sh/OrderMapper.xml @@ -37,6 +37,15 @@ order_id, order_num, order_status, order_status_describe, user_id, username, store_id, store_name, store_logo, order_describe, original_price, paid_price, actually_pay_price, pay_state, pay_message, pay_type, pay_time, expire_time, openid, app_id, timestamp, nonce_str, package_val, sign_type, pay_sign, create_by, create_time, update_by, update_time </sql> + <update id="updatePayStatus"> + update sh_order set pay_state = #{payState}, pay_message = #{payMessage}, + pay_time = #{payTime} where order_num = #{orderNum} + </update> + + <update id="updateCloseStatus"> + update sh_order set pay_state = #{payState} where order_num = #{orderNum} + </update> + <select id="findAll" resultMap="BaseResultMap"> select <include refid="Base_Column_List"/> @@ -75,4 +84,10 @@ </where> order by order_id desc </select> + <select id="getByOrderNum" resultMap="BaseResultMap"> + select + <include refid="Base_Column_List"/> + from sh_order + where order_num = #{orderNum} + </select> </mapper> diff --git a/oying-system/src/main/resources/mapper/sh/OrderReturnMapper.xml b/oying-system/src/main/resources/mapper/sh/OrderReturnMapper.xml index 3a37432..4b091cd 100644 --- a/oying-system/src/main/resources/mapper/sh/OrderReturnMapper.xml +++ b/oying-system/src/main/resources/mapper/sh/OrderReturnMapper.xml @@ -7,6 +7,7 @@ <result column="return_status" property="returnStatus"/> <result column="return_status_describe" property="returnStatusDescribe"/> <result column="order_num" property="orderNum"/> + <result column="pay_type" property="payType"/> <result column="user_id" property="userId"/> <result column="username" property="username"/> <result column="store_id" property="storeId"/> @@ -33,8 +34,12 @@ </resultMap> <sql id="Base_Column_List"> - return_id, return_num, return_status, return_status_describe, order_num, user_id, username, store_id, store_name, store_logo, original_price, paid_price, actually_pay_price, refund_price, refund_status, success_time, channel, reason, remark, photos, audit_status, audit_user, audit_time, audit_message, create_by, create_time, update_by, update_time + return_id, return_num, return_status, return_status_describe, order_num, pay_type, user_id, username, store_id, store_name, store_logo, original_price, paid_price, actually_pay_price, refund_price, refund_status, success_time, channel, reason, remark, photos, audit_status, audit_user, audit_time, audit_message, create_by, create_time, update_by, update_time </sql> + <update id="updatePayStatus"> + update sh_order_return set return_status = #{payState}, success_time = #{payTime} + where order_num = #{orderNum} + </update> <select id="findAll" resultMap="BaseResultMap"> select @@ -49,6 +54,9 @@ </if> <if test="criteria.orderNum != null"> and order_num like concat('%',#{criteria.orderNum},'%') + </if> + <if test="criteria.payType != null"> + and pay_type = #{criteria.payType} </if> <if test="criteria.userId != null"> and user_id = #{criteria.userId} @@ -77,4 +85,9 @@ </where> order by return_id desc </select> + <select id="getByReturnNum" resultMap="BaseResultMap"> + select + <include refid="Base_Column_List"/> + from sh_order_return where return_num = #{returnNum} + </select> </mapper> diff --git a/pom.xml b/pom.xml index 6005c46..cf63f1b 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,13 @@ </exclusions> </dependency> + <!-- Google Gson 依赖 --> + <dependency> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + <version>2.10.1</version> <!-- 使用最新版本 --> + </dependency> + <!--Spring boot 测试--> <dependency> <groupId>org.springframework.boot</groupId> -- Gitblit v1.9.3