Commit 3bde43b148faf4e95bdc655cf65c0ceed178d8bc
1 parent
57a934ae
【功能优化】支付:钱包充值的支付回调,增加“已支付”情况下的防重处理
Showing
2 changed files
with
54 additions
and
45 deletions
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoOrderServiceImpl.java
| @@ -115,18 +115,19 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { | @@ -115,18 +115,19 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { | ||
| 115 | // 1.1 校验订单是否存在 | 115 | // 1.1 校验订单是否存在 |
| 116 | PayDemoOrderDO order = payDemoOrderMapper.selectById(id); | 116 | PayDemoOrderDO order = payDemoOrderMapper.selectById(id); |
| 117 | if (order == null) { | 117 | if (order == null) { |
| 118 | + log.error("[updateDemoOrderPaid][order({}) payOrder({}) 不存在订单,请进行处理!]", id, payOrderId); | ||
| 118 | throw exception(DEMO_ORDER_NOT_FOUND); | 119 | throw exception(DEMO_ORDER_NOT_FOUND); |
| 119 | } | 120 | } |
| 120 | // 1.2 校验订单已支付 | 121 | // 1.2 校验订单已支付 |
| 121 | if (order.getPayStatus()) { | 122 | if (order.getPayStatus()) { |
| 122 | // 特殊:如果订单已支付,且支付单号相同,直接返回,说明重复回调 | 123 | // 特殊:如果订单已支付,且支付单号相同,直接返回,说明重复回调 |
| 123 | if (ObjectUtil.equals(order.getPayOrderId(), payOrderId)) { | 124 | if (ObjectUtil.equals(order.getPayOrderId(), payOrderId)) { |
| 124 | - log.warn("[updateDemoOrderPaid][order({}) 已支付,且支付单号相同({}),直接返回]", id, payOrderId); | 125 | + log.warn("[updateDemoOrderPaid][order({}) 已支付,且支付单号相同({}),直接返回]", order, payOrderId); |
| 125 | return; | 126 | return; |
| 126 | } | 127 | } |
| 127 | // 异常:支付单号不同,说明支付单号错误 | 128 | // 异常:支付单号不同,说明支付单号错误 |
| 128 | log.error("[updateDemoOrderPaid][order({}) 支付单不匹配({}),请进行处理!order 数据是:{}]", | 129 | log.error("[updateDemoOrderPaid][order({}) 支付单不匹配({}),请进行处理!order 数据是:{}]", |
| 129 | - id, payOrderId, toJsonString(order)); | 130 | + order, payOrderId, toJsonString(order)); |
| 130 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); | 131 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); |
| 131 | } | 132 | } |
| 132 | 133 | ||
| @@ -153,24 +154,24 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { | @@ -153,24 +154,24 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { | ||
| 153 | // 1. 校验支付单是否存在 | 154 | // 1. 校验支付单是否存在 |
| 154 | PayOrderRespDTO payOrder = payOrderApi.getOrder(payOrderId); | 155 | PayOrderRespDTO payOrder = payOrderApi.getOrder(payOrderId); |
| 155 | if (payOrder == null) { | 156 | if (payOrder == null) { |
| 156 | - log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 不存在,请进行处理!]", order, payOrderId); | 157 | + log.error("[validatePayOrderPaid][order({}) payOrder({}) 不存在,请进行处理!]", order, payOrderId); |
| 157 | throw exception(PAY_ORDER_NOT_FOUND); | 158 | throw exception(PAY_ORDER_NOT_FOUND); |
| 158 | } | 159 | } |
| 159 | // 2.1 校验支付单已支付 | 160 | // 2.1 校验支付单已支付 |
| 160 | if (!PayOrderStatusEnum.isSuccess(payOrder.getStatus())) { | 161 | if (!PayOrderStatusEnum.isSuccess(payOrder.getStatus())) { |
| 161 | - log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 未支付,请进行处理!payOrder 数据是:{}]", | 162 | + log.error("[validatePayOrderPaid][order({}) payOrder({}) 未支付,请进行处理!payOrder 数据是:{}]", |
| 162 | order, payOrderId, toJsonString(payOrder)); | 163 | order, payOrderId, toJsonString(payOrder)); |
| 163 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS); | 164 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS); |
| 164 | } | 165 | } |
| 165 | // 2.1 校验支付金额一致 | 166 | // 2.1 校验支付金额一致 |
| 166 | if (notEqual(payOrder.getPrice(), order.getPrice())) { | 167 | if (notEqual(payOrder.getPrice(), order.getPrice())) { |
| 167 | - log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]", | 168 | + log.error("[validatePayOrderPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]", |
| 168 | order, payOrderId, toJsonString(order), toJsonString(payOrder)); | 169 | order, payOrderId, toJsonString(order), toJsonString(payOrder)); |
| 169 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH); | 170 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH); |
| 170 | } | 171 | } |
| 171 | // 2.2 校验支付订单匹配(二次) | 172 | // 2.2 校验支付订单匹配(二次) |
| 172 | if (notEqual(payOrder.getMerchantOrderId(), order.getId().toString())) { | 173 | if (notEqual(payOrder.getMerchantOrderId(), order.getId().toString())) { |
| 173 | - log.error("[validateDemoOrderCanPaid][order({}) 支付单不匹配({}),请进行处理!payOrder 数据是:{}]", | 174 | + log.error("[validatePayOrderPaid][order({}) 支付单不匹配({}),请进行处理!payOrder 数据是:{}]", |
| 174 | order, payOrderId, toJsonString(payOrder)); | 175 | order, payOrderId, toJsonString(payOrder)); |
| 175 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); | 176 | throw exception(DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR); |
| 176 | } | 177 | } |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.wallet; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.wallet; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.date.LocalDateTimeUtil; | 3 | import cn.hutool.core.date.LocalDateTimeUtil; |
| 4 | import cn.hutool.core.lang.Assert; | 4 | import cn.hutool.core.lang.Assert; |
| 5 | +import cn.hutool.core.util.ObjectUtil; | ||
| 5 | import cn.hutool.extra.spring.SpringUtil; | 6 | import cn.hutool.extra.spring.SpringUtil; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageParam; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 8 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| @@ -113,16 +114,28 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { | @@ -113,16 +114,28 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { | ||
| 113 | @Override | 114 | @Override |
| 114 | @Transactional(rollbackFor = Exception.class) | 115 | @Transactional(rollbackFor = Exception.class) |
| 115 | public void updateWalletRechargerPaid(Long id, Long payOrderId) { | 116 | public void updateWalletRechargerPaid(Long id, Long payOrderId) { |
| 116 | - // 1.1 获取钱包充值记录 | ||
| 117 | - PayWalletRechargeDO walletRecharge = walletRechargeMapper.selectById(id); | ||
| 118 | - if (walletRecharge == null) { | ||
| 119 | - log.error("[updateWalletRechargerPaid][钱包充值记录不存在,钱包充值记录 id({})]", id); | 117 | + // 1.1 校验钱包充值是否存在 |
| 118 | + PayWalletRechargeDO recharge = walletRechargeMapper.selectById(id); | ||
| 119 | + if (recharge == null) { | ||
| 120 | + log.error("[updateWalletRechargerPaid][recharge({}) payOrder({}) 不存在充值订单,请进行处理!]", id, payOrderId); | ||
| 120 | throw exception(WALLET_RECHARGE_NOT_FOUND); | 121 | throw exception(WALLET_RECHARGE_NOT_FOUND); |
| 121 | } | 122 | } |
| 122 | // 1.2 校验钱包充值是否可以支付 | 123 | // 1.2 校验钱包充值是否可以支付 |
| 123 | - PayOrderDO payOrderDO = validateWalletRechargerCanPaid(walletRecharge, payOrderId); | 124 | + if (recharge.getPayStatus()) { |
| 125 | + // 特殊:如果订单已支付,且支付单号相同,直接返回,说明重复回调 | ||
| 126 | + if (ObjectUtil.equals(recharge.getPayOrderId(), payOrderId)) { | ||
| 127 | + log.warn("[updateWalletRechargerPaid][recharge({}) 已支付,且支付单号相同({}),直接返回]", recharge, payOrderId); | ||
| 128 | + return; | ||
| 129 | + } | ||
| 130 | + // 异常:支付单号不同,说明支付单号错误 | ||
| 131 | + log.error("[updateWalletRechargerPaid][recharge({}) 已支付,但是支付单号不同({}),请进行处理!]", recharge, payOrderId); | ||
| 132 | + throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_ORDER_ID_ERROR); | ||
| 133 | + } | ||
| 124 | 134 | ||
| 125 | - // 2. 更新钱包充值的支付状态 | 135 | + // 2. 校验支付订单的合法性 |
| 136 | + PayOrderDO payOrderDO = validatePayOrderPaid(recharge, payOrderId); | ||
| 137 | + | ||
| 138 | + // 3. 更新钱包充值的支付状态 | ||
| 126 | int updateCount = walletRechargeMapper.updateByIdAndPaid(id, false, | 139 | int updateCount = walletRechargeMapper.updateByIdAndPaid(id, false, |
| 127 | new PayWalletRechargeDO().setId(id).setPayStatus(true).setPayTime(LocalDateTime.now()) | 140 | new PayWalletRechargeDO().setId(id).setPayStatus(true).setPayTime(LocalDateTime.now()) |
| 128 | .setPayChannelCode(payOrderDO.getChannelCode())); | 141 | .setPayChannelCode(payOrderDO.getChannelCode())); |
| @@ -130,14 +143,14 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { | @@ -130,14 +143,14 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { | ||
| 130 | throw exception(WALLET_RECHARGE_UPDATE_PAID_STATUS_NOT_UNPAID); | 143 | throw exception(WALLET_RECHARGE_UPDATE_PAID_STATUS_NOT_UNPAID); |
| 131 | } | 144 | } |
| 132 | 145 | ||
| 133 | - // 3. 更新钱包余额 | 146 | + // 4. 更新钱包余额 |
| 134 | // TODO @jason:这样的话,未来提现会不会把充值的,也提现走哈。类似先充 100,送 110;然后提现 110; | 147 | // TODO @jason:这样的话,未来提现会不会把充值的,也提现走哈。类似先充 100,送 110;然后提现 110; |
| 135 | // TODO 需要钱包中加个可提现余额 | 148 | // TODO 需要钱包中加个可提现余额 |
| 136 | - payWalletService.addWalletBalance(walletRecharge.getWalletId(), String.valueOf(id), | ||
| 137 | - PayWalletBizTypeEnum.RECHARGE, walletRecharge.getTotalPrice()); | 149 | + payWalletService.addWalletBalance(recharge.getWalletId(), String.valueOf(id), |
| 150 | + PayWalletBizTypeEnum.RECHARGE, recharge.getTotalPrice()); | ||
| 138 | 151 | ||
| 139 | - // 4. 发送订阅消息 | ||
| 140 | - getSelf().sendWalletRechargerPaidMessage(payOrderId, walletRecharge); | 152 | + // 5. 发送订阅消息 |
| 153 | + getSelf().sendWalletRechargerPaidMessage(payOrderId, recharge); | ||
| 141 | } | 154 | } |
| 142 | 155 | ||
| 143 | @Async | 156 | @Async |
| @@ -267,43 +280,38 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { | @@ -267,43 +280,38 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { | ||
| 267 | return wallet; | 280 | return wallet; |
| 268 | } | 281 | } |
| 269 | 282 | ||
| 270 | - private PayOrderDO validateWalletRechargerCanPaid(PayWalletRechargeDO walletRecharge, Long payOrderId) { | ||
| 271 | - // 1.1 校验充值记录的支付状态 | ||
| 272 | - if (walletRecharge.getPayStatus()) { | ||
| 273 | - log.error("[validateWalletRechargerCanPaid][钱包({}) 不处于未支付状态! 钱包数据是:{}]", | ||
| 274 | - walletRecharge.getId(), toJsonString(walletRecharge)); | ||
| 275 | - throw exception(WALLET_RECHARGE_UPDATE_PAID_STATUS_NOT_UNPAID); | ||
| 276 | - } | ||
| 277 | - // 1.2 校验支付订单匹配 | ||
| 278 | - if (notEqual(walletRecharge.getPayOrderId(), payOrderId)) { // 支付单号 | ||
| 279 | - log.error("[validateWalletRechargerCanPaid][钱包({}) 支付单不匹配({}),请进行处理! 钱包数据是:{}]", | ||
| 280 | - walletRecharge.getId(), payOrderId, toJsonString(walletRecharge)); | ||
| 281 | - throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_ORDER_ID_ERROR); | ||
| 282 | - } | ||
| 283 | - | ||
| 284 | - // 2.1 校验支付单是否存在 | 283 | + /** |
| 284 | + * 校验支付订单的合法性 | ||
| 285 | + * | ||
| 286 | + * @param recharge 充值订单 | ||
| 287 | + * @param payOrderId 支付订单编号 | ||
| 288 | + * @return 支付订单 | ||
| 289 | + */ | ||
| 290 | + private PayOrderDO validatePayOrderPaid(PayWalletRechargeDO recharge, Long payOrderId) { | ||
| 291 | + // 1. 校验支付单是否存在 | ||
| 285 | PayOrderDO payOrder = payOrderService.getOrder(payOrderId); | 292 | PayOrderDO payOrder = payOrderService.getOrder(payOrderId); |
| 286 | if (payOrder == null) { | 293 | if (payOrder == null) { |
| 287 | - log.error("[validateWalletRechargerCanPaid][钱包({}) payOrder({}) 不存在,请进行处理!]", | ||
| 288 | - walletRecharge.getId(), payOrderId); | 294 | + log.error("[validatePayOrderPaid][充值订单({}) payOrder({}) 不存在,请进行处理!]", |
| 295 | + recharge, payOrderId); | ||
| 289 | throw exception(PAY_ORDER_NOT_FOUND); | 296 | throw exception(PAY_ORDER_NOT_FOUND); |
| 290 | } | 297 | } |
| 291 | - // 2.2 校验支付单已支付 | 298 | + |
| 299 | + // 2.1 校验支付单已支付 | ||
| 292 | if (!PayOrderStatusEnum.isSuccess(payOrder.getStatus())) { | 300 | if (!PayOrderStatusEnum.isSuccess(payOrder.getStatus())) { |
| 293 | - log.error("[validateWalletRechargerCanPaid][钱包({}) payOrder({}) 未支付,请进行处理!payOrder 数据是:{}]", | ||
| 294 | - walletRecharge.getId(), payOrderId, toJsonString(payOrder)); | 301 | + log.error("[validatePayOrderPaid][充值订单({}) payOrder({}) 未支付,请进行处理!payOrder 数据是:{}]", |
| 302 | + recharge, payOrderId, toJsonString(payOrder)); | ||
| 295 | throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_ORDER_STATUS_NOT_SUCCESS); | 303 | throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_ORDER_STATUS_NOT_SUCCESS); |
| 296 | } | 304 | } |
| 297 | - // 2.3 校验支付金额一致 | ||
| 298 | - if (notEqual(payOrder.getPrice(), walletRecharge.getPayPrice())) { | ||
| 299 | - log.error("[validateDemoOrderCanPaid][钱包({}) payOrder({}) 支付金额不匹配,请进行处理!钱包 数据是:{},payOrder 数据是:{}]", | ||
| 300 | - walletRecharge.getId(), payOrderId, toJsonString(walletRecharge), toJsonString(payOrder)); | 305 | + // 2.2 校验支付金额一致 |
| 306 | + if (notEqual(payOrder.getPrice(), recharge.getPayPrice())) { | ||
| 307 | + log.error("[validatePayOrderPaid][充值订单({}) payOrder({}) 支付金额不匹配,请进行处理!钱包 数据是:{},payOrder 数据是:{}]", | ||
| 308 | + recharge, payOrderId, toJsonString(recharge), toJsonString(payOrder)); | ||
| 301 | throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_PRICE_NOT_MATCH); | 309 | throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_PRICE_NOT_MATCH); |
| 302 | } | 310 | } |
| 303 | - // 2.4 校验支付订单的商户订单匹配 | ||
| 304 | - if (notEqual(payOrder.getMerchantOrderId(), walletRecharge.getId().toString())) { | ||
| 305 | - log.error("[validateDemoOrderCanPaid][钱包({}) 支付单不匹配({}),请进行处理!payOrder 数据是:{}]", | ||
| 306 | - walletRecharge.getId(), payOrderId, toJsonString(payOrder)); | 311 | + // 2.3 校验支付订单的商户订单匹配 |
| 312 | + if (notEqual(payOrder.getMerchantOrderId(), recharge.getId().toString())) { | ||
| 313 | + log.error("[validatePayOrderPaid][充值订单({}) 支付单不匹配({}),请进行处理!payOrder 数据是:{}]", | ||
| 314 | + recharge, payOrderId, toJsonString(payOrder)); | ||
| 307 | throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_ORDER_ID_ERROR); | 315 | throw exception(WALLET_RECHARGE_UPDATE_PAID_PAY_ORDER_ID_ERROR); |
| 308 | } | 316 | } |
| 309 | return payOrder; | 317 | return payOrder; |