| | |
| | | } |
| | | |
| | | /** |
| | | * 获取第三方实付金额,兼容早期未写入third_pay_amount的纯第三方支付订单。 |
| | | * |
| | | * @param order 充电订单 |
| | | * @return 第三方可退款本金 |
| | | */ |
| | | private BigDecimal getRefundableThirdPayAmount(TChargingOrder order) { |
| | | if (order == null || isWhitelistAllFreeOrder(order)) { |
| | | return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | BigDecimal thirdPayAmount = money(order.getThirdPayAmount()); |
| | | if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | return thirdPayAmount; |
| | | } |
| | | if (Integer.valueOf(3).equals(order.getPayMethod())) { |
| | | return money(order.getRechargeAmount()); |
| | | } |
| | | return thirdPayAmount; |
| | | } |
| | | |
| | | /** |
| | | * 调整用户余额 |
| | | * |
| | | * @param userId 用户ID |
| | |
| | | // 白名单全部免费启动失败同样只记录预估金额,避免未支付订单进入实际退款流程。 |
| | | BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? rechargeAmount : totalRefundAmount; |
| | | BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : totalRefundAmount; |
| | | BigDecimal thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal thirdRefundAmount = channelRefundAmount.min(getRefundableThirdPayAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | //构建退款明细 |
| | | TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); |
| | |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); |
| | |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); |
| | |
| | | Integer payMethod = chargingOrder.getPayMethod(); |
| | | BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal refundableAmount = money(chargingOrder.getThirdPayAmount()).add(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal refundableThirdPayAmount = getRefundableThirdPayAmount(chargingOrder); |
| | | BigDecimal refundableAmount = refundableThirdPayAmount.add(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | // 全部免费订单启动时未拉起支付,渠道可退金额固定为0,避免误触发微信/支付宝/余额退款。 |
| | | BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder) |
| | | ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) |
| | |
| | | if (Integer.valueOf(1).equals(payMethod)) { |
| | | balanceRefundAmount = channelRefundAmount.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | } else if (Integer.valueOf(2).equals(payMethod)) { |
| | | thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP); |
| | | balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | } else { |
| | | thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP); |
| | | thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount); |
| | | BigDecimal actualThirdPayAmount = refundableThirdPayAmount.subtract(thirdRefundAmount); |
| | | if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | actualThirdPayAmount = BigDecimal.ZERO; |
| | | } |
| | |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model); |
| | |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(tChargingOrder.getPayMethod()) ? money(tChargingOrder.getThirdPayAmount()) : money(tChargingOrder.getRechargeAmount())).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); |