Commit cbaeeb87967f4063624f88e380595519a6aebff3

Authored by huanggang
1 parent f67985dc

token timeout conf

cashier-boss/src/main/java/com/diligrp/cashier/boss/CashierDeskProperties.java
@@ -7,6 +7,8 @@ import javax.crypto.spec.SecretKeySpec; @@ -7,6 +7,8 @@ import javax.crypto.spec.SecretKeySpec;
7 public class CashierDeskProperties { 7 public class CashierDeskProperties {
8 // 密钥 8 // 密钥
9 private SecretKeySpec secretKey; 9 private SecretKeySpec secretKey;
  10 + // TOKEN过期时间
  11 + private Long tokenTimeout;
10 // 收银台配置 12 // 收银台配置
11 private MerchantParams.CashierParams cashier; 13 private MerchantParams.CashierParams cashier;
12 14
@@ -18,6 +20,14 @@ public class CashierDeskProperties { @@ -18,6 +20,14 @@ public class CashierDeskProperties {
18 this.secretKey = secretKey; 20 this.secretKey = secretKey;
19 } 21 }
20 22
  23 + public Long getTokenTimeout() {
  24 + return tokenTimeout;
  25 + }
  26 +
  27 + public void setTokenTimeout(Long tokenTimeout) {
  28 + this.tokenTimeout = tokenTimeout;
  29 + }
  30 +
21 public MerchantParams.CashierParams getCashier() { 31 public MerchantParams.CashierParams getCashier() {
22 return cashier; 32 return cashier;
23 } 33 }
cashier-boss/src/main/java/com/diligrp/cashier/boss/Constants.java
@@ -13,9 +13,5 @@ public final class Constants { @@ -13,9 +13,5 @@ public final class Constants {
13 public static final String TOKEN_SIGN_ALGORITHM = "HmacSHA256"; 13 public static final String TOKEN_SIGN_ALGORITHM = "HmacSHA256";
14 // TOKEN的签名长度 14 // TOKEN的签名长度
15 public static final int TOKEN_SIGN_LENGTH = 8; 15 public static final int TOKEN_SIGN_LENGTH = 8;
16 - // TOKEN过期时长,单位秒 - 5分钟  
17 - public static final long TOKEN_TIMEOUT_SECONDS = 10 * 60;  
18 -  
19 - public final static String CONTENT_TYPE = "application/json;charset=UTF-8";  
20 16
21 } 17 }
cashier-boss/src/main/java/com/diligrp/cashier/boss/controller/RcbPaymentController.java
1 package com.diligrp.cashier.boss.controller; 1 package com.diligrp.cashier.boss.controller;
2 2
3 import com.diligrp.cashier.boss.exception.BossServiceException; 3 import com.diligrp.cashier.boss.exception.BossServiceException;
  4 +import com.diligrp.cashier.boss.service.ICashierDeskService;
4 import com.diligrp.cashier.pipeline.core.RcbOnlinePipeline; 5 import com.diligrp.cashier.pipeline.core.RcbOnlinePipeline;
5 import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse; 6 import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse;
6 import com.diligrp.cashier.pipeline.service.IPaymentPipelineManager; 7 import com.diligrp.cashier.pipeline.service.IPaymentPipelineManager;
@@ -12,7 +13,6 @@ import com.diligrp.cashier.shared.ErrorCode; @@ -12,7 +13,6 @@ import com.diligrp.cashier.shared.ErrorCode;
12 import com.diligrp.cashier.shared.util.JsonUtils; 13 import com.diligrp.cashier.shared.util.JsonUtils;
13 import com.diligrp.cashier.shared.util.ObjectUtils; 14 import com.diligrp.cashier.shared.util.ObjectUtils;
14 import com.diligrp.cashier.trade.model.OnlinePayment; 15 import com.diligrp.cashier.trade.model.OnlinePayment;
15 -import com.diligrp.cashier.trade.service.ICashierPaymentService;  
16 import com.diligrp.cashier.trade.service.ITradeAssistantService; 16 import com.diligrp.cashier.trade.service.ITradeAssistantService;
17 import com.fasterxml.jackson.core.type.TypeReference; 17 import com.fasterxml.jackson.core.type.TypeReference;
18 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
@@ -40,7 +40,7 @@ public class RcbPaymentController { @@ -40,7 +40,7 @@ public class RcbPaymentController {
40 private ITradeAssistantService tradeAssistantService; 40 private ITradeAssistantService tradeAssistantService;
41 41
42 @Resource 42 @Resource
43 - private ICashierPaymentService cashierPaymentService; 43 + private ICashierDeskService cashierDeskService;
44 44
45 @Resource 45 @Resource
46 private IPaymentPipelineManager paymentPipelineManager; 46 private IPaymentPipelineManager paymentPipelineManager;
@@ -84,7 +84,7 @@ public class RcbPaymentController { @@ -84,7 +84,7 @@ public class RcbPaymentController {
84 84
85 OnlinePaymentResponse paymentResponse = new OnlinePaymentResponse(paymentId, outTradeNo, outPayType, 85 OnlinePaymentResponse paymentResponse = new OnlinePaymentResponse(paymentId, outTradeNo, outPayType,
86 payerId, when, paymentState, errorDesc); 86 payerId, when, paymentState, errorDesc);
87 - cashierPaymentService.notifyPaymentResponse(paymentResponse); 87 + cashierDeskService.notifyPaymentResponse(payment, paymentResponse);
88 return ResponseEntity.ok("SUCCESS"); 88 return ResponseEntity.ok("SUCCESS");
89 } catch (Exception ex) { 89 } catch (Exception ex) {
90 LOG.error("Process rcb payment result exception", ex); 90 LOG.error("Process rcb payment result exception", ex);
cashier-boss/src/main/java/com/diligrp/cashier/boss/controller/WechatPaymentController.java
1 package com.diligrp.cashier.boss.controller; 1 package com.diligrp.cashier.boss.controller;
2 2
3 import com.diligrp.cashier.boss.exception.BossServiceException; 3 import com.diligrp.cashier.boss.exception.BossServiceException;
  4 +import com.diligrp.cashier.boss.service.ICashierDeskService;
4 import com.diligrp.cashier.pipeline.core.WechatPartnerPipeline; 5 import com.diligrp.cashier.pipeline.core.WechatPartnerPipeline;
5 import com.diligrp.cashier.pipeline.core.WechatPipeline; 6 import com.diligrp.cashier.pipeline.core.WechatPipeline;
6 import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse; 7 import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse;
@@ -19,7 +20,6 @@ import com.diligrp.cashier.shared.util.DateUtils; @@ -19,7 +20,6 @@ import com.diligrp.cashier.shared.util.DateUtils;
19 import com.diligrp.cashier.shared.util.HttpUtils; 20 import com.diligrp.cashier.shared.util.HttpUtils;
20 import com.diligrp.cashier.shared.util.JsonUtils; 21 import com.diligrp.cashier.shared.util.JsonUtils;
21 import com.diligrp.cashier.trade.model.OnlinePayment; 22 import com.diligrp.cashier.trade.model.OnlinePayment;
22 -import com.diligrp.cashier.trade.service.ICashierPaymentService;  
23 import com.diligrp.cashier.trade.service.ITradeAssistantService; 23 import com.diligrp.cashier.trade.service.ITradeAssistantService;
24 import jakarta.annotation.Resource; 24 import jakarta.annotation.Resource;
25 import jakarta.servlet.http.HttpServletRequest; 25 import jakarta.servlet.http.HttpServletRequest;
@@ -47,7 +47,7 @@ public class WechatPaymentController { @@ -47,7 +47,7 @@ public class WechatPaymentController {
47 private ITradeAssistantService tradeAssistantService; 47 private ITradeAssistantService tradeAssistantService;
48 48
49 @Resource 49 @Resource
50 - private ICashierPaymentService cashierPaymentService; 50 + private ICashierDeskService cashierDeskService;
51 51
52 @Resource 52 @Resource
53 private IPaymentPipelineManager paymentPipelineManager; 53 private IPaymentPipelineManager paymentPipelineManager;
@@ -87,7 +87,7 @@ public class WechatPaymentController { @@ -87,7 +87,7 @@ public class WechatPaymentController {
87 WechatNotifyResponse response = JsonUtils.fromJsonString(payload, WechatNotifyResponse.class); 87 WechatNotifyResponse response = JsonUtils.fromJsonString(payload, WechatNotifyResponse.class);
88 OnlinePaymentResponse paymentResponse = paymentResponse(pipeline, response); 88 OnlinePaymentResponse paymentResponse = paymentResponse(pipeline, response);
89 if (WechatConstants.NOTIFY_EVENT_TYPE.equals(response.getEvent_type())) { 89 if (WechatConstants.NOTIFY_EVENT_TYPE.equals(response.getEvent_type())) {
90 - cashierPaymentService.notifyPaymentResponse(paymentResponse); 90 + cashierDeskService.notifyPaymentResponse(payment, paymentResponse);
91 } 91 }
92 return ResponseEntity.ok(NotifyResult.success()); 92 return ResponseEntity.ok(NotifyResult.success());
93 } else { 93 } else {
@@ -114,7 +114,7 @@ public class WechatPaymentController { @@ -114,7 +114,7 @@ public class WechatPaymentController {
114 WechatNotifyResponse notifyResponse = JsonUtils.fromJsonString(payload, WechatNotifyResponse.class); 114 WechatNotifyResponse notifyResponse = JsonUtils.fromJsonString(payload, WechatNotifyResponse.class);
115 if (WechatConstants.REFUND_EVENT_TYPE.equals(notifyResponse.getEvent_type())) { 115 if (WechatConstants.REFUND_EVENT_TYPE.equals(notifyResponse.getEvent_type())) {
116 OnlineRefundResponse refundResponse = refundResponse(pipeline, notifyResponse); 116 OnlineRefundResponse refundResponse = refundResponse(pipeline, notifyResponse);
117 - cashierPaymentService.notifyRefundResult(refundResponse); 117 + cashierDeskService.notifyRefundResult(refund, refundResponse);
118 } 118 }
119 return ResponseEntity.ok(NotifyResult.success()); 119 return ResponseEntity.ok(NotifyResult.success());
120 } else { 120 } else {
cashier-boss/src/main/java/com/diligrp/cashier/boss/service/ICashierDeskService.java
@@ -2,8 +2,11 @@ package com.diligrp.cashier.boss.service; @@ -2,8 +2,11 @@ package com.diligrp.cashier.boss.service;
2 2
3 import com.diligrp.cashier.boss.domain.CashierOrderVO; 3 import com.diligrp.cashier.boss.domain.CashierOrderVO;
4 import com.diligrp.cashier.boss.domain.CashierPaymentUrl; 4 import com.diligrp.cashier.boss.domain.CashierPaymentUrl;
  5 +import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse;
5 import com.diligrp.cashier.pipeline.domain.OnlinePaymentStatus; 6 import com.diligrp.cashier.pipeline.domain.OnlinePaymentStatus;
  7 +import com.diligrp.cashier.pipeline.domain.OnlineRefundResponse;
6 import com.diligrp.cashier.trade.domain.*; 8 import com.diligrp.cashier.trade.domain.*;
  9 +import com.diligrp.cashier.trade.model.OnlinePayment;
7 10
8 public interface ICashierDeskService { 11 public interface ICashierDeskService {
9 /** 12 /**
@@ -29,6 +32,14 @@ public interface ICashierDeskService { @@ -29,6 +32,14 @@ public interface ICashierDeskService {
29 OnlinePaymentStatus doPayment(CashierPayment payment); 32 OnlinePaymentStatus doPayment(CashierPayment payment);
30 33
31 /** 34 /**
  35 + * 支付结果通知
  36 + *
  37 + * @param payment - 支付订单
  38 + * @param response - 支付结果
  39 + */
  40 + void notifyPaymentResponse(OnlinePayment payment, OnlinePaymentResponse response);
  41 +
  42 + /**
32 * 关闭交易订单 43 * 关闭交易订单
33 */ 44 */
34 void closeTradeOrder(String tradeId); 45 void closeTradeOrder(String tradeId);
@@ -44,6 +55,14 @@ public interface ICashierDeskService { @@ -44,6 +55,14 @@ public interface ICashierDeskService {
44 OnlineRefundResult sendRefundRequest(OnlineRefundDTO request); 55 OnlineRefundResult sendRefundRequest(OnlineRefundDTO request);
45 56
46 /** 57 /**
  58 + * 退款结果通知
  59 + *
  60 + * @param refund - 退款订单
  61 + * @param response - 退款结果
  62 + */
  63 + void notifyRefundResult(OnlinePayment refund, OnlineRefundResponse response);
  64 +
  65 + /**
47 * 查询退款状态 66 * 查询退款状态
48 */ 67 */
49 OnlineRefundResult queryRefundState(String refundId, String mode); 68 OnlineRefundResult queryRefundState(String refundId, String mode);
cashier-boss/src/main/java/com/diligrp/cashier/boss/service/impl/CashierDeskServiceImpl.java
@@ -9,12 +9,15 @@ import com.diligrp.cashier.boss.exception.BossServiceException; @@ -9,12 +9,15 @@ import com.diligrp.cashier.boss.exception.BossServiceException;
9 import com.diligrp.cashier.boss.service.ICashierDeskService; 9 import com.diligrp.cashier.boss.service.ICashierDeskService;
10 import com.diligrp.cashier.boss.service.IMerchantService; 10 import com.diligrp.cashier.boss.service.IMerchantService;
11 import com.diligrp.cashier.pipeline.core.PaymentPipeline; 11 import com.diligrp.cashier.pipeline.core.PaymentPipeline;
  12 +import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse;
12 import com.diligrp.cashier.pipeline.domain.OnlinePaymentStatus; 13 import com.diligrp.cashier.pipeline.domain.OnlinePaymentStatus;
  14 +import com.diligrp.cashier.pipeline.domain.OnlineRefundResponse;
13 import com.diligrp.cashier.pipeline.service.IPaymentPipelineManager; 15 import com.diligrp.cashier.pipeline.service.IPaymentPipelineManager;
14 import com.diligrp.cashier.pipeline.type.PaymentState; 16 import com.diligrp.cashier.pipeline.type.PaymentState;
15 import com.diligrp.cashier.shared.ErrorCode; 17 import com.diligrp.cashier.shared.ErrorCode;
16 import com.diligrp.cashier.shared.util.ObjectUtils; 18 import com.diligrp.cashier.shared.util.ObjectUtils;
17 import com.diligrp.cashier.trade.domain.*; 19 import com.diligrp.cashier.trade.domain.*;
  20 +import com.diligrp.cashier.trade.model.OnlinePayment;
18 import com.diligrp.cashier.trade.model.TradeOrder; 21 import com.diligrp.cashier.trade.model.TradeOrder;
19 import com.diligrp.cashier.trade.service.ICashierPaymentService; 22 import com.diligrp.cashier.trade.service.ICashierPaymentService;
20 import com.diligrp.cashier.trade.service.ITradeAssistantService; 23 import com.diligrp.cashier.trade.service.ITradeAssistantService;
@@ -61,9 +64,9 @@ public class CashierDeskServiceImpl implements ICashierDeskService { @@ -61,9 +64,9 @@ public class CashierDeskServiceImpl implements ICashierDeskService {
61 CashierOrderToken orderToken = new CashierOrderToken(merchant.getMchId(), tradeId, order.getType().getCode(), 64 CashierOrderToken orderToken = new CashierOrderToken(merchant.getMchId(), tradeId, order.getType().getCode(),
62 order.getUserId(), order.getRedirectUrl()); 65 order.getUserId(), order.getRedirectUrl());
63 66
64 - String tokenKey = String.format(Constants.TRADE_REDIS_KEY, tradeId);  
65 - stringRedisTemplate.opsForValue().set(tokenKey, orderToken.toString(), Constants.TOKEN_TIMEOUT_SECONDS, TimeUnit.SECONDS);  
66 MerchantParams params = merchant.getParams(); 67 MerchantParams params = merchant.getParams();
  68 + String tokenKey = String.format(Constants.TRADE_REDIS_KEY, tradeId);
  69 + stringRedisTemplate.opsForValue().set(tokenKey, orderToken.toString(), params.getTokenTimeout(), TimeUnit.SECONDS);
67 String paymentUrl = switch (order.getType()) { 70 String paymentUrl = switch (order.getType()) {
68 case MINIPRO -> String.format("%s?%s=%s", params.getCashier().getMiniProUrl(), Constants.TOKEN_PARAM_NAME, token); 71 case MINIPRO -> String.format("%s?%s=%s", params.getCashier().getMiniProUrl(), Constants.TOKEN_PARAM_NAME, token);
69 case H5 -> String.format("%s?%s=%s", params.getCashier().getH5Url(), Constants.TOKEN_PARAM_NAME, token); 72 case H5 -> String.format("%s?%s=%s", params.getCashier().getH5Url(), Constants.TOKEN_PARAM_NAME, token);
@@ -104,7 +107,7 @@ public class CashierDeskServiceImpl implements ICashierDeskService { @@ -104,7 +107,7 @@ public class CashierDeskServiceImpl implements ICashierDeskService {
104 @Override 107 @Override
105 public OnlinePaymentStatus doPayment(CashierPayment payment) { 108 public OnlinePaymentStatus doPayment(CashierPayment payment) {
106 OnlinePaymentStatus paymentStatus = cashierPaymentService.doPayment(payment); 109 OnlinePaymentStatus paymentStatus = cashierPaymentService.doPayment(payment);
107 - // 收银台支付成功,使token失效,收银台页面将无法重新打开 110 + // 收银台支付成功,使token失效,收银台页面将无法重新打开
108 if (paymentStatus.getState() == PaymentState.SUCCESS) { 111 if (paymentStatus.getState() == PaymentState.SUCCESS) {
109 String tokenKey = String.format(Constants.TRADE_REDIS_KEY, payment.getTradeId()); 112 String tokenKey = String.format(Constants.TRADE_REDIS_KEY, payment.getTradeId());
110 stringRedisTemplate.delete(tokenKey); 113 stringRedisTemplate.delete(tokenKey);
@@ -113,8 +116,21 @@ public class CashierDeskServiceImpl implements ICashierDeskService { @@ -113,8 +116,21 @@ public class CashierDeskServiceImpl implements ICashierDeskService {
113 } 116 }
114 117
115 @Override 118 @Override
  119 + public void notifyPaymentResponse(OnlinePayment payment, OnlinePaymentResponse response) {
  120 + cashierPaymentService.notifyPaymentResponse(payment, response);
  121 + if (PaymentState.SUCCESS == response.getState()) {
  122 + // 收银台支付成功,使token失效,收银台页面将无法重新打开
  123 + String tokenKey = String.format(Constants.TRADE_REDIS_KEY, payment.getTradeId());
  124 + stringRedisTemplate.delete(tokenKey);
  125 + }
  126 + }
  127 +
  128 + @Override
116 public void closeTradeOrder(String tradeId) { 129 public void closeTradeOrder(String tradeId) {
117 cashierPaymentService.closeTradeOrder(tradeId); 130 cashierPaymentService.closeTradeOrder(tradeId);
  131 + // 使token失效,收银台页面将无法重新打开
  132 + String tokenKey = String.format(Constants.TRADE_REDIS_KEY, tradeId);
  133 + stringRedisTemplate.delete(tokenKey);
118 } 134 }
119 135
120 @Override 136 @Override
@@ -128,6 +144,11 @@ public class CashierDeskServiceImpl implements ICashierDeskService { @@ -128,6 +144,11 @@ public class CashierDeskServiceImpl implements ICashierDeskService {
128 } 144 }
129 145
130 @Override 146 @Override
  147 + public void notifyRefundResult(OnlinePayment refund, OnlineRefundResponse response) {
  148 + cashierPaymentService.notifyRefundResult(refund, response);
  149 + }
  150 +
  151 + @Override
131 public OnlineRefundResult queryRefundState(String refundId, String mode) { 152 public OnlineRefundResult queryRefundState(String refundId, String mode) {
132 return cashierPaymentService.queryRefundState(refundId, mode); 153 return cashierPaymentService.queryRefundState(refundId, mode);
133 } 154 }
cashier-boss/src/main/java/com/diligrp/cashier/boss/util/MerchantConverter.java
@@ -29,6 +29,9 @@ public class MerchantConverter implements IConverter<MerchantDO, Merchant> { @@ -29,6 +29,9 @@ public class MerchantConverter implements IConverter<MerchantDO, Merchant> {
29 } 29 }
30 MerchantParams params = merchant.getParams(); 30 MerchantParams params = merchant.getParams();
31 31
  32 + if (Objects.isNull(params.getTokenTimeout())) {
  33 + params.setTokenTimeout(cashierProperties.getTokenTimeout());
  34 + }
32 if (Objects.isNull(params.getCashier())) { 35 if (Objects.isNull(params.getCashier())) {
33 params.setCashier(new MerchantParams.CashierParams()); 36 params.setCashier(new MerchantParams.CashierParams());
34 } 37 }
cashier-trade/src/main/java/com/diligrp/cashier/trade/domain/MerchantParams.java
@@ -5,6 +5,8 @@ import com.diligrp.cashier.shared.util.JsonUtils; @@ -5,6 +5,8 @@ import com.diligrp.cashier.shared.util.JsonUtils;
5 import java.util.Objects; 5 import java.util.Objects;
6 6
7 public class MerchantParams { 7 public class MerchantParams {
  8 + // TOKEN过期时间 - 单位秒
  9 + private Long tokenTimeout;
8 // 收银台配置 10 // 收银台配置
9 private CashierParams cashier; 11 private CashierParams cashier;
10 12
@@ -12,6 +14,14 @@ public class MerchantParams { @@ -12,6 +14,14 @@ public class MerchantParams {
12 return JsonUtils.fromJsonString(params, MerchantParams.class); 14 return JsonUtils.fromJsonString(params, MerchantParams.class);
13 } 15 }
14 16
  17 + public Long getTokenTimeout() {
  18 + return tokenTimeout;
  19 + }
  20 +
  21 + public void setTokenTimeout(Long tokenTimeout) {
  22 + this.tokenTimeout = tokenTimeout;
  23 + }
  24 +
15 public CashierParams getCashier() { 25 public CashierParams getCashier() {
16 return cashier; 26 return cashier;
17 } 27 }
cashier-trade/src/main/java/com/diligrp/cashier/trade/service/ICashierPaymentService.java
@@ -4,6 +4,7 @@ import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse; @@ -4,6 +4,7 @@ import com.diligrp.cashier.pipeline.domain.OnlinePaymentResponse;
4 import com.diligrp.cashier.pipeline.domain.OnlinePaymentStatus; 4 import com.diligrp.cashier.pipeline.domain.OnlinePaymentStatus;
5 import com.diligrp.cashier.pipeline.domain.OnlineRefundResponse; 5 import com.diligrp.cashier.pipeline.domain.OnlineRefundResponse;
6 import com.diligrp.cashier.trade.domain.*; 6 import com.diligrp.cashier.trade.domain.*;
  7 +import com.diligrp.cashier.trade.model.OnlinePayment;
7 8
8 public interface ICashierPaymentService { 9 public interface ICashierPaymentService {
9 /** 10 /**
@@ -26,9 +27,10 @@ public interface ICashierPaymentService { @@ -26,9 +27,10 @@ public interface ICashierPaymentService {
26 /** 27 /**
27 * 支付结果通知 28 * 支付结果通知
28 * 29 *
  30 + * @param payment - 支付订单
29 * @param response - 支付结果 31 * @param response - 支付结果
30 */ 32 */
31 - void notifyPaymentResponse(OnlinePaymentResponse response); 33 + void notifyPaymentResponse(OnlinePayment payment, OnlinePaymentResponse response);
32 34
33 /** 35 /**
34 * 关闭交易订单 36 * 关闭交易订单
@@ -48,9 +50,10 @@ public interface ICashierPaymentService { @@ -48,9 +50,10 @@ public interface ICashierPaymentService {
48 /** 50 /**
49 * 退款结果通知 51 * 退款结果通知
50 * 52 *
  53 + * @param refund - 退款订单
51 * @param response - 退款结果 54 * @param response - 退款结果
52 */ 55 */
53 - void notifyRefundResult(OnlineRefundResponse response); 56 + void notifyRefundResult(OnlinePayment refund, OnlineRefundResponse response);
54 57
55 /** 58 /**
56 * 查询退款状态 59 * 查询退款状态
cashier-trade/src/main/java/com/diligrp/cashier/trade/service/impl/CashierAssistantServiceImpl.java
@@ -81,7 +81,7 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService { @@ -81,7 +81,7 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService {
81 LOG.error("scanCashierTradeOrder: close online prepare order exception", ex); 81 LOG.error("scanCashierTradeOrder: close online prepare order exception", ex);
82 } 82 }
83 } 83 }
84 - cashierPaymentService.notifyPaymentResponse(response); 84 + cashierPaymentService.notifyPaymentResponse(payment, response);
85 } 85 }
86 } 86 }
87 // 交易订单仍然未完成则关闭交易订单,交易订单不能继续支付 87 // 交易订单仍然未完成则关闭交易订单,交易订单不能继续支付
@@ -112,7 +112,7 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService { @@ -112,7 +112,7 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService {
112 OnlinePipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), OnlinePipeline.class); 112 OnlinePipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), OnlinePipeline.class);
113 OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo()); 113 OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo());
114 OnlineRefundResponse response = pipeline.queryRefundResponse(order); 114 OnlineRefundResponse response = pipeline.queryRefundResponse(order);
115 - cashierPaymentService.notifyRefundResult(response); 115 + cashierPaymentService.notifyRefundResult(refund, response);
116 if (!PaymentState.isFinished(response.getState().getCode())) { 116 if (!PaymentState.isFinished(response.getState().getCode())) {
117 long delay = pipeline.getTimeStrategy().nextRefundScanTime(times + 1); 117 long delay = pipeline.getTimeStrategy().nextRefundScanTime(times + 1);
118 TaskMessage message = new TaskMessage(TaskMessage.TYPE_CASHIER_REFUND_SCAN, refundId, String.valueOf(times + 1)); 118 TaskMessage message = new TaskMessage(TaskMessage.TYPE_CASHIER_REFUND_SCAN, refundId, String.valueOf(times + 1));
cashier-trade/src/main/java/com/diligrp/cashier/trade/service/impl/CashierPaymentServiceImpl.java
@@ -111,7 +111,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -111,7 +111,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
111 @Override 111 @Override
112 @Transactional(rollbackFor = Exception.class) 112 @Transactional(rollbackFor = Exception.class)
113 public OnlinePaymentStatus doPayment(CashierPayment payment) { 113 public OnlinePaymentStatus doPayment(CashierPayment payment) {
114 - // TODO: 接口防重复提交  
115 String lockKey = String.format(Constants.TRADE_LOCK_REDIS_KEY, payment.getTradeId()); 114 String lockKey = String.format(Constants.TRADE_LOCK_REDIS_KEY, payment.getTradeId());
116 RLock lock = redissonClient.getLock(lockKey); 115 RLock lock = redissonClient.getLock(lockKey);
117 try { 116 try {
@@ -178,9 +177,9 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -178,9 +177,9 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
178 TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.SUCCESS, 177 TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.SUCCESS,
179 trade.getVersion(), now); 178 trade.getVersion(), now);
180 tradeAssistantService.proceedTradeOrder(tradeStateDTO); 179 tradeAssistantService.proceedTradeOrder(tradeStateDTO);
181 - // 通知业务系统支付结果,  
182 - OnlinePaymentResult paymentResult = new OnlinePaymentResult(trade.getTradeId(), paymentId,  
183 - response.getState().getCode(), trade.getOutTradeNo(), OutPaymentType.DILICARD.getCode(), 180 + // 通知业务系统支付结果
  181 + OnlinePaymentResult paymentResult = OnlinePaymentResult.of(trade.getTradeId(), paymentId,
  182 + response.getState(), trade.getOutTradeNo(), response.getOutPayType(),
184 response.getPayerId(), response.getWhen(), response.getMessage()); 183 response.getPayerId(), response.getWhen(), response.getMessage());
185 paymentResultManager.notifyPaymentResult(trade.getNotifyUrl(), paymentResult, 500); 184 paymentResultManager.notifyPaymentResult(trade.getNotifyUrl(), paymentResult, 500);
186 } 185 }
@@ -209,8 +208,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -209,8 +208,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
209 */ 208 */
210 @Override 209 @Override
211 @Transactional(rollbackFor = Exception.class) 210 @Transactional(rollbackFor = Exception.class)
212 - public void notifyPaymentResponse(OnlinePaymentResponse response) {  
213 - OnlinePayment payment = tradeAssistantService.findByPaymentId(response.getPaymentId()); 211 + public void notifyPaymentResponse(OnlinePayment payment, OnlinePaymentResponse response) {
214 if (PaymentState.isFinished(payment.getState())) { 212 if (PaymentState.isFinished(payment.getState())) {
215 LOG.warn("Duplicate process cashier payment response: [{}:{}]", payment.getPaymentId(), response.getState().name()); 213 LOG.warn("Duplicate process cashier payment response: [{}:{}]", payment.getPaymentId(), response.getState().name());
216 return; 214 return;
@@ -379,8 +377,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -379,8 +377,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
379 377
380 @Override 378 @Override
381 @Transactional(rollbackFor = Exception.class) 379 @Transactional(rollbackFor = Exception.class)
382 - public void notifyRefundResult(OnlineRefundResponse response) {  
383 - OnlinePayment refund = tradeAssistantService.findByRefundId(response.getRefundId()); 380 + public void notifyRefundResult(OnlinePayment refund, OnlineRefundResponse response) {
384 if (PaymentState.isFinished(refund.getState())) { 381 if (PaymentState.isFinished(refund.getState())) {
385 LOG.warn("Duplicate process cashier refund response: [{}:{}]", response.getRefundId(), response.getState().name()); 382 LOG.warn("Duplicate process cashier refund response: [{}:{}]", response.getRefundId(), response.getState().name());
386 return; 383 return;
scripts/cashier-data.sql
1 INSERT INTO dili_cashier.upay_merchant(mch_id, name, param, address, linkman, telephone, state, created_time, modified_time) 1 INSERT INTO dili_cashier.upay_merchant(mch_id, name, param, address, linkman, telephone, state, created_time, modified_time)
2 -VALUES (1001, '安徽省中瑞农副产品有限责任公司', '{"cashier":{"miniProUrl": "https://cashier.test.gszdtop.com/pages/merchant/mp"}}', '安徽省濉溪县南环路中瑞农产品批发市场', '赵静', '0561-6863420', 1, now(), now()); 2 +VALUES (1001, '安徽省中瑞农副产品有限责任公司', '{"cashier":{"miniProUrl": "https://cashier.pay.gszdtop.com/pages/#/payment"}, "tokenTimeout": 600}', '安徽省濉溪县南环路中瑞农产品批发市场', '赵静', '0561-6863420', 1, now(), now());
3 3
4 -- 中瑞微信支付服务商通道, 根据环境配置不同的参数(服务地址、回调地址等) 4 -- 中瑞微信支付服务商通道, 根据环境配置不同的参数(服务地址、回调地址等)
5 -- INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time) 5 -- INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time)
6 --- VALUES (1001, 10011, 10, 10, '微信支付', 'https://api.mch.weixin.qq.com', '{"subMchId":"1679224186", "subAppId":"wxad27b69b888b6dc9", "appSecret":"9c254c0ab932b3c30292a05679a688f7", "notifyUrl": "https://cashier.test.gszdtop.com"}', 1, now(), now()); 6 +-- VALUES (1001, 10011, 10, 10, '微信支付', 'https://api.mch.weixin.qq.com', '{"subMchId":"1679224186", "subAppId":"wxad27b69b888b6dc9", "appSecret":"9c254c0ab932b3c30292a05679a688f7", "notifyUrl": "https://cashier.pay.gszdtop.com"}', 1, now(), now());
7 -- INSERT INTO `dili_cashier`.upay_wechat_param(pipeline_id, mch_id, app_id, app_secret, serial_no, private_key, wechat_serial_no, wechat_public_key, api_v3_key, type, created_time) 7 -- INSERT INTO `dili_cashier`.upay_wechat_param(pipeline_id, mch_id, app_id, app_secret, serial_no, private_key, wechat_serial_no, wechat_public_key, api_v3_key, type, created_time)
8 -- VALUES(10011, '1679223106', 'wxca99d56a6ab15f29', '9c254c0ab932b3c30292a05679a688f7', '60C2877836D1D618D2E40186995BB00299D92F44','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', 'RSfFvEBBQiHz8GZyDcP2eSUlZJgKjdxk', 2, now()); 8 -- VALUES(10011, '1679223106', 'wxca99d56a6ab15f29', '9c254c0ab932b3c30292a05679a688f7', '60C2877836D1D618D2E40186995BB00299D92F44','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', 'RSfFvEBBQiHz8GZyDcP2eSUlZJgKjdxk', 2, now());
9 9
10 -- 中瑞农商行聚合支付通道, 根据环境配置不同的参数(服务地址、回调地址等) 10 -- 中瑞农商行聚合支付通道, 根据环境配置不同的参数(服务地址、回调地址等)
11 INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time) 11 INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time)
12 -VALUES (1001, 10014, 29, 2, '微信支付', 'https://epos.ahrcu.com:3443', '{"merchantNo": "94734065411016B", "terminalNo": "19A03301", "appId": "wx6f15ee0bd788c744", "appSecret": "4ab4152adf21da99c629fe7f3ce6b571", "key": "45913E42F86C18F512BEF54C2F0FE5BF", "notifyUrl": "https://cashier.test.gszdtop.com"}', 1, now(), now()); 12 +VALUES (1001, 10014, 29, 2, '微信支付', 'https://epos.ahrcu.com:3443', '{"merchantNo": "94734065411016B", "terminalNo": "19A03301", "appId": "wx6f15ee0bd788c744", "appSecret": "4ab4152adf21da99c629fe7f3ce6b571", "key": "45913E42F86C18F512BEF54C2F0FE5BF", "notifyUrl": "https://cashier.pay.gszdtop.com"}', 1, now(), now());
13 13
14 -- 中瑞园区卡支付通道, 根据环境配置不同的参数(服务地址、回调地址等) 14 -- 中瑞园区卡支付通道, 根据环境配置不同的参数(服务地址、回调地址等)
15 INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time) 15 INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time)
16 -VALUES (1001, 10012, 19, 2, '园区卡支付', 'http://gateway.dev.nong12.com/pay-service', '{"outMchId": 9, "accountId": 118924}', 1, now(), now()); 16 +VALUES (1001, 10012, 19, 2, '园区卡支付', 'https://gateway.zr.zrgyl.com/pay-service', '{"outMchId": 9, "accountId": 118924}', 1, now(), now());
17 17
18 -- 高斯智达微信支付直连通道, 根据环境配置不同的参数(服务地址、回调地址等) 18 -- 高斯智达微信支付直连通道, 根据环境配置不同的参数(服务地址、回调地址等)
19 -- INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time) 19 -- INSERT INTO `dili_cashier`.upay_payment_pipeline(mch_id, pipeline_id, channel_id, type, name, uri, param, state, created_time, modified_time)
20 --- VALUES (1001, 10013, 10, 10, '微信支付', 'https://api.mch.weixin.qq.com', '{"notifyUrl": "https://cashier.test.gszdtop.com"}', 1, now(), now()); 20 +-- VALUES (1001, 10013, 10, 10, '微信支付', 'https://api.mch.weixin.qq.com', '{"notifyUrl": "https://cashier.pay.gszdtop.com"}', 1, now(), now());
21 -- INSERT INTO `dili_cashier`.upay_wechat_param (pipeline_id, mch_id, app_id, app_secret, serial_no, private_key, wechat_serial_no, wechat_public_key, api_v3_key, type, created_time) 21 -- INSERT INTO `dili_cashier`.upay_wechat_param (pipeline_id, mch_id, app_id, app_secret, serial_no, private_key, wechat_serial_no, wechat_public_key, api_v3_key, type, created_time)
22 -- VALUES (10013, '1710148119', 'wx5e3c1166921039e4', '6501cbb2f4ececdcf0ef84bc43f6a710', '43D78972EC26DD5E05DB57D837E7EA6078ECD784', 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBsOX0bfhd/q8kj93XqGFEJfCQ782jhbnCls573+Kj3sEPZ+BsDNCryNkFD9/UzN9NRAymIZ8CFRDopIg8QYHkrMpvkILLLBB+E0ItmJmbPBPVP7kRbYDQvz2m/ZYGhwmaDIT9LcB6Y1t3w4rvyPmpdWXZuSI/8eYELWMqBTqTPpwhpXLjxOPc7Parc0AlIpc1Ij2kgJ+5shJfwfcGB7+uFg4Kd+jGyjr6nd8xoT76tlzJ+EVjha8JmK4EPlNjbMgHj45528eJgu11Zx6QrwOvBRaT9Ny6xu7qoGB7MsQLlWGQJmuWzm8x3soHOIAkjpDNmzF3Fy94QMATLTE8SSUdAgMBAAECggEAbA9YS8Uqoq4bYoeNGesL0OxlyUawcIGDwIdITZ37oLb++KxYbY+8v4o/YW6Yzu05y66ia/En+A5ur4xToWJeqIiqLBHwlo9P6DawXiXb1NpwqjFx+8Ie8tcu+0JQ9/VQqww/Cc0DrIRQHIIQunRirWMc3ppF/GzligEUaPYf1tNH6suHmBzqQ1oswZCdEZy3/eEzF4GG68YBJuDSIR7kQ20rzY5Z9lNSX3f6lZN6iGG4CpMW8ueQPjueX9WuqRP8ZwCDUdUjROYmsXgKzDUsAu/wI5/q8W935si4WgCLYYx42KuOpbtf6PU14G9k7hAjfrva4Nb11GM110gAuMUZlQKBgQDe5gBM3Oqa3eCF2H/ojQGgPf3mzzIPFSnftRhRDNcPMK2Sn/Rnu6KGvH2czl0//ARaj+bd2QDeAyOQfnazwidvW7eJpMhP36kLRfjbRNrkVgkTm5JgqlttbRfxsXOfc8bcRAoWzbGX9GSclQUqPdmTvNGvrfGqqftrvtWJfjzftwKBgQDedIJTqKY/G66gFjSZinaOIg99E/64/auK5tzddis5uCJ237oD182jLmQTmyi3jvRv4lDbPifXTp349PxrVF/oObYLd6oQfpQEbQMConIejHQheOuAkhnX+PePucF1MeY2HXTCZNJGrrhzdvd7syAoiFD0tlzDiasxvPDLZWw5ywKBgEzHr4zKgGnOShvw4saJY+j90asi7hxx7tWnfPPWV3JdEz0xqi/dW3PME/zivQ5gUmObtCvxJzJSpHqOhXcQRyM91bAtOe8BnSpL9Rga1MfYtxGxAjAYHpxH+vp/ZNOlPvf62/rU6frs7YdeccQGQB966EP6yAdAvGF1//p3qKJrAoGBAINKMgzb8Vo3pUV4NY0U6kmSkp+YaHKXzGGLRXkzH+nN4hFUk31nJUeUvp3PqiVDqsJJyLzMn0j0bkmblUpnHr95KBb2hhl8CzHdgLRSWZXsATIsIpncIIKVvs5FrIbVb3AqzFlalbv/rH8BDKkmG+mwIk97PZ5uJuqQ/3CbqFcnAoGBAKJowMMJqI2vODG8tkuAOSW12HiFuUTXRcG+O0QBfX2hV64GpGRd5X0PgDfg+8AeNjrfQedkPYKqVNwk7evzpy7PDlo0Oj6SVXcdEXkCMXjkQpxUGqNLh90CFC34viaCOwspMkV5aNnHGygHjQrbBDLl1VsXZOOrwzzI3FRql23z', '14CB4FF37E1D903A05EA5E45C2EF1979AEA1FA87', 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0o3jNPl4Pescm9hewt6o8/A/0C/VUtqx/21WebWDaAaKyjWipLM9zUO2r5EvXG/cVWY85zAUAObIrhSueIK5W0M/aLW4aEmebePSjCz8OVCyWpyWy6Ahy68AMIgY/IkNYAeX0oVVxuop+RlHJJ0EaLFDQtICxhxfpGQ6f5nLHUJZJYma8GU1W5qE8IZNV2+XKrjNxOLJOiTk8ljqb2wsLEt+ASP8H63GVOzaXztd6KHnR+Z/4O761tXhuP18vyKqZFXsQKakioN3cci5fXtDaZbGzeY6jV8gFcZZRA2M4wg/V0qPvVnW7wqsNy6A3bUwHhmmSGd8H8jnbZdCLi9f8QIDAQAB', 't3sH85QcVkAsPgvdTyWHuCLpFwEtbEG8', 1, now()); 22 -- VALUES (10013, '1710148119', 'wx5e3c1166921039e4', '6501cbb2f4ececdcf0ef84bc43f6a710', '43D78972EC26DD5E05DB57D837E7EA6078ECD784', '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', 't3sH85QcVkAsPgvdTyWHuCLpFwEtbEG8', 1, now());
23 23