Commit 78c0b05ed5a59b33f6e61540eab23a19baca8386

Authored by huanggang
1 parent 3ab3cdfd

upgrade after testing

cashier-boss/src/main/java/com/diligrp/cashier/boss/domain/CashierOrderVO.java
@@ -35,7 +35,7 @@ public class CashierOrderVO { @@ -35,7 +35,7 @@ public class CashierOrderVO {
35 private final Long pipelineId; 35 private final Long pipelineId;
36 // 支付渠道 36 // 支付渠道
37 private final Integer channelId; 37 private final Integer channelId;
38 - 38 + // 支付渠道名称
39 private final String channelName; 39 private final String channelName;
40 40
41 public PaymentPipeline(Long pipelineId, ChannelType channelType) { 41 public PaymentPipeline(Long pipelineId, ChannelType channelType) {
cashier-trade/src/main/java/com/diligrp/cashier/trade/service/impl/CashierAssistantServiceImpl.java
@@ -65,7 +65,6 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService { @@ -65,7 +65,6 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService {
65 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) { 65 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
66 OnlinePrepayOrder order = new OnlinePrepayOrder(payment.getPaymentId(), payment.getOutTradeNo()); 66 OnlinePrepayOrder order = new OnlinePrepayOrder(payment.getPaymentId(), payment.getOutTradeNo());
67 // 微信服务商模式,还需子商户 67 // 微信服务商模式,还需子商户
68 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());  
69 OnlinePaymentResponse response = onlinePipeline.queryPrepayResponse(order); 68 OnlinePaymentResponse response = onlinePipeline.queryPrepayResponse(order);
70 if (!PaymentState.isFinished(response.getState().getCode())) { 69 if (!PaymentState.isFinished(response.getState().getCode())) {
71 try { 70 try {
@@ -105,8 +104,6 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService { @@ -105,8 +104,6 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService {
105 104
106 OnlinePipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), OnlinePipeline.class); 105 OnlinePipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), OnlinePipeline.class);
107 OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo()); 106 OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo());
108 - // 微信服务商模式,还需子商户  
109 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, refund.getOutMchId());  
110 OnlineRefundResponse response = pipeline.queryRefundResponse(order); 107 OnlineRefundResponse response = pipeline.queryRefundResponse(order);
111 cashierPaymentService.notifyRefundResult(response); 108 cashierPaymentService.notifyRefundResult(response);
112 } 109 }
cashier-trade/src/main/java/com/diligrp/cashier/trade/service/impl/CashierPaymentServiceImpl.java
@@ -139,7 +139,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -139,7 +139,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
139 // 小程序收银台将使用在线支付通道的小程序支付 139 // 小程序收银台将使用在线支付通道的小程序支付
140 MiniProPrepayRequest request = new MiniProPaymentConverter(trade, paymentId, now).convert(cashierPayment); 140 MiniProPrepayRequest request = new MiniProPaymentConverter(trade, paymentId, now).convert(cashierPayment);
141 MiniProPrepayResponse response = onlinePipeline.sendMiniProPrepayRequest(request); 141 MiniProPrepayResponse response = onlinePipeline.sendMiniProPrepayRequest(request);
142 - // 微信服务商模式下outMchId为签约子商户  
143 String outMchId = request.getString(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID); 142 String outMchId = request.getString(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID);
144 OnlinePayment payment = OnlinePayment.builder().outMchId(outMchId).tradeId(trade.getTradeId()) 143 OnlinePayment payment = OnlinePayment.builder().outMchId(outMchId).tradeId(trade.getTradeId())
145 .type(TradeType.TRADE).paymentId(paymentId).channelId(onlinePipeline.supportedChannel()) 144 .type(TradeType.TRADE).paymentId(paymentId).channelId(onlinePipeline.supportedChannel())
@@ -210,6 +209,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -210,6 +209,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
210 209
211 if (PaymentState.isFinished(response.getState().getCode())) { 210 if (PaymentState.isFinished(response.getState().getCode())) {
212 LocalDateTime now = LocalDateTime.now(); 211 LocalDateTime now = LocalDateTime.now();
  212 + OnlinePaymentResult paymentResult = null;
213 String lockKey = String.format(Constants.TRADE_LOCK_REDIS_KEY, payment.getTradeId()); 213 String lockKey = String.format(Constants.TRADE_LOCK_REDIS_KEY, payment.getTradeId());
214 RLock lock = redissonClient.getLock(lockKey); 214 RLock lock = redissonClient.getLock(lockKey);
215 try { 215 try {
@@ -225,17 +225,20 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -225,17 +225,20 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
225 if (PaymentState.SUCCESS == response.getState() && TradeState.PENDING.equalTo(trade.getState())) { 225 if (PaymentState.SUCCESS == response.getState() && TradeState.PENDING.equalTo(trade.getState())) {
226 TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.SUCCESS, trade.getVersion(), now); 226 TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.SUCCESS, trade.getVersion(), now);
227 tradeAssistantService.proceedTradeOrder(tradeStateDTO); 227 tradeAssistantService.proceedTradeOrder(tradeStateDTO);
228 - LOG.debug("Accomplish cashier order[{}] successfully", trade.getTradeId());  
229 - OnlinePaymentResult paymentResult = OnlinePaymentResult.of(trade.getTradeId(), payment.getPaymentId(), 228 + LOG.debug("Accomplish cashier trade order[{}] successfully", trade.getTradeId());
  229 + paymentResult = OnlinePaymentResult.of(trade.getTradeId(), payment.getPaymentId(),
230 response.getState(), trade.getOutTradeNo(), response.getOutPayType(), response.getPayerId(), 230 response.getState(), trade.getOutTradeNo(), response.getOutPayType(), response.getPayerId(),
231 - response.getWhen() != null ? response.getWhen() : now, response.getMessage());  
232 - paymentResultManager.notifyPaymentResult(trade.getNotifyUrl(), paymentResult, 500); 231 + response.getWhen(), response.getMessage());
233 } 232 }
234 } finally { 233 } finally {
235 if (lock.isHeldByCurrentThread()) { 234 if (lock.isHeldByCurrentThread()) {
236 lock.unlock(); 235 lock.unlock();
237 } 236 }
238 } 237 }
  238 + // 在分布式锁外支付回调
  239 + if (paymentResult != null) {
  240 + paymentResultManager.notifyPaymentResult(payment.getNotifyUrl(), paymentResult, 500);
  241 + }
239 } 242 }
240 } 243 }
241 244
@@ -253,21 +256,20 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -253,21 +256,20 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
253 lock.lock(); 256 lock.lock();
254 257
255 LocalDateTime now = LocalDateTime.now(); 258 LocalDateTime now = LocalDateTime.now();
256 - TradeOrder trade = tradeAssistantService.findByTradeId(payment.getTradeId()); 259 +// TradeOrder trade = tradeAssistantService.findByTradeId(payment.getTradeId());
257 PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class); 260 PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class);
258 // 只有在线支付通道才可以关闭支付订单,园区卡支付不支持 261 // 只有在线支付通道才可以关闭支付订单,园区卡支付不支持
259 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) { 262 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
260 OnlinePrepayOrder order = new OnlinePrepayOrder(paymentId, payment.getOutTradeNo()); 263 OnlinePrepayOrder order = new OnlinePrepayOrder(paymentId, payment.getOutTradeNo());
261 - // 用于微信服务商模式下,微信子商户信息  
262 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());  
263 onlinePipeline.closePrepayOrder(order); 264 onlinePipeline.closePrepayOrder(order);
264 PaymentStateDTO paymentDTO = PaymentStateDTO.builder().paymentId(payment.getPaymentId()) 265 PaymentStateDTO paymentDTO = PaymentStateDTO.builder().paymentId(payment.getPaymentId())
265 - .outTradeNo(null).outPayType(null).payerId(null).finishTime(now).state(PaymentState.FAILED) 266 + .outTradeNo(null).outPayType(null).payerId(null).finishTime(null).state(PaymentState.FAILED)
266 .description("人工关闭支付订单").version(payment.getVersion()).modifiedTime(now).build(); 267 .description("人工关闭支付订单").version(payment.getVersion()).modifiedTime(now).build();
267 tradeAssistantService.proceedOnlinePayment(paymentDTO); 268 tradeAssistantService.proceedOnlinePayment(paymentDTO);
268 269
269 - TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.CLOSED, trade.getVersion(), now);  
270 - tradeAssistantService.proceedTradeOrder(tradeStateDTO); 270 + // 暂时不修改交易订单,交易订单状态由延时消息统一处理,此时交易订单仍然可以继续支付
  271 +// TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.CLOSED, trade.getVersion(), now);
  272 +// tradeAssistantService.proceedTradeOrder(tradeStateDTO);
