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,6 +5,7 @@ import com.diligrp.cashier.shared.Constants;
5 5
6 /** 6 /**
7 * 商城常量 7 * 商城常量
  8 + * @author dengwei
8 */ 9 */
9 public interface MallConstants { 10 public interface MallConstants {
10 String RESULT_SUCCESS = "success"; 11 String RESULT_SUCCESS = "success";
@@ -14,4 +15,7 @@ public interface MallConstants { @@ -14,4 +15,7 @@ public interface MallConstants {
14 15
15 String MALL_TOKEN = Constants.PRODUCT_NAME + "mall_token:"; 16 String MALL_TOKEN = Constants.PRODUCT_NAME + "mall_token:";
16 String MALL_USER_INFO = Constants.PRODUCT_NAME + "mall_user_info:"; 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,6 +16,7 @@ public class RtMarkBaseCO {
16 private String version; 16 private String version;
17 private String timestamp; 17 private String timestamp;
18 private String nonceStr; 18 private String nonceStr;
  19 + private String method;
19 private String sign; 20 private String sign;
20 21
21 public String getAppKey() { 22 public String getAppKey() {
@@ -50,6 +51,14 @@ public class RtMarkBaseCO { @@ -50,6 +51,14 @@ public class RtMarkBaseCO {
50 this.nonceStr = nonceStr; 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 public String getSign() { 62 public String getSign() {
54 return sign; 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 package com.diligrp.cashier.mall.exception; 1 package com.diligrp.cashier.mall.exception;
2 2
3 import com.diligrp.cashier.mall.domain.rtmall.RtMarkMessage; 3 import com.diligrp.cashier.mall.domain.rtmall.RtMarkMessage;
  4 +import com.diligrp.cashier.mall.type.RtMarkErrorCode;
4 import org.slf4j.Logger; 5 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory; 6 import org.slf4j.LoggerFactory;
6 import org.springframework.core.annotation.Order; 7 import org.springframework.core.annotation.Order;
@@ -24,4 +25,10 @@ public class MallExceptionHandler { @@ -24,4 +25,10 @@ public class MallExceptionHandler {
24 LOG.warn("rt mart mall exception", ex); 25 LOG.warn("rt mart mall exception", ex);
25 return RtMarkMessage.failure(ex.getCode(), ex.getMessage()); 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,7 +106,7 @@ public class MallBizOrder extends BaseDO {
106 private Long discountFee; 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 * @see OrderState 110 * @see OrderState
111 */ 111 */
112 private Integer state; 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,7 +41,7 @@ public class MallBizPayment extends BaseDO {
41 /** 41 /**
42 * dili交易流水号 42 * dili交易流水号
43 */ 43 */
44 - private String payPaymentId; 44 + private String payTradeId;
45 45
46 /** 46 /**
47 * 商户code 47 * 商户code
@@ -97,6 +97,7 @@ public class MallBizPayment extends BaseDO { @@ -97,6 +97,7 @@ public class MallBizPayment extends BaseDO {
97 /** 97 /**
98 * 支付渠道(微信 园区卡) 98 * 支付渠道(微信 园区卡)
99 * @see com.diligrp.cashier.mall.type.PaymentChanel 99 * @see com.diligrp.cashier.mall.type.PaymentChanel
  100 + * @see com.diligrp.cashier.pipeline.type.ChannelType
100 */ 101 */
101 private Integer channelId; 102 private Integer channelId;
102 103
@@ -110,6 +111,11 @@ public class MallBizPayment extends BaseDO { @@ -110,6 +111,11 @@ public class MallBizPayment extends BaseDO {
110 */ 111 */
111 private String paymentCallback; 112 private String paymentCallback;
112 113
  114 + /**
  115 + * 扩展信息
  116 + */
  117 + private String ext;
  118 +
113 public MallBizPayment() { 119 public MallBizPayment() {
114 } 120 }
115 121
@@ -183,12 +189,12 @@ public class MallBizPayment extends BaseDO { @@ -183,12 +189,12 @@ public class MallBizPayment extends BaseDO {
183 this.tradeId = tradeId; 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 public String getMchId() { 200 public String getMchId() {
@@ -295,6 +301,14 @@ public class MallBizPayment extends BaseDO { @@ -295,6 +301,14 @@ public class MallBizPayment extends BaseDO {
295 this.paymentCallback = paymentCallback; 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 * ofOrderPaymentVO 313 * ofOrderPaymentVO
300 * 314 *
@@ -305,7 +319,7 @@ public class MallBizPayment extends BaseDO { @@ -305,7 +319,7 @@ public class MallBizPayment extends BaseDO {
305 orderPaymentVO.setPayStatus(payState); 319 orderPaymentVO.setPayStatus(payState);
306 orderPaymentVO.setPayFee(payFee); 320 orderPaymentVO.setPayFee(payFee);
307 orderPaymentVO.setPayTime(payTime); 321 orderPaymentVO.setPayTime(payTime);
308 - orderPaymentVO.setTransactionId(payPaymentId); 322 + orderPaymentVO.setTransactionId(payTradeId);
309 return orderPaymentVO; 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,9 +36,9 @@ public class MallBizPaymentOrder extends BaseDO {
36 private String tradeId; 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,12 +104,12 @@ public class MallBizPaymentOrder extends BaseDO {
104 this.tradeId = tradeId; 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 public Long getPayFee() { 115 public Long getPayFee() {
@@ -146,7 +146,7 @@ public class MallBizPaymentOrder extends BaseDO { @@ -146,7 +146,7 @@ public class MallBizPaymentOrder extends BaseDO {
146 orderPaymentVO.setPayStatus(payState); 146 orderPaymentVO.setPayStatus(payState);
147 orderPaymentVO.setPayFee(payFee); 147 orderPaymentVO.setPayFee(payFee);
148 orderPaymentVO.setPayTime(payTime); 148 orderPaymentVO.setPayTime(payTime);
149 - orderPaymentVO.setTransactionId(payPaymentId); 149 + orderPaymentVO.setTransactionId(payTradeId);
150 return orderPaymentVO; 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,12 +48,12 @@ public class MallBizRefund extends BaseDO {
48 /** 48 /**
49 * dili退款流水号 49 * dili退款流水号
50 */ 50 */
51 - private String refundPaymentId; 51 + private String refundTradeId;
52 52
53 /** 53 /**
54 * dili交易流水号 54 * dili交易流水号
55 */ 55 */
56 - private String payPaymentId; 56 + private String payTradeId;
57 57
58 /** 58 /**
59 * dili客户卡号 59 * dili客户卡号
@@ -161,20 +161,20 @@ public class MallBizRefund extends BaseDO { @@ -161,20 +161,20 @@ public class MallBizRefund extends BaseDO {
161 this.tradeId = tradeId; 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 public String getRefundCardNo() { 180 public String getRefundCardNo() {
@@ -293,10 +293,11 @@ public class MallBizRefund extends BaseDO { @@ -293,10 +293,11 @@ public class MallBizRefund extends BaseDO {
293 BeanUtils.copyProperties(refundCo, mallBizRefund); 293 BeanUtils.copyProperties(refundCo, mallBizRefund);
294 294
295 mallBizRefund.setOrderId(mallBizOrder.getOrderId()); 295 mallBizRefund.setOrderId(mallBizOrder.getOrderId());
  296 + mallBizRefund.setRefundTradeNo(snowflakeKeyManager.nextId(SnowflakeKey.MALL_BIZ_REFUND_ID).toString());
296 mallBizRefund.setTradeId(mallBizPaymentOrder.getTradeId()); 297 mallBizRefund.setTradeId(mallBizPaymentOrder.getTradeId());
297 mallBizRefund.setPayTradeNo(mallBizPaymentOrder.getPayTradeNo()); 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 RtMallDynamicProperty rtMallDynamicProperty = SpringContextUtils.getBean(RtMallDynamicProperty.class); 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,6 +33,9 @@ public class RtMallDynamicProperty {
33 @Value("${orderType:3}") 33 @Value("${orderType:3}")
34 private Integer orderType; 34 private Integer orderType;
35 35
  36 + @Value("${version:v1}")
  37 + private String version;
  38 +
36 @Value("${appKey:}") 39 @Value("${appKey:}")
37 private String appKey; 40 private String appKey;
38 41
@@ -45,6 +48,9 @@ public class RtMallDynamicProperty { @@ -45,6 +48,9 @@ public class RtMallDynamicProperty {
45 @Value("${authUrl:https://hourh5-em-shop.feiniugo.com}") 48 @Value("${authUrl:https://hourh5-em-shop.feiniugo.com}")
46 private String authUrl; 49 private String authUrl;
47 50
  51 + @Value("${cashierResultUrl:}")
  52 + private String cashierResultUrl;
  53 +
48 @Value("${callbackDomain:}") 54 @Value("${callbackDomain:}")
49 private String callbackDomain; 55 private String callbackDomain;
50 56
@@ -80,6 +86,14 @@ public class RtMallDynamicProperty { @@ -80,6 +86,14 @@ public class RtMallDynamicProperty {
80 this.authUrl = authUrl; 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 public Integer getOrderType() { 97 public Integer getOrderType() {
84 return orderType; 98 return orderType;
85 } 99 }
@@ -88,6 +102,14 @@ public class RtMallDynamicProperty { @@ -88,6 +102,14 @@ public class RtMallDynamicProperty {
88 this.orderType = orderType; 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 public String getCompanyCode() { 113 public String getCompanyCode() {
92 return companyCode; 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,7 +72,7 @@ public class MallBizOrderServiceImpl implements MallBizOrderService {
72 MallBizPayment mallBizPayment = MallBizPayment.of(mallBizOrders); 72 MallBizPayment mallBizPayment = MallBizPayment.of(mallBizOrders);
73 73
74 // TODO 2025/12/30: 预支付信息 收银台地址信息 74 // TODO 2025/12/30: 预支付信息 收银台地址信息
75 - mallBizPayment.setPayPaymentId(IdUtil.simpleUUID()); 75 + mallBizPayment.setPayTradeId(IdUtil.simpleUUID());
76 mallBizPayment.setCashierUrl("https://cashier.test.gszdtop.com?payTradeNo=" + mallBizPayment.getPayTradeNo()); 76 mallBizPayment.setCashierUrl("https://cashier.test.gszdtop.com?payTradeNo=" + mallBizPayment.getPayTradeNo());
77 77
78 // save 78 // save
@@ -164,7 +164,7 @@ public class MallBizOrderServiceImpl implements MallBizOrderService { @@ -164,7 +164,7 @@ public class MallBizOrderServiceImpl implements MallBizOrderService {
164 Optional.of(bizPaymentOrders) 164 Optional.of(bizPaymentOrders)
165 .ifPresent(paymentOrders -> { 165 .ifPresent(paymentOrders -> {
166 paymentOrders.forEach(vo -> { 166 paymentOrders.forEach(vo -> {
167 - vo.setPayPaymentId(mallBizPayment.getPayPaymentId()); 167 + vo.setPayTradeId(mallBizPayment.getPayTradeId());
168 }); 168 });
169 mallBizPaymentOrderDao.batchInsert(paymentOrders); 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,6 +48,9 @@ public class MallBizRefundServiceImpl implements MallBizRefundService {
48 @Transactional(rollbackFor = {Exception.class}) 48 @Transactional(rollbackFor = {Exception.class})
49 public RefundSuccessVO refund(RefundCO refundCo) { 49 public RefundSuccessVO refund(RefundCO refundCo) {
50 MallBizOrder mallBizOrder = mallBizOrderDao.getByOrderId(refundCo.getOrderId()); 50 MallBizOrder mallBizOrder = mallBizOrderDao.getByOrderId(refundCo.getOrderId());
  51 + if (Objects.isNull(mallBizOrder)) {
  52 + throw new RtMartMallException(RtMarkErrorCode.E5004);
  53 + }
51 MallBizRefund mallBizRefund = MallInitializeContext.getBySource(mallBizOrder.getSource()).refund(refundCo); 54 MallBizRefund mallBizRefund = MallInitializeContext.getBySource(mallBizOrder.getSource()).refund(refundCo);
52 return new RefundSuccessVO(mallBizRefund.getPayTradeNo(), mallBizRefund.getRefundTradeNo()); 55 return new RefundSuccessVO(mallBizRefund.getPayTradeNo(), mallBizRefund.getRefundTradeNo());
53 } 56 }
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/paychannel/CardPayChannel.java
1 package com.diligrp.cashier.mall.service.paychannel; 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 import org.springframework.stereotype.Component; 4 import org.springframework.stereotype.Component;
5 5
6 /** 6 /**
@@ -14,6 +14,6 @@ import org.springframework.stereotype.Component; @@ -14,6 +14,6 @@ import org.springframework.stereotype.Component;
14 public class CardPayChannel extends AbstractPayChannel { 14 public class CardPayChannel extends AbstractPayChannel {
15 @Override 15 @Override
16 public Integer getPayChannel() { 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 package com.diligrp.cashier.mall.service.paychannel; 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 import org.springframework.stereotype.Component; 4 import org.springframework.stereotype.Component;
5 5
6 /** 6 /**
@@ -14,6 +14,6 @@ import org.springframework.stereotype.Component; @@ -14,6 +14,6 @@ import org.springframework.stereotype.Component;
14 public class WeChatPayChannel extends AbstractPayChannel { 14 public class WeChatPayChannel extends AbstractPayChannel {
15 @Override 15 @Override
16 public Integer getPayChannel() { 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,11 +10,13 @@ import com.diligrp.cashier.mall.domain.rtmall.co.RefundCO;
10 import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO; 10 import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO;
11 import com.diligrp.cashier.mall.exception.RtMartMallException; 11 import com.diligrp.cashier.mall.exception.RtMartMallException;
12 import com.diligrp.cashier.mall.model.MallBizOrder; 12 import com.diligrp.cashier.mall.model.MallBizOrder;
  13 +import com.diligrp.cashier.mall.model.MallBizPayment;
13 import com.diligrp.cashier.mall.model.MallBizPaymentOrder; 14 import com.diligrp.cashier.mall.model.MallBizPaymentOrder;
14 import com.diligrp.cashier.mall.model.MallBizRefund; 15 import com.diligrp.cashier.mall.model.MallBizRefund;
15 import com.diligrp.cashier.mall.property.RtMallDynamicProperty; 16 import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
16 import com.diligrp.cashier.mall.service.biz.MallBizPaymentService; 17 import com.diligrp.cashier.mall.service.biz.MallBizPaymentService;
17 import com.diligrp.cashier.mall.type.PayState; 18 import com.diligrp.cashier.mall.type.PayState;
  19 +import com.diligrp.cashier.mall.type.RefundState;
18 import com.diligrp.cashier.mall.type.RtMarkErrorCode; 20 import com.diligrp.cashier.mall.type.RtMarkErrorCode;
19 import com.diligrp.cashier.shared.util.DateUtils; 21 import com.diligrp.cashier.shared.util.DateUtils;
20 import com.diligrp.cashier.shared.util.JsonUtils; 22 import com.diligrp.cashier.shared.util.JsonUtils;
@@ -96,13 +98,19 @@ public abstract class AbstractSourceChannel { @@ -96,13 +98,19 @@ public abstract class AbstractSourceChannel {
96 MallBizOrder mallBizOrder = mallBizOrderDao.getByOrderId(refundCo.getOrderId()); 98 MallBizOrder mallBizOrder = mallBizOrderDao.getByOrderId(refundCo.getOrderId());
97 MallBizPaymentOrder mallBizPaymentOrder = getPayment(refundCo); 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 MallBizRefund refund = MallBizRefund.of(refundCo, mallBizOrder, mallBizPaymentOrder); 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 save(refund); 115 save(refund);
108 return refund; 116 return refund;
@@ -124,6 +132,16 @@ public abstract class AbstractSourceChannel { @@ -124,6 +132,16 @@ public abstract class AbstractSourceChannel {
124 public abstract void userInfoChannel(UserInfoVO authLogin, RtMallDynamicProperty.AppSecretDynamicProperty userInfoVO); 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 * getPayment 145 * getPayment
128 */ 146 */
129 private MallBizPaymentOrder getPayment(RefundCO refundCo) { 147 private MallBizPaymentOrder getPayment(RefundCO refundCo) {
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/sourcechannel/RtMallChannel.java
1 package com.diligrp.cashier.mall.service.sourcechannel; 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 import com.diligrp.cashier.mall.domain.rtmall.co.AuthLoginCO; 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 import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO; 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 import com.diligrp.cashier.mall.property.RtMallDynamicProperty; 13 import com.diligrp.cashier.mall.property.RtMallDynamicProperty;
6 import com.diligrp.cashier.mall.type.OrderSource; 14 import com.diligrp.cashier.mall.type.OrderSource;
  15 +import com.diligrp.cashier.mall.util.HttpClientUtils;
7 import com.diligrp.cashier.mall.util.RtMallSignMd5Utils; 16 import com.diligrp.cashier.mall.util.RtMallSignMd5Utils;
  17 +import com.diligrp.cashier.shared.util.DateUtils;
8 import com.diligrp.cashier.shared.util.JsonUtils; 18 import com.diligrp.cashier.shared.util.JsonUtils;
9 import com.diligrp.cashier.shared.util.UrlParamParserUtils; 19 import com.diligrp.cashier.shared.util.UrlParamParserUtils;
  20 +import com.fasterxml.jackson.core.type.TypeReference;
10 import org.slf4j.Logger; 21 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory; 22 import org.slf4j.LoggerFactory;
12 import org.springframework.stereotype.Component; 23 import org.springframework.stereotype.Component;
@@ -55,6 +66,58 @@ public class RtMallChannel extends AbstractSourceChannel { @@ -55,6 +66,58 @@ public class RtMallChannel extends AbstractSourceChannel {
55 authLogin.setCompanyCode(property.getCompanyCode()); 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 @Override 121 @Override
59 public Integer source() { 122 public Integer source() {
60 return OrderSource.RT_MART.getCode(); 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,7 +41,7 @@ public class RtMallSign implements SecuritySign {
41 41
42 Object appKey = paramMap.get("app_key"); 42 Object appKey = paramMap.get("app_key");
43 if (Objects.isNull(appKey)) { 43 if (Objects.isNull(appKey)) {
44 - throw new RtMartMallException(RtMarkErrorCode.E4003); 44 + throw new RtMartMallException(RtMarkErrorCode.E4001);
45 } 45 }
46 46
47 Object sign = paramMap.get("sign"); 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,8 +16,8 @@ import java.util.stream.Collectors;
16 public enum OrderState { 16 public enum OrderState {
17 NOT_PAY(0, "notpay", "未支付"), 17 NOT_PAY(0, "notpay", "未支付"),
18 PAYED(1, "payed", "已支付"), 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 DONE(4, "done", "订单完成"), 21 DONE(4, "done", "订单完成"),
22 CONFIRM_RECEIPT(4, "confirmreceipt", "订单完成"), 22 CONFIRM_RECEIPT(4, "confirmreceipt", "订单完成"),
23 BUYER_CONFIRM(5, "buyer_confirm", "待用户收货"), 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,7 +23,7 @@ public class SecondToDateDeserializer extends JsonDeserializer&lt;LocalDateTime&gt; {
23 long timestamp = parser.getValueAsLong(); 23 long timestamp = parser.getValueAsLong();
24 return LocalDateTime.ofInstant( 24 return LocalDateTime.ofInstant(
25 Instant.ofEpochSecond(timestamp), 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,6 +18,6 @@ import java.time.ZoneOffset;
18 public class DateToSecondSerializer extends JsonSerializer<LocalDateTime> { 18 public class DateToSecondSerializer extends JsonSerializer<LocalDateTime> {
19 @Override 19 @Override
20 public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 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 }