diff --git a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java index 5d1028d60..a645dd754 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -23,6 +23,7 @@ import com.jsowell.common.util.AdapayUtil; import com.jsowell.common.util.JWTUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; +import com.jsowell.common.util.id.SnowflakeIdWorker; import com.jsowell.pile.domain.MemberBasicInfo; import com.jsowell.pile.domain.MemberInvoiceTitle; import com.jsowell.pile.domain.MemberPlateNumberRelation; @@ -455,7 +456,7 @@ public class MemberService { public Map rechargeBalanceWithAdapay(WeixinPayDTO dto) throws Exception { // 封装对象 CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam(); - createAdaPaymentParam.setOrder_no(IdUtils.fastSimpleUUID()); + createAdaPaymentParam.setOrder_no(SnowflakeIdWorker.getSnowflakeId()); createAdaPaymentParam.setPay_amt(AdapayUtil.formatAmount(dto.getAmount())); createAdaPaymentParam.setApp_id(ADAPAY_APP_ID); // 移动到配置文件中 createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求 diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index 1868b1e57..d6365f069 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -758,7 +758,7 @@ public class OrderService { orderBasicInfoService.weChatRefund(dto); } - public void adapayRefund(WeChatRefundDTO dto) { + public void adapayRefund(WeChatRefundDTO dto) throws BaseAdaPayException { log.info("汇付退款 param:{}", JSON.toJSONString(dto)); // 退款有两种情况 1-订单结算退款 2-用户余额退款 String refundType = dto.getRefundType(); @@ -1213,7 +1213,6 @@ public class OrderService { } } - // 入库 OrderInvoiceRecord orderInvoiceRecord = new OrderInvoiceRecord(); orderInvoiceRecord.setStatus("0"); diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 8017870d7..9640ff9de 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.huifu.adapay.model.Refund; import com.jsowell.JsowellApplication; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; @@ -143,6 +145,27 @@ public class SpringBootTestController { @Autowired private AdapayCallbackRecordService adapayCallbackRecordService; + @Test + public void testAdapayRefund() { + // 创建汇付退款对象 在完成初始化设置情况下,调用方法,获取 Refund对象 + try { + String id = "002212023052711245310508373206577954816"; + String refundAmount = "0.01"; + Map refundParams = Maps.newHashMap(); + refundParams.put("refund_amt", AdapayUtil.formatAmount(refundAmount)); + refundParams.put("refund_order_no", SnowflakeIdWorker.getSnowflakeId()); + Map response = Refund.create(id, refundParams); + System.out.println(JSON.toJSONString(response)); + // if (response != null && !response.isEmpty()) { + // JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString()); + // JSONObject pay_info = jsonObject.getJSONObject("pay_info"); + // Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); + // } + } catch (Exception e) { + System.out.println(e); + } + } + @Test public void testSaveCallback() throws JsonProcessingException { String data = "{\"app_id\":\"app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa\",\"created_time\":\"20230527100758\",\"description\":\"{\\\"type\\\":\\\"balance\\\",\\\"memberId\\\":\\\"29336349\\\"}\",\"end_time\":\"20230527100810\",\"expend\":{\"bank_type\":\"OTHERS\",\"open_id\":\"o8jhot6PJF93EPhNISsXi28dKdS8\",\"sub_open_id\":\"o4REX5MprZfTaLnVNxfdOY-wnwGI\"},\"fee_amt\":\"0.00\",\"id\":\"002212023052710075810508353847861903360\",\"order_no\":\"4c457bd474334d5eaf82f4795265b6ad\",\"out_trans_id\":\"4200001864202305270647556621\",\"party_order_id\":\"02212305273647819807712\",\"pay_amt\":\"0.01\",\"pay_channel\":\"wx_lite\",\"real_amt\":\"0.01\",\"share_eq\":\"Y\",\"status\":\"succeeded\",\"wx_user_id\":\"\"}"; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayCallbackRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayCallbackRecordMapper.java index 401169d20..c71aca5b1 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayCallbackRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayCallbackRecordMapper.java @@ -13,6 +13,8 @@ public interface AdapayCallbackRecordMapper { AdapayCallbackRecord selectByPrimaryKey(Integer id); + AdapayCallbackRecord selectByOrderCode(String orderCode); + int updateByPrimaryKeySelective(AdapayCallbackRecord record); int updateByPrimaryKey(AdapayCallbackRecord record); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayCallbackRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayCallbackRecordService.java index 50ea6d978..d51f175f8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayCallbackRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayCallbackRecordService.java @@ -4,4 +4,6 @@ import com.jsowell.pile.domain.AdapayCallbackRecord; public interface AdapayCallbackRecordService { void saveAdapayCallbackRecord(AdapayCallbackRecord callbackRecord); + + AdapayCallbackRecord selectByOrderCode(String orderCode); } 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 51deb386c..86000dbbb 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 @@ -1,5 +1,6 @@ package com.jsowell.pile.service; +import com.huifu.adapay.core.exception.BaseAdaPayException; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.pile.domain.OrderBasicInfo; @@ -261,7 +262,7 @@ public interface IOrderBasicInfoService { * 汇付支付 订单退款 * @param dto */ - void refundForOrderWithAdapay(WeChatRefundDTO dto); + void refundForOrderWithAdapay(WeChatRefundDTO dto) throws BaseAdaPayException; /** * 汇付支付 余额退款 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayCallbackRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayCallbackRecordServiceImpl.java index 9e3ab57ff..4175e2ed2 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayCallbackRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/AdapayCallbackRecordServiceImpl.java @@ -3,9 +3,11 @@ package com.jsowell.pile.service.impl; import com.jsowell.pile.domain.AdapayCallbackRecord; import com.jsowell.pile.mapper.AdapayCallbackRecordMapper; import com.jsowell.pile.service.AdapayCallbackRecordService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +@Slf4j @Service public class AdapayCallbackRecordServiceImpl implements AdapayCallbackRecordService { @@ -16,4 +18,15 @@ public class AdapayCallbackRecordServiceImpl implements AdapayCallbackRecordServ public void saveAdapayCallbackRecord(AdapayCallbackRecord callbackRecord) { adapayCallbackRecordMapper.insert(callbackRecord); } + + @Override + public AdapayCallbackRecord selectByOrderCode(String orderCode) { + AdapayCallbackRecord record = null; + try { + record = adapayCallbackRecordMapper.selectByOrderCode(orderCode); + } catch (Exception e) { + log.error("查询汇付支付回调记录失败", e); + } + return record; + } } 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 e21de17b5..11525498e 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 @@ -2,11 +2,14 @@ package com.jsowell.pile.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; import com.fasterxml.jackson.core.JsonProcessingException; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.huifu.adapay.core.exception.BaseAdaPayException; +import com.huifu.adapay.model.Refund; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.vo.AuthorizedDeptVO; @@ -16,6 +19,7 @@ import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.MemberWalletEnum; 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.SecurityUtils; import com.jsowell.common.util.StringUtils; @@ -87,6 +91,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { @Autowired private WxpayCallbackRecordService wxpayCallbackRecordService; + @Autowired + private AdapayCallbackRecordService adapayCallbackRecordService; + @Autowired private WechatPayService wechatPayService; @@ -1729,13 +1736,34 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } @Override - public void refundForOrderWithAdapay(WeChatRefundDTO dto) { + public void refundForOrderWithAdapay(WeChatRefundDTO dto) throws BaseAdaPayException { // 查出来原来的支付信息 + AdapayCallbackRecord record = adapayCallbackRecordService.selectByOrderCode(dto.getOrderCode()); + if (Objects.isNull(record)) { + logger.error("orderCode:{}, 订单退款处理逻辑, 查询订单微信支付记录为空!", dto.getOrderCode()); + throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_CALLBACK_RECORD_ERROR); + } // 判断支付金额和退款金额 + BigDecimal refundAmount = dto.getRefundAmount(); + BigDecimal payAmt = record.getPayAmt(); + if (refundAmount.compareTo(payAmt) > 0) { + logger.error("订单号:{}, 退款金额:{}(元),大于可退金额{}(元), 抛出异常", dto.getOrderCode(), refundAmount, payAmt); + throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_AMOUNT_ERROR); + } - // 创建汇付退款对象 - + // 创建汇付退款对象 在完成初始化设置情况下,调用方法,获取 Refund对象 + String id = record.getPaymentId(); + Map refundParams = Maps.newHashMap(); + refundParams.put("refund_amt", AdapayUtil.formatAmount(dto.getRefundAmount())); + refundParams.put("refund_order_no", SnowflakeIdWorker.getSnowflakeId()); + Map response = Refund.create(id, refundParams); + logger.info("创建退款对象:{}", JSON.toJSONString(response)); + if (response != null && !response.isEmpty()) { + JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString()); + JSONObject pay_info = jsonObject.getJSONObject("pay_info"); + Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); + } } @Override diff --git a/jsowell-pile/src/main/resources/mapper/pile/AdapayCallbackRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/AdapayCallbackRecordMapper.xml index c4f54b071..82ac8a399 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/AdapayCallbackRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/AdapayCallbackRecordMapper.xml @@ -36,6 +36,13 @@ from adapay_callback_record where id = #{id,jdbcType=VARCHAR} + delete from adapay_callback_record where id = #{id,jdbcType=VARCHAR}