diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java index f097cdfb8..3bc1de1ab 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java @@ -290,4 +290,24 @@ public class TempController extends BaseController { } return response; } + + /** + * 重试订单退款接口 + * http://localhost:8080/temp/retryRefundOrder + */ + @PostMapping("/retryRefundOrder") + public RestApiResponse retryRefundOrder(@RequestBody ApplyRefundDTO dto) { + RestApiResponse response; + try { + orderBasicInfoService.retryRefundOrder(dto.getOrderCode()); + response = new RestApiResponse<>(); + } catch (BusinessException e) { + logger.error("重试订单退款接口 error,", e); + response = new RestApiResponse<>(e.getCode(), e.getMessage()); + } catch (Exception e) { + logger.error("重试订单退款接口 error,", e); + response = new RestApiResponse<>(e); + } + return response; + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java index c671755c9..2a44ce0f9 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java @@ -695,4 +695,23 @@ public class AdapayMemberService { log.info("汇付支付创建交易撤销对象param:{}, result:{}", JSON.toJSONString(reverseParams), jsonString); return JSONObject.parseObject(jsonString, PaymentReverseResponse.class); } + + /** + * 查询支付撤销对象 + * + * @return + */ + public List queryPaymentReverse(String paymentId, String wechatAppId) throws BaseAdaPayException { + AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); + if (config == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); + } + Map reverse = Maps.newHashMap(); + reverse.put("payment_id", paymentId); + reverse.put("app_id", config.getAdapayAppId()); + Map response = PaymentReverse.queryList(reverse, config.getWechatAppId()); + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response)); + List payment_reverses = jsonObject.getList("payment_reverses", PaymentReverse.class); + return payment_reverses; + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java index 1f8c1a184..2adafec94 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java @@ -335,4 +335,10 @@ public interface IOrderBasicInfoService { * 2. 发送启动充电指令 */ void payOrderSuccessCallback(PayOrderSuccessCallbackDTO dto); + + /** + * 重试订单退款 + * @param orderCode 订单编号 + */ + void retryRefundOrder(String orderCode) throws BaseAdaPayException; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java index 55b61bb4a..365f1f8be 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java @@ -96,4 +96,6 @@ public interface IPileMerchantInfoService { * @return */ List queryFirstLevelMerchant(); + + String queryAppIdByMerchantId(String merchantId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 75f198167..f5ff1597a 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.google.common.collect.Sets; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.Payment; import com.huifu.adapay.model.PaymentConfirm; +import com.huifu.adapay.model.PaymentReverse; import com.jsowell.adapay.common.CreateAdaPaymentParam; import com.jsowell.adapay.common.DivMember; import com.jsowell.adapay.config.AbstractAdapayConfig; @@ -2412,7 +2413,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } memberAdapayRecordService.updateByPrimaryKeySelective(record); } - } } @@ -2766,6 +2766,46 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } + @Override + public void retryRefundOrder(String orderCode) throws BaseAdaPayException { + // 查询订单信息 + OrderBasicInfo orderBasicInfo = getOrderInfoByOrderCode(orderCode); + if (orderBasicInfo == null) { + throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL); + } + // 如果该订单是订单完成状态,并且是微信支付 存在需要退款金额,则进行后续操作 + String orderStatus = orderBasicInfo.getOrderStatus(); + if (StringUtils.equals(orderStatus, OrderStatusEnum.ORDER_COMPLETE.getValue())) { + throw new BusinessException("", "订单不是完成状态"); + } + String payMode = orderBasicInfo.getPayMode(); + if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { + throw new BusinessException("", "订单不是微信支付"); + } + + // 查到原汇付支付id + AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderCode); + if (adapayCallbackRecord == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CALLBACK_IS_NULL_ERROR); + } + + // 获取appId + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); + + // 通过支付id查询退款记录 + String paymentId = adapayCallbackRecord.getPaymentId(); + String memberId = orderBasicInfo.getMemberId(); + BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); + List paymentReverses = adapayMemberService.queryPaymentReverse(paymentId, wechatAppId); + if (CollectionUtils.isEmpty(paymentReverses)) { + // 如果没有退款过,重新执行一遍退款 + PaymentReverseResponse response = adapayMemberService.createPaymentReverseRequest( + paymentId, refundAmount, wechatAppId, memberId, ScenarioEnum.ORDER.getValue(), + orderCode); + } + + } + /** * 使用汇付支付 * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java index c35d110fc..2a057d639 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java @@ -344,6 +344,7 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService { /** * 通过merchantId查询appId */ + @Override public String queryAppIdByMerchantId(String merchantId) { /* 一般情况下新建的运营商appId都是有值的,某些早前建的运营商appId可能为空