Commit 07f54ce2deeed0fdad3b032cf5413c72de9875fb
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
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<LocalDateTime> { |
| 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 | } | ... | ... |