diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 60a595286..eff919327 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -245,6 +245,16 @@ public class SpringBootTestController { @Autowired private MemberWalletInfoService memberWalletInfoService; + @Test + public void queryPaymentRefundTest() { + String paymentId = "002212023122615542010585629628950949888"; + try { + adapayService.queryPaymentRefund(paymentId, wechatAppId2); + } catch (BaseAdaPayException e) { + throw new RuntimeException(e); + } + } + @Test public void selectByMemberWalletListTest() { String memberId = "12345678"; diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/common/RefundInfo.java b/jsowell-pile/src/main/java/com/jsowell/adapay/common/RefundInfo.java new file mode 100644 index 000000000..33be21a61 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/common/RefundInfo.java @@ -0,0 +1,43 @@ +package com.jsowell.adapay.common; + +import lombok.*; + +/** + * 退款对象 + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class RefundInfo { + /** + * Adapay生成的退款对象id + */ + private String refund_id; + + /** + * 退款状态:I-初始,P-处理中,F-失败,S-成功 + */ + private String trans_status; + + /** + * Adapay生成的支付对象id + */ + private String payment_id; + + /** + * 退款金额 + */ + private String refund_amt; + + /** + * 退款手续费,退款成功时有值 + */ + private String fee_amt; + + /** + * 退款订单号 + */ + private String refund_order_no; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/response/PaymentRefundResponse.java b/jsowell-pile/src/main/java/com/jsowell/adapay/response/PaymentRefundResponse.java new file mode 100644 index 000000000..778964251 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/response/PaymentRefundResponse.java @@ -0,0 +1,31 @@ +package com.jsowell.adapay.response; + +import com.jsowell.adapay.common.RefundInfo; +import lombok.*; + +import java.util.List; + +/** + * 查询退款对象response + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PaymentRefundResponse extends AdapayBaseResponse{ + /** + * 是否 prod模式,true 是 prod模式,false 是 mock模式 + */ + private String prod_mode; + + /** + * 退款对象列表,若未查询到结果时,字段为空 + */ + private List refunds; + + /** + * 当发生参数错误时返回具体的参数名,便于定位错误原因,详见 错误 + */ + private String invalid_param; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index 63dc92a78..320304aae 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -12,6 +12,7 @@ import com.huifu.adapay.model.*; import com.jsowell.adapay.common.AdaPayment; import com.jsowell.adapay.common.CreateAdaPaymentParam; import com.jsowell.adapay.common.DivMember; +import com.jsowell.adapay.common.RefundInfo; import com.jsowell.adapay.config.AbstractAdapayConfig; import com.jsowell.adapay.dto.*; import com.jsowell.adapay.factory.AdapayConfigFactory; @@ -1030,6 +1031,23 @@ public class AdapayService { return payment_reverses; } + /** + * 查询支付退款对象 + */ + public List queryPaymentRefund(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 refundParams = Maps.newHashMap(); + refundParams.put("payment_id", paymentId); + refundParams.put("app_id", config.getAdapayAppId()); + Map response = Refund.query(refundParams, config.getWechatAppId()); + PaymentRefundResponse paymentRefundResponse = JSON.parseObject(JSON.toJSONString(response), PaymentRefundResponse.class); + List refunds = paymentRefundResponse.getRefunds(); + return refunds; + } + /** * 查询支付确认对象列表 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index 2e7b4525a..6c3984e51 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -25,6 +25,7 @@ import com.jsowell.pile.transaction.service.TransactionService; import com.jsowell.pile.vo.uniapp.PileConnectorDetailVO; import com.jsowell.pile.vo.web.BalanceDeductionAmountVO; import com.jsowell.pile.vo.web.BillingTemplateVO; +import com.jsowell.pile.vo.web.OrderDetailInfoVO; import com.jsowell.pile.vo.web.PileStationVO; import com.jsowell.wxpay.service.WxAppletRemoteService; import org.apache.commons.collections4.CollectionUtils; @@ -156,6 +157,11 @@ public abstract class AbstractProgramLogic implements InitializingBean { */ public abstract void refundBalance(ApplyRefundDTO dto); + /** + * 查询退款信息 + */ + public abstract List getOrderRefundInfoList(OrderBasicInfo orderBasicInfo); + /** * 订单支付成功 支付回调 * 支付成功后掉用这个方法 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 973b7a3a3..4c61e549d 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -31,14 +31,17 @@ import com.jsowell.pile.dto.*; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.web.BalanceDeductionAmountVO; +import com.jsowell.pile.vo.web.OrderDetailInfoVO; import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; import com.jsowell.wxpay.dto.WechatSendMsgDTO; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.cglib.beans.BeanMap; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.ParseException; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; @@ -618,6 +621,46 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { } } + @Override + public List getOrderRefundInfoList(OrderBasicInfo orderBasicInfo) { + List resultList = Lists.newArrayList(); + + // 查到原汇付支付id + AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderBasicInfo.getOrderCode()); + if (adapayCallbackRecord == null) { + return resultList; + } + + // 获取appId + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); + + // 通过支付id查询退款记录 + String paymentId = adapayCallbackRecord.getPaymentId(); + List paymentReverseResponses = null; + try { + paymentReverseResponses = adapayService.queryPaymentReverse(paymentId, wechatAppId); + } catch (BaseAdaPayException e) { + logger.error("查询支付撤销对象发生异常", e); + } + + OrderDetailInfoVO.OrderRefundInfo refundInfo; + if (CollectionUtils.isNotEmpty(paymentReverseResponses)) { + for (PaymentReverseResponse reverseResponse : paymentReverseResponses) { + refundInfo = new OrderDetailInfoVO.OrderRefundInfo(); + refundInfo.setReverseId(reverseResponse.getId()); + refundInfo.setPaymentId(reverseResponse.getPayment_id()); + refundInfo.setReverseAmt(reverseResponse.getReverse_amt()); + LocalDateTime createdTime = DateUtils.timestampToDatetime(Long.parseLong(reverseResponse.getCreated_time())); + refundInfo.setCreatedTime(DateUtils.formatDateTime(createdTime)); + LocalDateTime succeedTime = DateUtils.timestampToDatetime(Long.parseLong(reverseResponse.getSucceed_time())); + refundInfo.setSucceedTime(DateUtils.formatDateTime(succeedTime)); + resultList.add(refundInfo); + } + } + return resultList; + } + + /** * 余额支付订单退款 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 77d7b3484..f066f8319 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -11,6 +11,7 @@ import com.huifu.adapay.model.Payment; import com.jsowell.adapay.common.CreateAdaPaymentParam; import com.jsowell.adapay.config.AbstractAdapayConfig; import com.jsowell.adapay.factory.AdapayConfigFactory; +import com.jsowell.adapay.response.PaymentReverseResponse; import com.jsowell.adapay.response.RefundResponse; import com.jsowell.adapay.vo.PaymentInfo; import com.jsowell.common.constant.CacheConstants; @@ -23,6 +24,7 @@ import com.jsowell.common.enums.adapay.MerchantDelayModeEnum; import com.jsowell.common.enums.ykc.*; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.AdapayUtil; +import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.SnowflakeIdWorker; import com.jsowell.pile.domain.*; @@ -30,14 +32,17 @@ import com.jsowell.pile.dto.*; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.web.BalanceDeductionAmountVO; +import com.jsowell.pile.vo.web.OrderDetailInfoVO; import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; import com.jsowell.wxpay.dto.WechatSendMsgDTO; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.cglib.beans.BeanMap; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.ParseException; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; @@ -522,6 +527,45 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { } } + @Override + public List getOrderRefundInfoList(OrderBasicInfo orderBasicInfo) { + List resultList = Lists.newArrayList(); + + // 查到原汇付支付id + AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderBasicInfo.getOrderCode()); + if (adapayCallbackRecord == null) { + return resultList; + } + + // 获取appId + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); + + // 通过支付id查询退款记录 + String paymentId = adapayCallbackRecord.getPaymentId(); + List paymentReverseResponses = null; + try { + paymentReverseResponses = adapayService.queryPaymentReverse(paymentId, wechatAppId); + } catch (BaseAdaPayException e) { + logger.error("查询支付撤销对象发生异常", e); + } + + OrderDetailInfoVO.OrderRefundInfo refundInfo; + if (CollectionUtils.isNotEmpty(paymentReverseResponses)) { + for (PaymentReverseResponse reverseResponse : paymentReverseResponses) { + refundInfo = new OrderDetailInfoVO.OrderRefundInfo(); + refundInfo.setReverseId(reverseResponse.getId()); + refundInfo.setPaymentId(reverseResponse.getPayment_id()); + refundInfo.setReverseAmt(reverseResponse.getReverse_amt()); + LocalDateTime createdTime = DateUtils.timestampToDatetime(Long.parseLong(reverseResponse.getCreated_time())); + refundInfo.setCreatedTime(DateUtils.formatDateTime(createdTime)); + LocalDateTime succeedTime = DateUtils.timestampToDatetime(Long.parseLong(reverseResponse.getSucceed_time())); + refundInfo.setSucceedTime(DateUtils.formatDateTime(succeedTime)); + resultList.add(refundInfo); + } + } + return resultList; + } + // uniApp 发送停止充电订阅消息 private void sendMsg(OrderBasicInfo orderBasicInfo) { try {