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 35 private final Long pipelineId;
36 36 // 支付渠道
37 37 private final Integer channelId;
38   -
  38 + // 支付渠道名称
39 39 private final String channelName;
40 40  
41 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 65 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
66 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 68 OnlinePaymentResponse response = onlinePipeline.queryPrepayResponse(order);
70 69 if (!PaymentState.isFinished(response.getState().getCode())) {
71 70 try {
... ... @@ -105,8 +104,6 @@ public class CashierAssistantServiceImpl implements ICashierAssistantService {
105 104  
106 105 OnlinePipeline<?> pipeline = paymentPipelineManager.findPipelineById(refund.getPipelineId(), OnlinePipeline.class);
107 106 OnlineRefundOrder order = new OnlineRefundOrder(refundId, refund.getOutTradeNo());
108   - // 微信服务商模式,还需子商户
109   - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, refund.getOutMchId());
110 107 OnlineRefundResponse response = pipeline.queryRefundResponse(order);
111 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 139 // 小程序收银台将使用在线支付通道的小程序支付
140 140 MiniProPrepayRequest request = new MiniProPaymentConverter(trade, paymentId, now).convert(cashierPayment);
141 141 MiniProPrepayResponse response = onlinePipeline.sendMiniProPrepayRequest(request);
142   - // 微信服务商模式下outMchId为签约子商户
143 142 String outMchId = request.getString(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID);
144 143 OnlinePayment payment = OnlinePayment.builder().outMchId(outMchId).tradeId(trade.getTradeId())
145 144 .type(TradeType.TRADE).paymentId(paymentId).channelId(onlinePipeline.supportedChannel())
... ... @@ -210,6 +209,7 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
210 209  
211 210 if (PaymentState.isFinished(response.getState().getCode())) {
212 211 LocalDateTime now = LocalDateTime.now();
  212 + OnlinePaymentResult paymentResult = null;
213 213 String lockKey = String.format(Constants.TRADE_LOCK_REDIS_KEY, payment.getTradeId());
214 214 RLock lock = redissonClient.getLock(lockKey);
215 215 try {
... ... @@ -225,17 +225,20 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
225 225 if (PaymentState.SUCCESS == response.getState() && TradeState.PENDING.equalTo(trade.getState())) {
226 226 TradeStateDTO tradeStateDTO = TradeStateDTO.of(trade.getTradeId(), TradeState.SUCCESS, trade.getVersion(), now);
227 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 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 233 } finally {
235 234 if (lock.isHeldByCurrentThread()) {
236 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 256 lock.lock();
254 257  
255 258 LocalDateTime now = LocalDateTime.now();
256   - TradeOrder trade = tradeAssistantService.findByTradeId(payment.getTradeId());
  259 +// TradeOrder trade = tradeAssistantService.findByTradeId(payment.getTradeId());
257 260 PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class);
258 261 // 只有在线支付通道才可以关闭支付订单,园区卡支付不支持
259 262 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
260 263 OnlinePrepayOrder order = new OnlinePrepayOrder(paymentId, payment.getOutTradeNo());
261   - // 用于微信服务商模式下,微信子商户信息
262   - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());
263 264 onlinePipeline.closePrepayOrder(order);
264 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 267 .description("人工关闭支付订单").version(payment.getVersion()).modifiedTime(now).build();
267 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 274 } finally {
273 275 if (lock.isHeldByCurrentThread()) {
... ... @@ -287,14 +289,10 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
287 289 OnlinePrepayOrder order = new OnlinePrepayOrder(paymentId, payment.getOutTradeNo());
288 290 PaymentPipeline<?> paymentPipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class);
289 291 if (paymentPipeline instanceof OnlinePipeline<?> pipeline) {
290   - // 用于微信服务商模式下,微信子商户信息
291   - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());
292 292 OnlinePaymentResponse response = pipeline.queryPrepayResponse(order);
293 293 return OnlinePaymentResult.of(trade.getTradeId(), paymentId, response.getState(), trade.getOutTradeNo(),
294 294 response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage());
295 295 } else if (paymentPipeline instanceof DiliCardPipeline pipeline) {
296   - // 园区卡支付outMchId为市场ID
297   - order.attach(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());
298 296 CardPaymentResponse response = pipeline.queryPaymentResponse(order);
299 297 return OnlinePaymentResult.of(trade.getTradeId(), paymentId, response.getState(), trade.getOutTradeNo(),
300 298 response.getOutPayType(), response.getPayerId(), response.getWhen(), response.getMessage());
... ... @@ -302,39 +300,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
302 300 }
303 301 return new OnlinePaymentResult(trade.getTradeId(), paymentId, payment.getState(), trade.getOutTradeNo(),
304 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 305 @Override
... ... @@ -358,8 +323,6 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
358 323 PaymentPipeline<?> pipeline = paymentPipelineManager.findPipelineById(payment.getPipelineId(), PaymentPipeline.class);
359 324 OnlineRefundRequest refundRequest = OnlineRefundRequest.of(refundId, payment.getPaymentId(), payment.getOutTradeNo(),
360 325 trade.getMaxAmount(), request.getAmount(), request.getDescription(), now);
361   - // 微信支付外部商户号为微信商户号或特约子商户; 园区卡支付外部商户号为市场ID
362   - refundRequest.put(com.diligrp.cashier.pipeline.Constants.PARAM_MCH_ID, payment.getOutMchId());
363 326 OnlineRefundResponse response;
364 327 if (pipeline instanceof OnlinePipeline<?> onlinePipeline) {
365 328 response = onlinePipeline.sendRefundRequest(refundRequest);
... ... @@ -381,6 +344,8 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
381 344 Long newAmount = trade.getAmount() - refund.getAmount();
382 345 TradeStateDTO tradeState = TradeStateDTO.of(trade.getTradeId(), newAmount, TradeState.REFUND, trade.getVersion(), now);
383 346 tradeAssistantService.proceedTradeOrder(tradeState);
  347 + xx
  348 + // TODO:
384 349 } else if (!PaymentState.isFinished(response.getState())) {
385 350 // 固定周期后,查询退款状态,根据状态完成退款订单
386 351 TaskMessage message = new TaskMessage(TaskMessage.TYPE_CASHIER_REFUND_SCAN, refundId, "1");
... ... @@ -395,14 +360,14 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
395 360 public void notifyRefundResult(OnlineRefundResponse response) {
396 361 OnlinePayment refund = tradeAssistantService.findByRefundId(response.getRefundId());
397 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 364 return;
400 365 }
401 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 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 372 LocalDateTime now = LocalDateTime.now();
408 373 TradeOrder trade = tradeAssistantService.findByTradeId(refund.getTradeId());
... ... @@ -429,12 +394,12 @@ public class CashierPaymentServiceImpl implements ICashierPaymentService {
429 394 LOG.debug("Query online refund order[{}-{}] state...", refundId, refund.getState());
430 395 // 微信支付通知较为及时和安全,非特殊情况可使用offline模式;一些本地状态与微信状态不一致的"异常订单"可使用online模式同步状态
431 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 404 return new OnlineRefundResult(refundId, refund.getObjectId(), refund.getState(), refund.getFinishTime(), refund.getDescription());
440 405 }
... ...