271 } 273 }
272 } finally { 274 } finally {
273 if (lock.isHeldByCurrentThread()) { 275 if (lock.isHeldByCurrentThread()) {
@@ -287,14 +289,10 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -287,14 +289,10 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
287 OnlinePrepayOrder order = new OnlinePrepayOrder(paymentId, payment.getOutTradeNo()); 289 OnlinePrepayOrder order = new OnlinePrepayOrder(paymentId, payment.getOutTradeNo());
288 PaymentPipeline<?> paymentPipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class); 290 PaymentPipeline<?> paymentPipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class);
289 if (paymentPipeline instanceof OnlinePipeline<?> pipeline) { 291 if (paymentPipeline instanceof OnlinePipeline<?> pipeline) {
290 - // 用于微信服务商模式下,微信子商户信息  
291 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());  
292 OnlinePaymentResponse response = pipeline.queryPrepayResponse(order); 292 OnlinePaymentResponse response = pipeline.queryPrepayResponse(order);
293 return OnlinePaymentResult.of(trade.getTradeId(), paymentId, response.getState(), trade.getOutTradeNo(), 293 return OnlinePaymentResult.of(trade.getTradeId(), paymentId, response.getState(), trade.getOutTradeNo(),
294 response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage()); 294 response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage());
295 } else if (paymentPipeline instanceof DiliCardPipeline pipeline) { 295 } else if (paymentPipeline instanceof DiliCardPipeline pipeline) {
296 - // 园区卡支付outMchId为市场ID  
297 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());  
298 CardPaymentResponse response = pipeline.queryPaymentResponse(order); 296 CardPaymentResponse response = pipeline.queryPaymentResponse(order);
299 return OnlinePaymentResult.of(trade.getTradeId(), paymentId, response.getState(), trade.getOutTradeNo(), 297 return OnlinePaymentResult.of(trade.getTradeId(), paymentId, response.getState(), trade.getOutTradeNo(),
300 response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage()); 298 response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage());
@@ -302,39 +300,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -302,39 +300,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
302 } 300 }
303 return new OnlinePaymentResult(trade.getTradeId(), paymentId, payment.getState(), trade.getOutTradeNo(), 301 return new OnlinePaymentResult(trade.getTradeId(), paymentId, payment.getState(), trade.getOutTradeNo(),
304 payment.getOutPayType(), payment.getPayerId(), payment.getFinishTime(), payment.getDescription()); 302 payment.getOutPayType(), payment.getPayerId(), payment.getFinishTime(), payment.getDescription());
305 - /*LOG.debug("Query online trade order[{}] state...", tradeId);  
306 - TradeOrder trade = tradeAssistantService.findByTradeId(tradeId);  
307 - List<OnlinePayment> onlinePayments = onlinePaymentDao.listOnlinePayments(tradeId, TradeType.TRADE.getCode());  
308 - if (TradeState.SUCCESS.equalTo(trade.getState()) || TradeState.REFUND.equalTo(trade.getState())) {  
309 - OnlinePayment payment = onlinePayments.stream().filter(p -> PaymentState.SUCCESS.equalTo(p.getState()))  
310 - .findFirst().orElseThrow(() -> new TradePaymentException(ErrorCode.OBJECT_NOT_FOUND, "未找到支付订单"));  
311 - return new OnlinePaymentResult(tradeId, payment.getState(), trade.getOutTradeNo(), payment.getOutPayType(),  
312 - payment.getPayerId(), payment.getFinishTime(), payment.getDescription());  
313 - } else if (TradeState.FAILED.equalTo(trade.getState()) || TradeState.CLOSED.equalTo(trade.getState())) {  
314 - return OnlinePaymentResult.of(tradeId, PaymentState.FAILED, trade.getOutTradeNo(),  
315 - null, null, LocalDateTime.now(), "等待支付");  
316 - } else { // 交易订单等待支付  
317 - // 查找交易订单中正在支付中的支付记录  
318 - OnlinePayment payment = onlinePayments.stream().filter(p -> PaymentState.PROCESSING.equalTo(p.getState()))  
319 - .findFirst().orElse(null);  
320 - if (payment == null) { // 交易订单没有支付记录  
321 - return OnlinePaymentResult.of(tradeId, PaymentState.PENDING, trade.getOutTradeNo(),  
322 - null, null, LocalDateTime.now(), "等待支付");  
323 - }  
324 - if ("online".equalsIgnoreCase(mode)) {  
325 - OnlinePrepayOrder order = new OnlinePrepayOrder(payment.getPaymentId(), payment.getOutTradeNo());  
326 - OnlinePipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), OnlinePipeline.class);  
327 - // 用于微信服务商模式下,微信子商户信息  
328 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());  
329 - OnlinePaymentResponse response = pipeline.queryPrepayResponse(order);  
330 - return OnlinePaymentResult.of(tradeId, response.getState(), trade.getOutTradeNo(),  
331 - response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage());  
332 - } else {  
333 - return new OnlinePaymentResult(tradeId, payment.getState(), trade.getOutTradeNo(), payment.getOutPayType(),  
334 - payment.getPayerId(), payment.getFinishTime(), payment.getDescription());  
335 - }  
336 -  
337 - }*/  
338 } 303 }
339 304
340 @Override 305 @Override
@@ -358,8 +323,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -358,8 +323,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
358 PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class); 323 PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class);
359 OnlineRefundRequest refundRequest = OnlineRefundRequest.of(refundId, payment.getPaymentId(), payment.getOutTradeNo(), 324 OnlineRefundRequest refundRequest = OnlineRefundRequest.of(refundId, payment.getPaymentId(), payment.getOutTradeNo(),
360 trade.getMaxAmount(), request.getAmount(), request.getDescription(), now); 325 trade.getMaxAmount(), request.getAmount(), request.getDescription(), now);
361 - // 微信支付外部商户号为微信商户号或特约子商户; 园区卡支付外部商户号为市场ID  
362 - refundRequest.put(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());  
363 OnlineRefundResponse response; 326 OnlineRefundResponse response;
364 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) { 327 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
365 response = onlinePipeline.sendRefundRequest(refundRequest); 328 response = onlinePipeline.sendRefundRequest(refundRequest);
@@ -381,6 +344,8 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -381,6 +344,8 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
381 Long newAmount = trade.getAmount() - refund.getAmount(); 344 Long newAmount = trade.getAmount() - refund.getAmount();
382 TradeStateDTO tradeState = TradeStateDTO.of(trade.getTradeId(), newAmount, TradeState.REFUND, trade.getVersion(), now); 345 TradeStateDTO tradeState = TradeStateDTO.of(trade.getTradeId(), newAmount, TradeState.REFUND, trade.getVersion(), now);
383 tradeAssistantService.proceedTradeOrder(tradeState); 346 tradeAssistantService.proceedTradeOrder(tradeState);
  347 + xx
  348 + // TODO:
384 } else if (!PaymentState.isFinished(response.getState())) { 349 } else if (!PaymentState.isFinished(response.getState())) {
385 // 固定周期后,查询退款状态,根据状态完成退款订单 350 // 固定周期后,查询退款状态,根据状态完成退款订单
386 TaskMessage message = new TaskMessage(TaskMessage.TYPE_CASHIER_REFUND_SCAN, refundId, "1"); 351 TaskMessage message = new TaskMessage(TaskMessage.TYPE_CASHIER_REFUND_SCAN, refundId, "1");
@@ -395,14 +360,14 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -395,14 +360,14 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
395 public void notifyRefundResult(OnlineRefundResponse response) { 360 public void notifyRefundResult(OnlineRefundResponse response) {
396 OnlinePayment refund = tradeAssistantService.findByRefundId(response.getRefundId()); 361 OnlinePayment refund = tradeAssistantService.findByRefundId(response.getRefundId());
397 if (PaymentState.isFinished(refund.getState())) { 362 if (PaymentState.isFinished(refund.getState())) {
398 - LOG.warn("Duplicate process online refund order notification for {}:{}", response.getRefundId(), response.getState()); 363 + LOG.warn("Duplicate process online refund order[{}:{}]", response.getRefundId(), response.getState());
399 return; 364 return;
400 } 365 }
401 if (!PaymentState.isFinished(response.getState())) { 366 if (!PaymentState.isFinished(response.getState())) {
402 - LOG.warn("Ignore online refund order notification for {}:{}", response.getRefundId(), response.getState()); 367 + LOG.warn("Ignore online refund order[{}:{}]", response.getRefundId(), response.getState());
403 return; 368 return;
404 } 369 }
405 - LOG.info("Processing online refund order notification for {}:{}", response.getRefundId(), response.getState()); 370 + LOG.info("Processing online refund order[{}:{}]", response.getRefundId(), response.getState());
406 371
407 LocalDateTime now = LocalDateTime.now(); 372 LocalDateTime now = LocalDateTime.now();
408 TradeOrder trade = tradeAssistantService.findByTradeId(refund.getTradeId()); 373 TradeOrder trade = tradeAssistantService.findByTradeId(refund.getTradeId());
@@ -429,12 +394,12 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService { @@ -429,12 +394,12 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
429 LOG.debug("Query online refund order[{}-{}] state...", refundId, refund.getState()); 394 LOG.debug("Query online refund order[{}-{}] state...", refundId, refund.getState());
430 // 微信支付通知较为及时和安全,非特殊情况可使用offline模式;一些本地状态与微信状态不一致的"异常订单"可使用online模式同步状态 395 // 微信支付通知较为及时和安全,非特殊情况可使用offline模式;一些本地状态与微信状态不一致的"异常订单"可使用online模式同步状态
431 if (!PaymentState.isFinished(refund.getState()) && "online".equalsIgnoreCase(mode)) { 396 if (!PaymentState.isFinished(refund.getState()) && "online".equalsIgnoreCase(mode)) {
432 - WechatPipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), WechatPipeline.class);  
433 - OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo());  
434 - // 用于微信服务商模式下,微信子商户信息  
435 - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, refund.getOutMchId());  
436 - OnlineRefundResponse response = pipeline.queryRefundResponse(order);  
437 - return new OnlineRefundResult(refundId, refund.getObjectId(), response.getState(), response.getWhen(), response.getMessage()); 397 + PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), PaymentPipeline.class);
  398 + if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
  399 + OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo());
  400 + OnlineRefundResponse response = onlinePipeline.queryRefundResponse(order);
  401 + return new OnlineRefundResult(refundId, refund.getObjectId(), response.getState(), response.getWhen(), response.getMessage());
  402 + }
438 } 403 }
439 return new OnlineRefundResult(refundId, refund.getObjectId(), refund.getState(), refund.getFinishTime(), refund.getDescription()); 404 return new OnlineRefundResult(refundId, refund.getObjectId(), refund.getState(), refund.getFinishTime(), refund.getDescription());
440 } 405 }