提交 ca538fda authored 作者: hzh's avatar hzh

退款回调调试

上级 994e8035
package org.dromara.common.pay.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2025-01-02
* @desc 退款回调body
**/
@Data
@Accessors(chain = true)
public class JsapiRefundNotifyBodyModel implements Serializable {
/**
* 【通知ID】回调通知的唯一编号。
*/
private String id;
/**
* 【通知创建时间】
* <p>
* 1、定义:本次回调通知创建的时间。
*/
private String create_time;
/**
* 【通知的类型】微信支付回调通知的类型。
*/
private String event_type;
/**
* 【通知数据类型】通知的资源数据类型,固定为encrypt-resource。
*/
private String resource_type;
/**
* 【通知资源数据】通知资源数据
*/
private Resource resource;
@Data
@Accessors(chain = true)
public static class Resource implements Serializable {
/**
* 【加密算法类型】
* 回调数据密文的加密算法类型,目前为AEAD_AES_256_GCM,开发者需要使用同样类型的数据进行解密。
*/
private String algorithm;
/**
* 【原始回调类型】
* 加密前的对象类型,为refund。
*/
private String original_type;
/**
* 【数据密文】
* Base64编码后的回调数据密文,商户需Base64解码并使用APIV3密钥解密,参考如何解密证书和回调报文。
*/
private String ciphertext;
/**
* 【附加数据】
* 参与解密的附加数据,该值可能为空。
*/
private String associated_data;
/**
* 【随机串】
* 参与解密的随机串。
*/
private String nonce;
}
}
package org.dromara.common.pay.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* @author hzh
* @date 2025-01-02
* @desc 货币工具类
**/
public class CurrencyUtils {
/**
* 分转元
*
* @param score 分
* @return 元
*/
public static BigDecimal convertScoreToYuan(Integer score) {
if (score == null) {
return null;
}
return new BigDecimal(score).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
}
}
......@@ -39,12 +39,13 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static org.dromara.common.pay.util.CurrencyUtils.convertScoreToYuan;
/**
* @author hzh
* @date 2024-12-05
......@@ -224,12 +225,6 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
return true;
}
private BigDecimal convertScoreToYuan(Integer score) {
if (score == null) {
return null;
}
return new BigDecimal(score).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
}
@Override
public List<RemoteOrder> queryList(String orderType, List<String> orderNoList) {
......
......@@ -11,14 +11,18 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.pay.domain.JsapiNotifyModel;
import org.dromara.common.pay.domain.JsapiRefundNotifyModel;
import org.dromara.common.pay.enums.RefundStatus;
import org.dromara.common.pay.service.IWxPayService;
import org.dromara.order.api.enums.OrderStatus;
import org.dromara.order.constant.WechatTradeState;
import org.dromara.order.domain.bo.OrderBo;
import org.dromara.order.domain.bo.OrderRefundBo;
import org.dromara.order.domain.bo.OrderTradeBo;
import org.dromara.order.domain.vo.OrderRefundVo;
import org.dromara.order.domain.vo.OrderTradeVo;
import org.dromara.order.domain.vo.OrderVo;
import org.dromara.order.service.IOrderPayService;
import org.dromara.order.service.IOrderRefundService;
import org.dromara.order.service.IOrderService;
import org.dromara.order.service.IOrderTradeService;
import org.dromara.server.api.RemoteYsOrderService;
......@@ -31,6 +35,8 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import static org.dromara.common.pay.util.CurrencyUtils.convertScoreToYuan;
/**
* @author hzh
* @date 2024-12-09
......@@ -40,6 +46,7 @@ import java.util.Optional;
@RequiredArgsConstructor
public class WeChatOrderPayServiceImpl implements IOrderPayService {
private final IOrderRefundService orderRefundService;
private final IOrderTradeService orderTradeService;
private final IOrderService orderService;
@DubboReference
......@@ -102,7 +109,32 @@ public class WeChatOrderPayServiceImpl implements IOrderPayService {
* @param model 退款回调参数
*/
private void dealRefundOrder(JsapiRefundNotifyModel model) {
//TODO 处理退款订单
OrderRefundVo or = orderRefundService.queryList(new OrderRefundBo()
.setOrderRefundNo(model.getOut_refund_no()))
.stream().findFirst().orElse(null);
if (or == null) {
throw new RuntimeException("退款订单不存在");
}
if (StringUtils.equals(or.getStatus(), RefundStatus.SUCCESS.name())) {
throw new RuntimeException("退款订单已处理");
}
if (StringUtils.equals(model.getRefund_status(), RefundStatus.SUCCESS.name())) {
or.setSuccessTime(model.getSuccess_time());
or.setStatus(model.getRefund_status());
or.setUserReceivedAccount(model.getUser_received_account());
or.setRefundId(model.getRefund_id());
JsapiRefundNotifyModel.Amount amount = model.getAmount();
if (Objects.nonNull(amount)) {
or.setTotal(convertScoreToYuan(amount.getTotal()));
or.setAmount(convertScoreToYuan(amount.getRefund()));
or.setPayerTotal(convertScoreToYuan(amount.getPayer_total()));
or.setPayerRefund(convertScoreToYuan(amount.getPayer_refund()));
}
} else {
or.setRefundId(model.getRefund_id());
or.setStatus(model.getRefund_status());
}
orderRefundService.updateByBo(BeanUtil.copyProperties(or, OrderRefundBo.class));
}
@GlobalTransactional(rollbackFor = Exception.class)
......
......@@ -9,7 +9,6 @@ import java.util.List;
/**
* @author hzh
* @date 2024-12-09
* @desc TODO
**/
@Data
public class OrderQueryVo {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论