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

123 lines
5.7 KiB
Java

package com.ghy.callback;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.model.AdapayStatusEnum;
import com.ghy.common.adapay.model.Event;
import com.ghy.common.adapay.model.PayCallback;
import com.ghy.common.adapay.model.PaymentDTO;
import com.ghy.common.enums.PayStatus;
import com.ghy.payment.domain.FinancialChangeRecord;
import com.ghy.payment.domain.FinancialDetail;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.service.CallBackService;
import com.ghy.payment.service.FinancialChangeRecordService;
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;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 支付回调
*
* @author HH 2022/5/31
*/
@Service("payCallbackService")
public class PayCallbackService implements CallBackService {
private static final Logger logger = LoggerFactory.getLogger(PayCallbackService.class);
@Resource
FinancialMasterService financialMasterService;
@Resource
FinancialDetailService financialDetailService;
@Resource
FinancialChangeRecordService financialChangeRecordService;
@Override
@Transactional(rollbackFor = Exception.class)
public void onCallback(Event event) {
logger.info("支付回调: {}", event);
String data = event.getData();
PayCallback payment = JSON.parseObject(data, PayCallback.class);
PaymentDTO dto = financialMasterService.selectPaymentById(payment.getId());
// 校验是否是本系统发出去的支付请求
if (dto != null) {
// 更新交易记录
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())) {
if(payment.getOrderNo().split("_").length > 2){
// 支付回调中的加价记录
String financialChangeRecordIds = payment.getOrderNo().split("_")[1];
String[] financialChangeRecordArr = financialChangeRecordIds.split(",");
BigDecimal totalChangeMoney = BigDecimal.ZERO;
Long financialMasterId = null;
for (String financialChangeRecordId: financialChangeRecordArr) {
FinancialChangeRecord financialChangeRecord = new FinancialChangeRecord();
financialChangeRecord.setId(Long.valueOf(financialChangeRecordId));
financialChangeRecord.setPayStatus(1);
// 加价的支付paymentId回填到remark
financialChangeRecord.setRemark(payment.getId());
financialChangeRecordService.update(financialChangeRecord);
// 修改子订单的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();
}
}
// 修改主单的payMoney
FinancialMaster financialMaster = financialMasterService.selectById(financialMasterId);
FinancialMaster financialMaster2Update = new FinancialMaster();
financialMaster2Update.setId(financialMaster.getId());
financialMaster2Update.setPayMoney(financialMaster.getPayMoney().add(totalChangeMoney));
financialMaster2Update.setPayStatus(PayStatus.PAID.getCode());
financialMasterService.updateFinancialMaster(financialMaster2Update);
// TODO 拆分对应的分账流水
}
// 更新主财务单状态
financialMasterService.paySucceeded(payment.getId(), payment.getPayChannel());
} else {
logger.warn("支付失败 : {}", payment);
}
} 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);
if (!AdapayStatusEnum.succeeded.code.equals(status)) {
logger.warn("发起支付失败 : {}", response.toJSONString());
}
}
}