fix 退款失效的bug

This commit is contained in:
damonyuan 2024-10-30 00:28:30 +08:00
parent b5096b5f5c
commit 3e3f064a2f
1 changed files with 77 additions and 7 deletions

View File

@ -3,9 +3,17 @@ package com.mdd.admin.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.fastjson2.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.yulichang.query.MPJQueryWrapper;
import com.mdd.admin.service.IFinanceRechargerService;
import com.mdd.admin.validate.commons.PageValidate;
@ -14,6 +22,7 @@ import com.mdd.admin.vo.finance.FinanceRechargeListExportVo;
import com.mdd.admin.vo.finance.FinanceRechargeListVo;
import com.mdd.admin.vo.user.UserListExportVo;
import com.mdd.admin.vo.user.UserVo;
import com.mdd.common.config.AlipayConfig;
import com.mdd.common.config.GlobalConfig;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.RechargeOrder;
@ -40,6 +49,7 @@ import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@ -196,24 +206,33 @@ public class FinanceRechargerServiceImpl implements IFinanceRechargerService {
log.setOrderAmount(rechargeOrder.getOrderAmount());
log.setRefundAmount(refundRecord.getRefundAmount());
log.setRefundStatus(RefundEnum.REFUND_ING.getCode());
log.setCreateTime(System.currentTimeMillis() / 1000);
log.setUpdateTime(System.currentTimeMillis() / 1000);
refundLogMapper.insert(log);
// 发起退款请求
RefundRequestV3 requestV3 = new RefundRequestV3();
requestV3.setTransactionId(rechargeOrder.getTransactionId());
requestV3.setOutTradeNo(rechargeOrder.getSn());
requestV3.setOutRefundNo(refundSn);
requestV3.setTotalAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString()));
requestV3.setRefundAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString()));
WxPayDriver.refund(requestV3);
String refundResponse = null;
if (rechargeOrder.getPayWay().equals(PaymentEnum.ALI_PAY.getCode())) { //支付宝退款
refundResponse = this.aliPayRefund(rechargeOrder, refundSn);
} else { //微信
refundResponse = this.wxPayRefund(rechargeOrder, refundSn);
}
// 退款记录更新
refundRecord.setRefundStatus(RefundEnum.REFUND_SUCCESS.getCode());
refundRecord.setCreateTime(System.currentTimeMillis() / 1000);
refundRecord.setUpdateTime(System.currentTimeMillis() / 1000);
refundRecord.setTransactionId(rechargeOrder.getTransactionId());
refundRecordMapper.updateById(refundRecord);
// 退款日志更新
log.setRefundStatus(RefundEnum.REFUND_SUCCESS.getCode());
log.setUpdateTime(System.currentTimeMillis() / 1000);
if (StringUtils.isNotNull(refundResponse)) {
log.setRefundMsg(refundResponse);
}
refundLogMapper.updateById(log);
transactionManager.commit(transactionStatus);
} catch (Exception e) {
// 事务回滚
@ -232,6 +251,57 @@ public class FinanceRechargerServiceImpl implements IFinanceRechargerService {
}
}
/**
* 支付宝退款
* @param rechargeOrder
* @param refundSn
*/
private String aliPayRefund(RechargeOrder rechargeOrder, String refundSn) throws Exception {
String gateWay = StringUtils.isNotNull(YmlUtils.get("like.alidebug")) && YmlUtils.get("like.alidebug").equals("true") ? AlipayConfig.GATEWAY_URL_DEBUG : AlipayConfig.GATEWAY_URL;
AlipayClient alipayClient = new DefaultAlipayClient(gateWay, ConfigUtils.getAliDevPay("app_id"), ConfigUtils.getAliDevPay("private_key"), "json", AlipayConfig.CHARSET, ConfigUtils.getAliDevPay("ali_public_key"), AlipayConfig.SIGN_TYPE);
AlipayTradeRefundRequest aliRequest = new AlipayTradeRefundRequest();
AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel();
alipayTradeRefundModel.setTradeNo(rechargeOrder.getTransactionId());
alipayTradeRefundModel.setRefundAmount(rechargeOrder.getOrderAmount().toString());
alipayTradeRefundModel.setOutRequestNo(rechargeOrder.getSn());
aliRequest.setBizModel(alipayTradeRefundModel);
AlipayTradeRefundResponse response = alipayClient.execute(aliRequest);
if(response.isSuccess()) {
String ret = JSONObject.toJSONString(response);
if (StringUtils.isNotNull(ret)) {
JSONObject refundResponseJSON = JSONObject.parseObject(ret);
rechargeOrder.setRefundTransactionId(refundResponseJSON.getBigInteger("tradeNo"));
rechargeOrderMapper.updateById(rechargeOrder);
}
return ret;
} else {
throw new Exception(response.getBody());
}
}
/**
* w微信退款
* @param rechargeOrder
* @param refundSn
* @throws WxPayException
*/
private String wxPayRefund(RechargeOrder rechargeOrder, String refundSn) throws WxPayException {
String refundTransactionId = null;
RefundRequestV3 requestV3 = new RefundRequestV3();
requestV3.setTransactionId(rechargeOrder.getTransactionId());
requestV3.setOutTradeNo(rechargeOrder.getSn());
requestV3.setOutRefundNo(refundSn);
requestV3.setTotalAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString()));
requestV3.setRefundAmount(AmountUtil.yuan2Fen(rechargeOrder.getOrderAmount().toString()));
WxPayRefundV3Result result = WxPayDriver.refund(requestV3);
refundTransactionId = result.getTransactionId();
rechargeOrder.setRefundTransactionId(new BigInteger(refundTransactionId));
rechargeOrderMapper.updateById(rechargeOrder);
return JSONObject.toJSONString(result);
}
/**
* 重新退款
*