Commit 07f54ce2deeed0fdad3b032cf5413c72de9875fb

Authored by dengwei
1 parent 7ef99d77

feat rtmark hourly

Showing 21 changed files with 411 additions and 51 deletions
cashier-mall/src/main/java/com/diligrp/cashier/mall/MallConstants.java
... ... @@ -5,6 +5,7 @@ import com.diligrp.cashier.shared.Constants;
5 5  
6 6 /**
7 7 * 商城常量
  8 + * @author dengwei
8 9 */
9 10 public interface MallConstants {
10 11 String RESULT_SUCCESS = "success";
... ... @@ -14,4 +15,7 @@ public interface MallConstants {
14 15  
15 16 String MALL_TOKEN = Constants.PRODUCT_NAME + "mall_token:";
16 17 String MALL_USER_INFO = Constants.PRODUCT_NAME + "mall_user_info:";
  18 +
  19 + String HOURLY_PAYMENT_CALLBACK_METHOD = "hourly.payment.callback";
  20 + String HOURLY_REFUND_CALLBACK_METHOD = "hourly.refund.callback";
17 21 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/domain/rtmall/RtMarkBaseCO.java
... ... @@ -16,6 +16,7 @@ public class RtMarkBaseCO {
16 16 private String version;
17 17 private String timestamp;
18 18 private String nonceStr;
  19 + private String method;
19 20 private String sign;
20 21  
21 22 public String getAppKey() {
... ... @@ -50,6 +51,14 @@ public class RtMarkBaseCO {
50 51 this.nonceStr = nonceStr;
51 52 }
52 53  
  54 + public String getMethod() {
  55 + return method;
  56 + }
  57 +
  58 + public void setMethod(String method) {
  59 + this.method = method;
  60 + }
  61 +
53 62 public String getSign() {
54 63 return sign;
55 64 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/domain/rtmall/dto/HourlyPaymentCallbackDTO.java 0 → 100644
  1 +package com.diligrp.cashier.mall.domain.rtmall.dto;
  2 +
  3 +import com.diligrp.cashier.mall.MallConstants;
  4 +import com.diligrp.cashier.mall.domain.rtmall.RtMarkBaseCO;
  5 +import com.diligrp.cashier.mall.model.MallBizPaymentOrder;
  6 +import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
  7 +
  8 +/**
  9 + * @ClassName HourlyPaymentCallbackDTO.java
  10 + * @author dengwei
  11 + * @version 1.0.0
  12 + * @Description HourlyPaymentCallbackDTO
  13 + */
  14 +public class HourlyPaymentCallbackDTO extends RtMarkBaseCO {
  15 + /**
  16 + * 订单号
  17 + */
  18 + private String orderId;
  19 +
  20 + /**
  21 + * 支付单号
  22 + */
  23 + private String tradeId;
  24 +
  25 + /**
  26 + * 第三方支付流水号
  27 + */
  28 + private String transactionId;
  29 +
  30 + /**
  31 + * 支付金额(分)
  32 + */
  33 + private Long payFee;
  34 +
  35 + public static HourlyPaymentCallbackDTO of(final MallBizPaymentOrder mallBizPaymentOrder,
  36 + final RtMallDynamicProperty.AppSecretDynamicProperty property) {
  37 + HourlyPaymentCallbackDTO callbackDTO = new HourlyPaymentCallbackDTO();
  38 + callbackDTO.setOrderId(mallBizPaymentOrder.getOrderId());
  39 + callbackDTO.setTradeId(mallBizPaymentOrder.getTradeId());
  40 + callbackDTO.setTransactionId(mallBizPaymentOrder.getPayTradeId());
  41 + callbackDTO.setPayFee(mallBizPaymentOrder.getPayFee());
  42 + callbackDTO.setMethod(MallConstants.HOURLY_PAYMENT_CALLBACK_METHOD);
  43 + return callbackDTO;
  44 + }
  45 +
  46 + public String getOrderId() {
  47 + return orderId;
  48 + }
  49 +
  50 + public void setOrderId(String orderId) {
  51 + this.orderId = orderId;
  52 + }
  53 +
  54 + public String getTradeId() {
  55 + return tradeId;
  56 + }
  57 +
  58 + public void setTradeId(String tradeId) {
  59 + this.tradeId = tradeId;
  60 + }
  61 +
  62 + public String getTransactionId() {
  63 + return transactionId;
  64 + }
  65 +
  66 + public void setTransactionId(String transactionId) {
  67 + this.transactionId = transactionId;
  68 + }
  69 +
  70 + public Long getPayFee() {
  71 + return payFee;
  72 + }
  73 +
  74 + public void setPayFee(Long payFee) {
  75 + this.payFee = payFee;
  76 + }
  77 +}
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/domain/rtmall/dto/HourlyRefundCallbackDTO.java 0 → 100644
  1 +package com.diligrp.cashier.mall.domain.rtmall.dto;
  2 +
  3 +import com.diligrp.cashier.mall.MallConstants;
  4 +import com.diligrp.cashier.mall.domain.rtmall.RtMarkBaseCO;
  5 +import com.diligrp.cashier.mall.model.MallBizOrder;
  6 +import com.diligrp.cashier.mall.model.MallBizRefund;
  7 +import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
  8 +import com.diligrp.cashier.mall.type.RefundState;
  9 +import com.diligrp.cashier.shared.jackson.serialization.DateToSecondSerializer;
  10 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  11 +
  12 +import java.time.LocalDateTime;
  13 +import java.util.Objects;
  14 +
  15 +/**
  16 + * @ClassName HourlyRefundCallbackDTO.java
  17 + * @author dengwei
  18 + * @version 1.0.0
  19 + * @Description HourlyRefundCallbackDTO
  20 + */
  21 +public class HourlyRefundCallbackDTO extends RtMarkBaseCO {
  22 + /**
  23 + * 订单号
  24 + */
  25 + private String orderId;
  26 +
  27 + /**
  28 + * 支付单号
  29 + */
  30 + private String tradeId;
  31 +
  32 + /**
  33 + * 退款单号
  34 + */
  35 + private String refundBn;
  36 +
  37 + /**
  38 + * 第三方退款单号
  39 + */
  40 + private String refundId;
  41 +
  42 + /**
  43 + * 支付金额(分)
  44 + */
  45 + private Long payFee;
  46 +
  47 + /**
  48 + * 退款状态
  49 + * SUCCESS成功,ERROR为失败
  50 + */
  51 + private String refundStatus;
  52 +
  53 + /**
  54 + * 退款失败原因,退款失败时必传
  55 + */
  56 + private String refuseReason;
  57 +
  58 + /**
  59 + * 退款时间
  60 + */
  61 + @JsonSerialize(using = DateToSecondSerializer.class)
  62 + private LocalDateTime refundTime;
  63 +
  64 + /**
  65 + * of
  66 + */
  67 + public static HourlyRefundCallbackDTO of(final MallBizOrder mallBizOrder,
  68 + final MallBizRefund mallBizRefund,
  69 + final RtMallDynamicProperty.AppSecretDynamicProperty property) {
  70 + HourlyRefundCallbackDTO dto = new HourlyRefundCallbackDTO();
  71 + dto.setOrderId(mallBizOrder.getOrderId());
  72 + dto.setTradeId(mallBizOrder.getTradeId());
  73 + dto.setRefundBn(mallBizRefund.getRefundBn());
  74 + dto.setRefundId(mallBizRefund.getRefundTradeId());
  75 + dto.setPayFee(mallBizRefund.getRefundFee());
  76 + if (Objects.equals(mallBizRefund.getRefundState(), RefundState.SUCCESS.code)) {
  77 + dto.setRefundStatus("SUCCESS");
  78 + } else {
  79 + dto.setRefundStatus("ERROR");
  80 + }
  81 + dto.setRefuseReason(mallBizRefund.getRefuseReason());
  82 + dto.setRefundTime(mallBizRefund.getRefundTime());
  83 + dto.setMethod(MallConstants.HOURLY_REFUND_CALLBACK_METHOD);
  84 + return dto;
  85 + }
  86 +
  87 + public String getOrderId() {
  88 + return orderId;
  89 + }
  90 +
  91 + public void setOrderId(String orderId) {
  92 + this.orderId = orderId;
  93 + }
  94 +
  95 + public String getTradeId() {
  96 + return tradeId;
  97 + }
  98 +
  99 + public void setTradeId(String tradeId) {
  100 + this.tradeId = tradeId;
  101 + }
  102 +
  103 + public String getRefundBn() {
  104 + return refundBn;
  105 + }
  106 +
  107 + public void setRefundBn(String refundBn) {
  108 + this.refundBn = refundBn;
  109 + }
  110 +
  111 + public String getRefundId() {
  112 + return refundId;
  113 + }
  114 +
  115 + public void setRefundId(String refundId) {
  116 + this.refundId = refundId;
  117 + }
  118 +
  119 + public Long getPayFee() {
  120 + return payFee;
  121 + }
  122 +
  123 + public void setPayFee(Long payFee) {
  124 + this.payFee = payFee;
  125 + }
  126 +
  127 + public String getRefundStatus() {
  128 + return refundStatus;
  129 + }
  130 +
  131 + public void setRefundStatus(String refundStatus) {
  132 + this.refundStatus = refundStatus;
  133 + }
  134 +
  135 + public String getRefuseReason() {
  136 + return refuseReason;
  137 + }
  138 +
  139 + public void setRefuseReason(String refuseReason) {
  140 + this.refuseReason = refuseReason;
  141 + }
  142 +
  143 + public LocalDateTime getRefundTime() {
  144 + return refundTime;
  145 + }
  146 +
  147 + public void setRefundTime(LocalDateTime refundTime) {
  148 + this.refundTime = refundTime;
  149 + }
  150 +}
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/domain/rtmall/dto/package-info.java deleted 100644 → 0
1   -/**
2   - * @ClassName package-info.java
3   - * @author dengwei
4   - * @version 1.0.0
5   - * @Description TODO
6   - * @date 2025-12-30 14:04
7   - */
8   -package com.diligrp.cashier.mall.domain.rtmall.dto;
cashier-mall/src/main/java/com/diligrp/cashier/mall/exception/MallExceptionHandler.java
1 1 package com.diligrp.cashier.mall.exception;
2 2  
3 3 import com.diligrp.cashier.mall.domain.rtmall.RtMarkMessage;
  4 +import com.diligrp.cashier.mall.type.RtMarkErrorCode;
4 5 import org.slf4j.Logger;
5 6 import org.slf4j.LoggerFactory;
6 7 import org.springframework.core.annotation.Order;
... ... @@ -24,4 +25,10 @@ public class MallExceptionHandler {
24 25 LOG.warn("rt mart mall exception", ex);
25 26 return RtMarkMessage.failure(ex.getCode(), ex.getMessage());
26 27 }
  28 +
  29 + @ExceptionHandler(Exception.class)
  30 + public RtMarkMessage<?> exception(Exception ex) {
  31 + LOG.warn("exception", ex);
  32 + return RtMarkMessage.failure(RtMarkErrorCode.E5000.getCode());
  33 + }
27 34 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/model/MallBizOrder.java
... ... @@ -106,7 +106,7 @@ public class MallBizOrder extends BaseDO {
106 106 private Long discountFee;
107 107  
108 108 /**
109   - * 订单状态(0-notpay-未支付-1-payed-已支付 2-notpaycancel-未支付取消 3-payedcancel-已支付取消 4-done-订单完成 5-buyer_confirm-待用户收货)
  109 + * 订单状态(0-notpay-未支付 1-payed-已支付 2-notpaycancel-已取消 3-payedcancel-已退款 4-done-订单完成 5-buyer_confirm-待用户收货)
110 110 * @see OrderState
111 111 */
112 112 private Integer state;
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/model/MallBizPayment.java
... ... @@ -41,7 +41,7 @@ public class MallBizPayment extends BaseDO {
41 41 /**
42 42 * dili交易流水号
43 43 */
44   - private String payPaymentId;
  44 + private String payTradeId;
45 45  
46 46 /**
47 47 * 商户code
... ... @@ -97,6 +97,7 @@ public class MallBizPayment extends BaseDO {
97 97 /**
98 98 * 支付渠道(微信 园区卡)
99 99 * @see com.diligrp.cashier.mall.type.PaymentChanel
  100 + * @see com.diligrp.cashier.pipeline.type.ChannelType
100 101 */
101 102 private Integer channelId;
102 103  
... ... @@ -110,6 +111,11 @@ public class MallBizPayment extends BaseDO {
110 111 */
111 112 private String paymentCallback;
112 113  
  114 + /**
  115 + * 扩展信息
  116 + */
  117 + private String ext;
  118 +
113 119 public MallBizPayment() {
114 120 }
115 121  
... ... @@ -183,12 +189,12 @@ public class MallBizPayment extends BaseDO {
183 189 this.tradeId = tradeId;
184 190 }
185 191  
186   - public String getPayPaymentId() {
187   - return payPaymentId;
  192 + public String getPayTradeId() {
  193 + return payTradeId;
188 194 }
189 195  
190   - public void setPayPaymentId(String payPaymentId) {
191   - this.payPaymentId = payPaymentId;
  196 + public void setPayTradeId(String payTradeId) {
  197 + this.payTradeId = payTradeId;
192 198 }
193 199  
194 200 public String getMchId() {
... ... @@ -295,6 +301,14 @@ public class MallBizPayment extends BaseDO {
295 301 this.paymentCallback = paymentCallback;
296 302 }
297 303  
  304 + public String getExt() {
  305 + return ext;
  306 + }
  307 +
  308 + public void setExt(String ext) {
  309 + this.ext = ext;
  310 + }
  311 +
298 312 /**
299 313 * ofOrderPaymentVO
300 314 *
... ... @@ -305,7 +319,7 @@ public class MallBizPayment extends BaseDO {
305 319 orderPaymentVO.setPayStatus(payState);
306 320 orderPaymentVO.setPayFee(payFee);
307 321 orderPaymentVO.setPayTime(payTime);
308   - orderPaymentVO.setTransactionId(payPaymentId);
  322 + orderPaymentVO.setTransactionId(payTradeId);
309 323 return orderPaymentVO;
310 324 }
311 325 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/model/MallBizPaymentOrder.java
... ... @@ -36,9 +36,9 @@ public class MallBizPaymentOrder extends BaseDO {
36 36 private String tradeId;
37 37  
38 38 /**
39   - * dili交易流水号(mall_biz_payment.pay_payment_id)
  39 + * dili交易流水号(mall_biz_payment.pay_trade_id)
40 40 */
41   - private String payPaymentId;
  41 + private String payTradeId;
42 42  
43 43 /**
44 44 * 支付金额分
... ... @@ -104,12 +104,12 @@ public class MallBizPaymentOrder extends BaseDO {
104 104 this.tradeId = tradeId;
105 105 }
106 106  
107   - public String getPayPaymentId() {
108   - return payPaymentId;
  107 + public String getPayTradeId() {
  108 + return payTradeId;
109 109 }
110 110  
111   - public void setPayPaymentId(String payPaymentId) {
112   - this.payPaymentId = payPaymentId;
  111 + public void setPayTradeId(String payTradeId) {
  112 + this.payTradeId = payTradeId;
113 113 }
114 114  
115 115 public Long getPayFee() {
... ... @@ -146,7 +146,7 @@ public class MallBizPaymentOrder extends BaseDO {
146 146 orderPaymentVO.setPayStatus(payState);
147 147 orderPaymentVO.setPayFee(payFee);
148 148 orderPaymentVO.setPayTime(payTime);
149   - orderPaymentVO.setTransactionId(payPaymentId);
  149 + orderPaymentVO.setTransactionId(payTradeId);
150 150 return orderPaymentVO;
151 151 }
152 152 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/model/MallBizRefund.java
... ... @@ -48,12 +48,12 @@ public class MallBizRefund extends BaseDO {
48 48 /**
49 49 * dili退款流水号
50 50 */
51   - private String refundPaymentId;
  51 + private String refundTradeId;
52 52  
53 53 /**
54 54 * dili交易流水号
55 55 */
56   - private String payPaymentId;
  56 + private String payTradeId;
57 57  
58 58 /**
59 59 * dili客户卡号
... ... @@ -161,20 +161,20 @@ public class MallBizRefund extends BaseDO {
161 161 this.tradeId = tradeId;
162 162 }
163 163  
164   - public String getRefundPaymentId() {
165   - return refundPaymentId;
  164 + public String getRefundTradeId() {
  165 + return refundTradeId;
166 166 }
167 167  
168   - public void setRefundPaymentId(String refundPaymentId) {
169   - this.refundPaymentId = refundPaymentId;
  168 + public void setRefundTradeId(String refundTradeId) {
  169 + this.refundTradeId = refundTradeId;
170 170 }
171 171  
172   - public String getPayPaymentId() {
173   - return payPaymentId;
  172 + public String getPayTradeId() {
  173 + return payTradeId;
174 174 }
175 175  
176   - public void setPayPaymentId(String payPaymentId) {
177   - this.payPaymentId = payPaymentId;
  176 + public void setPayTradeId(String payTradeId) {
  177 + this.payTradeId = payTradeId;
178 178 }
179 179  
180 180 public String getRefundCardNo() {
... ... @@ -293,10 +293,11 @@ public class MallBizRefund extends BaseDO {
293 293 BeanUtils.copyProperties(refundCo, mallBizRefund);
294 294  
295 295 mallBizRefund.setOrderId(mallBizOrder.getOrderId());
  296 + mallBizRefund.setRefundTradeNo(snowflakeKeyManager.nextId(SnowflakeKey.MALL_BIZ_REFUND_ID).toString());
296 297 mallBizRefund.setTradeId(mallBizPaymentOrder.getTradeId());
297 298 mallBizRefund.setPayTradeNo(mallBizPaymentOrder.getPayTradeNo());
298   - mallBizRefund.setRefundTradeNo(snowflakeKeyManager.nextId(SnowflakeKey.MALL_BIZ_REFUND_ID).toString());
299   - mallBizRefund.setPayPaymentId(mallBizPaymentOrder.getPayPaymentId());
  299 + mallBizRefund.setPayTradeId(mallBizPaymentOrder.getPayTradeId());
  300 + mallBizRefund.setCreaterName(refundCo.getUserCode());
300 301  
301 302 // 回调地址
302 303 RtMallDynamicProperty rtMallDynamicProperty = SpringContextUtils.getBean(RtMallDynamicProperty.class);
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/property/RtMallDynamicProperty.java
... ... @@ -33,6 +33,9 @@ public class RtMallDynamicProperty {
33 33 @Value("${orderType:3}")
34 34 private Integer orderType;
35 35  
  36 + @Value("${version:v1}")
  37 + private String version;
  38 +
36 39 @Value("${appKey:}")
37 40 private String appKey;
38 41  
... ... @@ -45,6 +48,9 @@ public class RtMallDynamicProperty {
45 48 @Value("${authUrl:https://hourh5-em-shop.feiniugo.com}")
46 49 private String authUrl;
47 50  
  51 + @Value("${cashierResultUrl:}")
  52 + private String cashierResultUrl;
  53 +
48 54 @Value("${callbackDomain:}")
49 55 private String callbackDomain;
50 56  
... ... @@ -80,6 +86,14 @@ public class RtMallDynamicProperty {
80 86 this.authUrl = authUrl;
81 87 }
82 88  
  89 + public String getCashierResultUrl() {
  90 + return cashierResultUrl;
  91 + }
  92 +
  93 + public void setCashierResultUrl(String cashierResultUrl) {
  94 + this.cashierResultUrl = cashierResultUrl;
  95 + }
  96 +
83 97 public Integer getOrderType() {
84 98 return orderType;
85 99 }
... ... @@ -88,6 +102,14 @@ public class RtMallDynamicProperty {
88 102 this.orderType = orderType;
89 103 }
90 104  
  105 + public String getVersion() {
  106 + return version;
  107 + }
  108 +
  109 + public void setVersion(String version) {
  110 + this.version = version;
  111 + }
  112 +
91 113 public String getCompanyCode() {
92 114 return companyCode;
93 115 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/biz/impl/MallBizOrderServiceImpl.java
... ... @@ -72,7 +72,7 @@ public class MallBizOrderServiceImpl implements MallBizOrderService {
72 72 MallBizPayment mallBizPayment = MallBizPayment.of(mallBizOrders);
73 73  
74 74 // TODO 2025/12/30: 预支付信息 收银台地址信息
75   - mallBizPayment.setPayPaymentId(IdUtil.simpleUUID());
  75 + mallBizPayment.setPayTradeId(IdUtil.simpleUUID());
76 76 mallBizPayment.setCashierUrl("https://cashier.test.gszdtop.com?payTradeNo=" + mallBizPayment.getPayTradeNo());
77 77  
78 78 // save
... ... @@ -164,7 +164,7 @@ public class MallBizOrderServiceImpl implements MallBizOrderService {
164 164 Optional.of(bizPaymentOrders)
165 165 .ifPresent(paymentOrders -> {
166 166 paymentOrders.forEach(vo -> {
167   - vo.setPayPaymentId(mallBizPayment.getPayPaymentId());
  167 + vo.setPayTradeId(mallBizPayment.getPayTradeId());
168 168 });
169 169 mallBizPaymentOrderDao.batchInsert(paymentOrders);
170 170 });
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/biz/impl/MallBizRefundServiceImpl.java
... ... @@ -48,6 +48,9 @@ public class MallBizRefundServiceImpl implements MallBizRefundService {
48 48 @Transactional(rollbackFor = {Exception.class})
49 49 public RefundSuccessVO refund(RefundCO refundCo) {
50 50 MallBizOrder mallBizOrder = mallBizOrderDao.getByOrderId(refundCo.getOrderId());
  51 + if (Objects.isNull(mallBizOrder)) {
  52 + throw new RtMartMallException(RtMarkErrorCode.E5004);
  53 + }
51 54 MallBizRefund mallBizRefund = MallInitializeContext.getBySource(mallBizOrder.getSource()).refund(refundCo);
52 55 return new RefundSuccessVO(mallBizRefund.getPayTradeNo(), mallBizRefund.getRefundTradeNo());
53 56 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/paychannel/CardPayChannel.java
1 1 package com.diligrp.cashier.mall.service.paychannel;
2 2  
3   -import com.diligrp.cashier.mall.type.PaymentChanel;
  3 +import com.diligrp.cashier.pipeline.type.ChannelType;
4 4 import org.springframework.stereotype.Component;
5 5  
6 6 /**
... ... @@ -14,6 +14,6 @@ import org.springframework.stereotype.Component;
14 14 public class CardPayChannel extends AbstractPayChannel {
15 15 @Override
16 16 public Integer getPayChannel() {
17   - return PaymentChanel.PARK_CARD.getCode();
  17 + return ChannelType.DILIPAY.getCode();
18 18 }
19 19 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/paychannel/WeChatPayChannel.java
1 1 package com.diligrp.cashier.mall.service.paychannel;
2 2  
3   -import com.diligrp.cashier.mall.type.PaymentChanel;
  3 +import com.diligrp.cashier.pipeline.type.ChannelType;
4 4 import org.springframework.stereotype.Component;
5 5  
6 6 /**
... ... @@ -14,6 +14,6 @@ import org.springframework.stereotype.Component;
14 14 public class WeChatPayChannel extends AbstractPayChannel {
15 15 @Override
16 16 public Integer getPayChannel() {
17   - return PaymentChanel.WECHAT.getCode();
  17 + return ChannelType.WXPAY.getCode();
18 18 }
19 19 }
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/sourcechannel/AbstractSourceChannel.java
... ... @@ -10,11 +10,13 @@ import com.diligrp.cashier.mall.domain.rtmall.co.RefundCO;
10 10 import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO;
11 11 import com.diligrp.cashier.mall.exception.RtMartMallException;
12 12 import com.diligrp.cashier.mall.model.MallBizOrder;
  13 +import com.diligrp.cashier.mall.model.MallBizPayment;
13 14 import com.diligrp.cashier.mall.model.MallBizPaymentOrder;
14 15 import com.diligrp.cashier.mall.model.MallBizRefund;
15 16 import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
16 17 import com.diligrp.cashier.mall.service.biz.MallBizPaymentService;
17 18 import com.diligrp.cashier.mall.type.PayState;
  19 +import com.diligrp.cashier.mall.type.RefundState;
18 20 import com.diligrp.cashier.mall.type.RtMarkErrorCode;
19 21 import com.diligrp.cashier.shared.util.DateUtils;
20 22 import com.diligrp.cashier.shared.util.JsonUtils;
... ... @@ -96,13 +98,19 @@ public abstract class AbstractSourceChannel {
96 98 MallBizOrder mallBizOrder = mallBizOrderDao.getByOrderId(refundCo.getOrderId());
97 99 MallBizPaymentOrder mallBizPaymentOrder = getPayment(refundCo);
98 100  
99   - // 支付成功才能退款
100   - if (ObjectUtils.notEqual(mallBizPaymentOrder.getPayState(), PayState.SUCCESS.code)) {
101   - throw new RtMartMallException(RtMarkErrorCode.E5005);
102   - }
103   -
104   - // TODO 2025/12/30: 调用支付完善信息
105 101 MallBizRefund refund = MallBizRefund.of(refundCo, mallBizOrder, mallBizPaymentOrder);
  102 + // 售前取消 需不需要通知支付进行取消预支付信息
  103 + if (ObjectUtils.notEqual(mallBizPaymentOrder.getPayState(), PayState.PENDING.code)) {
  104 + refund.setRefundState(RefundState.SUCCESS.code);
  105 + } else {
  106 + // 支付成功才能退款
  107 + if (ObjectUtils.notEqual(mallBizPaymentOrder.getPayState(), PayState.SUCCESS.code)) {
  108 + throw new RtMartMallException(RtMarkErrorCode.E5005);
  109 + }
  110 +
  111 + // TODO 2025/12/30: 调用支付完善信息
  112 + refund.setRefundTradeId("99999999999");
  113 + }
106 114  
107 115 save(refund);
108 116 return refund;
... ... @@ -124,6 +132,16 @@ public abstract class AbstractSourceChannel {
124 132 public abstract void userInfoChannel(UserInfoVO authLogin, RtMallDynamicProperty.AppSecretDynamicProperty userInfoVO);
125 133  
126 134 /**
  135 + * payCallBack
  136 + */
  137 + public abstract void payCallBack(MallBizOrder mallBizOrder, MallBizPayment mallBizPayment, MallBizPaymentOrder mallBizPaymentOrder);
  138 +
  139 + /**
  140 + * refundCallBack
  141 + */
  142 + public abstract void refundCallBack(MallBizOrder mallBizOrder, MallBizRefund mallBizRefund);
  143 +
  144 + /**
127 145 * getPayment
128 146 */
129 147 private MallBizPaymentOrder getPayment(RefundCO refundCo) {
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/sourcechannel/RtMallChannel.java
1 1 package com.diligrp.cashier.mall.service.sourcechannel;
2 2  
  3 +import com.diligrp.cashier.mall.domain.rtmall.RtMarkBaseCO;
  4 +import com.diligrp.cashier.mall.domain.rtmall.RtMarkMessage;
3 5 import com.diligrp.cashier.mall.domain.rtmall.co.AuthLoginCO;
  6 +import com.diligrp.cashier.mall.domain.rtmall.dto.HourlyPaymentCallbackDTO;
  7 +import com.diligrp.cashier.mall.domain.rtmall.dto.HourlyRefundCallbackDTO;
4 8 import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO;
  9 +import com.diligrp.cashier.mall.model.MallBizOrder;
  10 +import com.diligrp.cashier.mall.model.MallBizPayment;
  11 +import com.diligrp.cashier.mall.model.MallBizPaymentOrder;
  12 +import com.diligrp.cashier.mall.model.MallBizRefund;
5 13 import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
6 14 import com.diligrp.cashier.mall.type.OrderSource;
  15 +import com.diligrp.cashier.mall.util.HttpClientUtils;
7 16 import com.diligrp.cashier.mall.util.RtMallSignMd5Utils;
  17 +import com.diligrp.cashier.shared.util.DateUtils;
8 18 import com.diligrp.cashier.shared.util.JsonUtils;
9 19 import com.diligrp.cashier.shared.util.UrlParamParserUtils;
  20 +import com.fasterxml.jackson.core.type.TypeReference;
10 21 import org.slf4j.Logger;
11 22 import org.slf4j.LoggerFactory;
12 23 import org.springframework.stereotype.Component;
... ... @@ -55,6 +66,58 @@ public class RtMallChannel extends AbstractSourceChannel {
55 66 authLogin.setCompanyCode(property.getCompanyCode());
56 67 }
57 68  
  69 + /**
  70 + * payCallBack
  71 + * @see https://shopex.yuque.com/hl0rrx/vlp0m4/nkwt5yrhdfzoy78s?singleDoc#RtKpF
  72 + * 支付回调接口
  73 + *
  74 + */
  75 + @Override
  76 + public void payCallBack(final MallBizOrder mallBizOrder,
  77 + final MallBizPayment mallBizPayment,
  78 + final MallBizPaymentOrder mallBizPaymentOrder) {
  79 + RtMallDynamicProperty.AppSecretDynamicProperty property = getProperty(mallBizOrder);
  80 + HourlyPaymentCallbackDTO hourlyPaymentCallback = HourlyPaymentCallbackDTO.of(mallBizPaymentOrder, property);
  81 + hourlyPaymentCallback.setSign(sign(hourlyPaymentCallback, property));
  82 + RtMarkMessage<?> message = HttpClientUtils.postJson(mallBizPayment.getPaymentCallback(), hourlyPaymentCallback, null, new TypeReference<>() {
  83 + }, "rt-mall");
  84 + log.info("payCallBack message: {}", JsonUtils.toJsonString(message));
  85 + }
  86 +
  87 + /**
  88 + * refundCallBack
  89 + * @see https://shopex.yuque.com/hl0rrx/vlp0m4/nkwt5yrhdfzoy78s?singleDoc#RtKpF
  90 + * 退款回调接口
  91 + */
  92 + @Override
  93 + public void refundCallBack(MallBizOrder mallBizOrder, MallBizRefund mallBizRefund) {
  94 + RtMallDynamicProperty.AppSecretDynamicProperty property = getProperty(mallBizOrder);
  95 + HourlyRefundCallbackDTO hourlyRefundCallback = HourlyRefundCallbackDTO.of(mallBizOrder, mallBizRefund, property);
  96 + hourlyRefundCallback.setSign(sign(hourlyRefundCallback, property));
  97 + RtMarkMessage<?> message = HttpClientUtils.postJson(mallBizRefund.getRefundCallback(), hourlyRefundCallback, null, new TypeReference<>() {
  98 + }, "rt-mall");
  99 + log.info("refundCallBack message: {}", JsonUtils.toJsonString(message));
  100 + }
  101 +
  102 + /**
  103 + * getProperty
  104 + */
  105 + private RtMallDynamicProperty.AppSecretDynamicProperty getProperty(MallBizOrder mallBizOrder) {
  106 + RtMallDynamicProperty.AppSecretDynamicProperty property = rtMallDynamicProperty.getBySourceAndType(mallBizOrder.getSource(), mallBizOrder.getOrderType());
  107 + log.info("source {} orderType {} property: {}", mallBizOrder.getSource(), mallBizOrder.getOrderType(), JsonUtils.toJsonString(property));
  108 + return property;
  109 + }
  110 +
  111 + /**
  112 + * 计算签名
  113 + */
  114 + private String sign(RtMarkBaseCO base, RtMallDynamicProperty.AppSecretDynamicProperty property) {
  115 + base.setAppKey(property.getAppKey());
  116 + base.setVersion(property.getVersion());
  117 + base.setTimestamp(DateUtils.timestampInSeconds() + "");
  118 + return RtMallSignMd5Utils.generateSign(base, property.getAppSecret());
  119 + }
  120 +
58 121 @Override
59 122 public Integer source() {
60 123 return OrderSource.RT_MART.getCode();
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/sign/RtMallSign.java
... ... @@ -41,7 +41,7 @@ public class RtMallSign implements SecuritySign {
41 41  
42 42 Object appKey = paramMap.get("app_key");
43 43 if (Objects.isNull(appKey)) {
44   - throw new RtMartMallException(RtMarkErrorCode.E4003);
  44 + throw new RtMartMallException(RtMarkErrorCode.E4001);
45 45 }
46 46  
47 47 Object sign = paramMap.get("sign");
... ...
cashier-mall/src/main/java/com/diligrp/cashier/mall/type/OrderState.java
... ... @@ -16,8 +16,8 @@ import java.util.stream.Collectors;
16 16 public enum OrderState {
17 17 NOT_PAY(0, "notpay", "未支付"),
18 18 PAYED(1, "payed", "已支付"),
19   - NOT_PAY_CANCEL(2, "notpaycancel", "未支付取消"),
20   - PAYED_CANCEL(3, "payedcancel", "已支付取消"),
  19 + NOT_PAY_CANCEL(2, "notpaycancel", "已取消"),
  20 + PAYED_CANCEL(3, "payedcancel", "已退款"),
21 21 DONE(4, "done", "订单完成"),
22 22 CONFIRM_RECEIPT(4, "confirmreceipt", "订单完成"),
23 23 BUYER_CONFIRM(5, "buyer_confirm", "待用户收货"),
... ...
cashier-shared/src/main/java/com/diligrp/cashier/shared/jackson/deserializer/SecondToDateDeserializer.java
... ... @@ -23,7 +23,7 @@ public class SecondToDateDeserializer extends JsonDeserializer&lt;LocalDateTime&gt; {
23 23 long timestamp = parser.getValueAsLong();
24 24 return LocalDateTime.ofInstant(
25 25 Instant.ofEpochSecond(timestamp),
26   - ZoneOffset.UTC
  26 + ZoneOffset.systemDefault()
27 27 );
28 28 }
29 29 }
... ...
cashier-shared/src/main/java/com/diligrp/cashier/shared/jackson/serialization/DateToSecondSerializer.java
... ... @@ -18,6 +18,6 @@ import java.time.ZoneOffset;
18 18 public class DateToSecondSerializer extends JsonSerializer<LocalDateTime> {
19 19 @Override
20 20 public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
21   - gen.writeNumber(value.toInstant(ZoneOffset.UTC).getEpochSecond());
  21 + gen.writeNumber(value.atZone(ZoneOffset.systemDefault()).toEpochSecond());
22 22 }
23 23 }
... ...