From e7433b76f237a1264e13505a1ef5992f2aa10571 Mon Sep 17 00:00:00 2001 From: yang_shj Date: Mon, 14 Mar 2022 15:47:29 +0800 Subject: [PATCH] =?UTF-8?q?feat=200=20=E6=94=AF=E4=BB=98=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/base/springcloud/bo/RefundBO.java | 3 + .../springcloud/constant/ErrorConstant.java | 5 +- .../springcloud/constant/PaymentConstant.java | 7 +- .../base/springcloud/dao/RefundMapper.java | 8 +++ .../com/base/springcloud/entity/Refund.java | 2 + .../springcloud/service/RefundService.java | 6 ++ .../service/WecPaymentService.java | 7 ++ .../service/imp/PaymentServiceImp.java | 15 ++--- .../service/imp/RefundServiceImp.java | 65 ++++++++++++++++++- .../service/imp/WecPaymentServiceImp.java | 20 ++++-- .../base/springcloud/wxsdk/WxpayUtils.java | 18 +++-- .../com/base/payment/mapper/RefundMapper.xml | 24 ++++++- 12 files changed, 151 insertions(+), 29 deletions(-) diff --git a/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java b/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java index eea8ff2..2854cd8 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java +++ b/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java @@ -11,6 +11,9 @@ import java.util.Date; @Data public class RefundBO extends MchConfigEntity implements Serializable { + // 退款订单Id + private String refundId; + // 创建人 private String createId; diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java b/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java index 867acfd..54ee31a 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java +++ b/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java @@ -23,8 +23,9 @@ public enum ErrorConstant { REGISTER_REFUND_FAIL("RBS00018","退款订单登记失败!"), SYNC_WEC_REFUND_STATE_FAIL("RBS00019","同步微信退款状态失败!"), BILL_COMPLETE_PAYMENT("RBS00020","销售单据已完成付款!"), - ALL_BILL_COMPLETE_PAYMENT("RBS00020","所有销售单据已完成付款!"), - MISTAKE_TARGET("RBS00021","要提供的对象不是数组!"); + ALL_BILL_COMPLETE_PAYMENT("RBS00021","所有销售单据已完成付款!"), + MISTAKE_TARGET("RBS00022","要提供的对象不是数组!"), + NO_FOUND_REFUND_DATA("RBS00023","无需同步状态退款订单"); private String code; private String message; diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java b/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java index b3dbefd..a12e56c 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java +++ b/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java @@ -24,8 +24,11 @@ public interface PaymentConstant { String ORDER_LOCK_PREFIX = "ORDER_KEY:"; // 订单锁前缀 String DEFAULT_MCH_ID = "1537100771"; // 默认商户ID - // 微信订单查询请求地址 - String WX_ORDER_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"; + String PAY_ORDER = "PAY"; // 支付订单 + String REFUND_ORDER = "REFUND"; // 退款订单 + // 微信订单查询请求地址 + String WX_ORDER_PAY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"; + String WX_ORDER_REFUND_URL = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/"; } diff --git a/payment-base-app/src/main/java/com/base/springcloud/dao/RefundMapper.java b/payment-base-app/src/main/java/com/base/springcloud/dao/RefundMapper.java index 6ffb3c9..6ab833b 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/dao/RefundMapper.java +++ b/payment-base-app/src/main/java/com/base/springcloud/dao/RefundMapper.java @@ -2,8 +2,12 @@ package com.base.springcloud.dao; import com.base.springcloud.bo.RefundBO; import com.base.springcloud.entity.Refund; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.Date; +import java.util.List; + @Repository public interface RefundMapper { int deleteByPrimaryKey(String id); @@ -19,4 +23,8 @@ public interface RefundMapper { int updateByPrimaryKey(Refund record); int updateRefundSuccess(Refund refund); + + List queryRefundData(Date date); + + int superRefundCount(@Param("id") String refundId); } \ No newline at end of file diff --git a/payment-base-app/src/main/java/com/base/springcloud/entity/Refund.java b/payment-base-app/src/main/java/com/base/springcloud/entity/Refund.java index 1dbf009..aaae8ba 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/entity/Refund.java +++ b/payment-base-app/src/main/java/com/base/springcloud/entity/Refund.java @@ -8,6 +8,8 @@ import java.util.Date; public class Refund { private String id; + private String mchId; + private String refundOrderNo; private Date refundTime; diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java b/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java index b917af6..9978097 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java @@ -19,4 +19,10 @@ public interface RefundService { * @return */ List queryRefund(Date date); + + /** + * 查询退款订单 + * @param o + */ + void queryRefundOrder(RefundBO o); } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java b/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java index b653d9a..1ead11a 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java @@ -29,4 +29,11 @@ public interface WecPaymentService { * @return true - 成功 false - 未成功 */ Boolean orderResult(OrderBO orderBO); + + /** + * 微信退款查询 + * @param refundBO + * @return + */ + Boolean wecRefundQuery(RefundBO refundBO); } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java index 1782fd2..2d102a8 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java @@ -10,6 +10,7 @@ import com.base.springcloud.util.DecimalUtil; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,6 +18,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service public class PaymentServiceImp implements PaymentService { @@ -122,19 +124,12 @@ public class PaymentServiceImp implements PaymentService { List refundBOList = refundService.queryRefund(date); if(!Optional.ofNullable(refundBOList).isPresent()) return; // 遍历查询第三方订单信息 - refundBOList.forEach(RefundBO -> { - queryRefund(RefundBO); - //amqpTemplate.convertSendAndReceive(PaymentConstant.ORDER_QUEUE,orderBO); + refundBOList.forEach(o ->{ + // FIXME 异步并列处理退款同步状态数据 + refundService.queryRefundOrder(o); }); } - /** - * 退款订单查询 - * @param refundBO - */ - private void queryRefund(RefundBO refundBO) { - } - // 参数检查 private void parameterCheck(OrderBO orderBO) { } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java index cc1c481..3dfb3e7 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java @@ -6,20 +6,26 @@ import com.base.springcloud.bo.RefundBO; import com.base.springcloud.constant.ErrorConstant; import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.dao.RefundMapper; -import com.base.springcloud.entity.Order; import com.base.springcloud.entity.Refund; import com.base.springcloud.service.*; import com.base.springcloud.util.DateUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Service public class RefundServiceImp implements RefundService { + Logger logger = LoggerFactory.getLogger(RefundServiceImp.class); + @Autowired private OrderService orderService; @@ -77,7 +83,48 @@ public class RefundServiceImp implements RefundService { */ @Override public List queryRefund(Date date) { - return null; + List refundList = refundMapper.queryRefundData(date); + if(!Optional.ofNullable(refundList).isPresent()) + return null; + return refundList.stream().map(o -> { + RefundBO refundBO = new RefundBO(); + refundBO.setMchId(o.getMchId()); + refundBO.setOrigOrderNo(o.getOrigOrderNo()); + refundBO.setOrigCreateTime(o.getOrigOrderTime()); + refundBO.setRefundNo(o.getRefundOrderNo()); + return refundBO; + }).collect(Collectors.toList()); + } + + /** + * 退款订单状态查询 + * @param refundBO + */ + @Override + public void queryRefundOrder(RefundBO refundBO) { + try{ + // 参数检查 + String refundOrderNo = Optional.ofNullable(refundBO).map(o->refundBO.getRefundNo()).orElse(null); + String mchId = Optional.ofNullable(refundBO).map(o->refundBO.getMchId()).orElse(null); + if(StringUtils.isBlank(refundOrderNo)) + return; + if(StringUtils.isBlank(mchId)) + return; + // 商户支付配置信息查询 + claimMerchantConfig(refundBO); + // 微信退款查询 + Boolean refundResult = wecPaymentService.wecRefundQuery(refundBO); + // 同步退款信息 + if(refundResult) + updateRefundSuccess(refundBO); + }catch (BusinessException e){ + logger.info("退款订单 : {} 业务异常信息 : {}",refundBO.getRefundNo(),e.getCode()); + }catch (Exception e){ + logger.info("退款订单 : {} 系统异常信息 : {}",refundBO.getRefundNo(),e.getMessage()); + }finally { + // 叠加查询次数 + superRefundCount(refundBO); + } } /** @@ -90,6 +137,7 @@ public class RefundServiceImp implements RefundService { refund.setCreateId(refundBO.getCreateId()); refund.setCreateTime(new Date()); refund.setReason(refundBO.getReason()); + refund.setMchId(refundBO.getMchId()); refund.setRefundOrderNo(DateUtil.getDateString(25)); refund.setRefundTime(new Date()); refund.setRefundState(PaymentConstant.REFUND_WAIT); @@ -117,4 +165,17 @@ public class RefundServiceImp implements RefundService { throw new BusinessException(ErrorConstant.SYNC_WEC_REFUND_STATE_FAIL); } + /** + * 叠加查询次数 + * @param refundBO + */ + private void superRefundCount(RefundBO refundBO) { + String refundId = Optional.ofNullable(refundBO).map(o->o.getRefundId()).orElse(null); + if(StringUtils.isBlank(refundId)) + return; + int count = refundMapper.superRefundCount(refundId); + if(count < 1) + throw new BusinessException(ErrorConstant.SYNC_WEC_REFUND_STATE_FAIL); + } + } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java index 3983b6d..d92018e 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java @@ -10,8 +10,6 @@ import com.base.springcloud.entity.WxpayRefundVo; import com.base.springcloud.entity.WxpayTradeVo; import com.base.springcloud.entity.WxpayTradeVo.WxTradeAmountVo; import com.base.springcloud.service.WecPaymentService; -import com.base.springcloud.util.DateUtil; -import com.base.springcloud.util.DecimalUtil; import com.base.springcloud.util.StringHelper; import com.base.springcloud.wxsdk.WxpayUtils; import lombok.SneakyThrows; @@ -19,9 +17,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import java.math.BigDecimal; import java.util.Map; -import java.util.Optional; @Service public class WecPaymentServiceImp implements WecPaymentService { @@ -95,8 +91,20 @@ public class WecPaymentServiceImp implements WecPaymentService { @Override public Boolean orderResult(OrderBO orderBO) { Order order = orderBO.getOrder(); - String url = PaymentConstant.WX_ORDER_QUERY_URL + order.getOrderNo() + "?mchid=" + order.getMchId(); + String url = PaymentConstant.WX_ORDER_PAY_URL + order.getOrderNo() + "?mchid=" + order.getMchId(); logger.info("order_result_url : {}",url); - return WxpayUtils.queryWxOrder(url,orderBO.getMchId(),orderBO.getMchPrivateKey(),orderBO.getCertificate(),orderBO.getSerialNo()); + return WxpayUtils.queryWxOrder(PaymentConstant.PAY_ORDER,url,orderBO.getMchId(),orderBO.getMchPrivateKey(),orderBO.getCertificate(),orderBO.getSerialNo()); + } + + /** + * 微信退款查询 + * @param refundBO + * @return + */ + @Override + public Boolean wecRefundQuery(RefundBO refundBO) { + String refundNo = refundBO.getRefundNo(); + String url = PaymentConstant.WX_ORDER_REFUND_URL + refundNo; + return WxpayUtils.queryWxOrder(PaymentConstant.REFUND_ORDER,url,refundBO.getMchId(),refundBO.getMchPrivateKey(),refundBO.getCertificate(),refundBO.getSerialNo()); } } diff --git a/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java b/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java index c424a7b..8be78b2 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java +++ b/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java @@ -93,7 +93,7 @@ public class WxpayUtils { * @param serialNo * @return true - 成功 false - 失败 */ - public static Boolean queryWxOrder(String url,String mchId, String privateKey, String certificate, String serialNo) { + public static Boolean queryWxOrder(String type,String url,String mchId, String privateKey, String certificate, String serialNo) { HttpGet httpGet = new HttpGet(url); httpGet.addHeader("Accept", "application/json"); CloseableHttpResponse response = null; @@ -112,9 +112,19 @@ public class WxpayUtils { // FIXME 请求微信失败 } log.info("query_wx_order response resultMap: {}",jsonObject.toJSONString()); - if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("trade_state"))) { - log.info("query_wx_order query true"); - return true; + switch (type) { + case PaymentConstant.PAY_ORDER: + if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("trade_state"))) { + log.info("query_wx_order query true"); + return true; + } + return false; + case PaymentConstant.REFUND_ORDER: + if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("status"))) { + log.info("query_wx_order query true"); + return true; + } + return false; } } catch (IOException e) { log.error("======>>> wxpay response, client exception: {}", e); diff --git a/payment-base-app/src/main/resources/com/base/payment/mapper/RefundMapper.xml b/payment-base-app/src/main/resources/com/base/payment/mapper/RefundMapper.xml index df39daa..d0aeca2 100644 --- a/payment-base-app/src/main/resources/com/base/payment/mapper/RefundMapper.xml +++ b/payment-base-app/src/main/resources/com/base/payment/mapper/RefundMapper.xml @@ -3,6 +3,7 @@ + @@ -15,7 +16,7 @@ - id, refund_order_no, refund_time, create_id, create_time, orig_order_no, orig_order_time, + id,mch_id, refund_order_no, refund_time, create_id, create_time, orig_order_no, orig_order_time, source_bill_id, reason, refund_state, refund_retry_count + select + + from pay_refund + + refund_state = '0' + and DATE_FORMAT(refund_time,'%Y-%m-%d') = DATE_FORMAT(#{date},'%Y-%m-%d') + + order by refund_time desc limit 10 + \ No newline at end of file