ghy-all/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java

144 lines
6.9 KiB
Java
Raw Normal View History

package com.ghy.callback;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.model.AdapayStatusEnum;
2022-06-01 16:29:52 +08:00
import com.ghy.common.adapay.model.Event;
import com.ghy.common.adapay.model.PayCallback;
import com.ghy.common.adapay.model.PaymentDTO;
2022-09-25 18:57:18 +08:00
import com.ghy.common.enums.PayStatus;
import com.ghy.payment.domain.FinancialChangeRecord;
2022-10-19 00:46:42 +08:00
import com.ghy.payment.domain.FinancialDetail;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.service.CallBackService;
2022-09-25 18:57:18 +08:00
import com.ghy.payment.service.FinancialChangeRecordService;
2022-10-19 00:46:42 +08:00
import com.ghy.payment.service.FinancialDetailService;
import com.ghy.payment.service.FinancialMasterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
2022-11-23 11:34:02 +08:00
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
2022-10-19 00:46:42 +08:00
import java.math.BigDecimal;
import java.time.LocalDateTime;
2023-04-25 23:18:10 +08:00
import java.util.List;
2023-04-08 23:24:04 +08:00
import java.util.concurrent.CompletableFuture;
2022-05-31 20:55:09 +08:00
/**
* 支付回调
*
* @author HH 2022/5/31
*/
@Service("payCallbackService")
public class PayCallbackService implements CallBackService {
2022-05-31 20:55:09 +08:00
private static final Logger logger = LoggerFactory.getLogger(PayCallbackService.class);
@Resource
FinancialMasterService financialMasterService;
2022-10-19 00:46:42 +08:00
@Resource
FinancialDetailService financialDetailService;
2022-09-25 18:57:18 +08:00
@Resource
FinancialChangeRecordService financialChangeRecordService;
@Override
2022-11-23 11:34:02 +08:00
@Transactional(rollbackFor = Exception.class)
public void onCallback(Event event) {
logger.info("支付回调: {}", event);
String data = event.getData();
2022-06-01 16:29:52 +08:00
PayCallback payment = JSON.parseObject(data, PayCallback.class);
PaymentDTO dto = financialMasterService.selectPaymentById(payment.getId());
// 校验是否是本系统发出去的支付请求
if (dto != null) {
2023-04-08 23:24:04 +08:00
CompletableFuture.runAsync(() -> {
// 异步更新交易记录 避免被回滚
PaymentDTO param = new PaymentDTO();
param.setId(payment.getId());
param.setFeeAmt(payment.getFeeAmt());
param.setStatus(payment.getStatus());
param.setPayTime(LocalDateTime.now());
financialMasterService.updatePayment(param);
});
if (AdapayStatusEnum.succeeded.code.equals(payment.getStatus())) {
2023-04-08 23:24:04 +08:00
if (payment.getOrderNo().split("_").length > 2) {
// 支付回调中的加价记录ID
String fcrIdStr = payment.getOrderNo().split("_")[1];
String[] fcrIds = fcrIdStr.split(",");
2022-10-19 00:46:42 +08:00
BigDecimal totalChangeMoney = BigDecimal.ZERO;
2022-10-25 00:34:26 +08:00
Long financialMasterId = null;
2023-04-08 23:24:04 +08:00
for (String fcrId : fcrIds) {
2022-10-25 00:34:26 +08:00
FinancialChangeRecord financialChangeRecord = new FinancialChangeRecord();
2023-04-08 23:24:04 +08:00
financialChangeRecord.setId(Long.valueOf(fcrId));
2022-10-25 00:34:26 +08:00
financialChangeRecord.setPayStatus(1);
2022-11-25 10:23:39 +08:00
// 加价的支付paymentId回填到remark
financialChangeRecord.setRemark(payment.getId());
2023-04-08 23:24:04 +08:00
financialChangeRecord.setRemark(payment.getId());
financialChangeRecord.setPaymentId(payment.getId());
financialChangeRecordService.update(financialChangeRecord);
2022-10-25 00:34:26 +08:00
// 修改子订单的payMoney
FinancialChangeRecord fc = financialChangeRecordService.selectFinancialChangeRecordById(financialChangeRecord.getId());
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(fc.getOrderDetailId());
FinancialDetail financialDetail2Update = new FinancialDetail();
financialDetail2Update.setId(financialDetail.getId());
financialDetail2Update.setPayMoney(financialDetail.getPayMoney().add(fc.getChangeMoney()));
financialDetail2Update.setPayStatus(PayStatus.PAID.getCode());
financialDetailService.updateFinancialDetail(financialDetail2Update);
totalChangeMoney = totalChangeMoney.add(fc.getChangeMoney());
if (financialMasterId == null) {
financialMasterId = financialDetail.getFinancialMasterId();
2022-10-19 00:46:42 +08:00
}
}
// 修改主单的payMoney
2022-10-25 00:34:26 +08:00
FinancialMaster financialMaster = financialMasterService.selectById(financialMasterId);
2022-10-19 00:46:42 +08:00
FinancialMaster financialMaster2Update = new FinancialMaster();
financialMaster2Update.setId(financialMaster.getId());
financialMaster2Update.setPayMoney(financialMaster.getPayMoney().add(totalChangeMoney));
financialMaster2Update.setPayStatus(PayStatus.PAID.getCode());
financialMasterService.updateFinancialMaster(financialMaster2Update);
2022-10-25 00:34:26 +08:00
// TODO 拆分对应的分账流水
2023-04-25 23:18:10 +08:00
}else {
// 主单的付款
String masterOrderNo = payment.getOrderNo().split("_")[0];
// 找到主单记录
FinancialMaster param = new FinancialMaster();
param.setOrderMasterCode(masterOrderNo);
List<FinancialMaster> financialMasters = financialMasterService.selectFinancialMasterList(param);
FinancialMaster source = financialMasters.get(0);
// 更新主单paymentId 以及主单状态
FinancialMaster financialMaster2Update = new FinancialMaster();
financialMaster2Update.setId(source.getId());
financialMaster2Update.setPayStatus(PayStatus.PAID.getCode());
financialMaster2Update.setPaymentId(payment.getId());
financialMasterService.updateFinancialMaster(financialMaster2Update);
}
// 更新主财务单状态
financialMasterService.paySucceeded(payment.getId(), payment.getPayChannel());
} else {
2023-04-08 23:24:04 +08:00
logger.warn("支付失败 : {}", data);
}
2022-05-31 20:55:09 +08:00
} else {
logger.warn("系统中不存在这条交易记录: {}", event);
}
}
@Override
public void onResponse(JSONObject response) {
logger.info("发起支付 Response: {}", response.toJSONString());
// 保存一条支付记录
PaymentDTO payment = response.toJavaObject(PaymentDTO.class);
String status = payment.getStatus();
financialMasterService.insertPayment(payment);
2022-11-23 00:00:57 +08:00
if (!AdapayStatusEnum.succeeded.code.equals(status)) {
logger.warn("发起支付失败 : {}", response.toJSONString());
}
}
}