Commit 78c0b05ed5a59b33f6e61540eab23a19baca8386
1 parent
3ab3cdfd
upgrade after testing
Showing
3 changed files
with
25 additions
and
63 deletions
cashier-boss/src/main/java/com/diligrp/cashier/boss/domain/CashierOrderVO.java
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 | } | ... | ... |