diff --git a/server/like-admin/src/main/java/com/mdd/admin/service/impl/FinanceRechargerServiceImpl.java b/server/like-admin/src/main/java/com/mdd/admin/service/impl/FinanceRechargerServiceImpl.java index 850adcf4..d0ce56ea 100644 --- a/server/like-admin/src/main/java/com/mdd/admin/service/impl/FinanceRechargerServiceImpl.java +++ b/server/like-admin/src/main/java/com/mdd/admin/service/impl/FinanceRechargerServiceImpl.java @@ -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); + } + /** * 重新退款 *