package com.ruoyi.payment.icbc.service;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.ruoyi.payment.domain.IcbcPaymentFlowRecord;
|
import com.ruoyi.payment.mapper.IcbcPaymentFlowRecordMapper;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
|
@Slf4j
|
@Service
|
public class IcbcPaymentFlowRecorder {
|
@Resource
|
private IcbcPaymentFlowRecordMapper mapper;
|
|
public void record(String eventType,
|
String outTradeNo,
|
Integer paymentType,
|
BigDecimal amount,
|
Object request,
|
Object response,
|
String status,
|
String errorMessage) {
|
try {
|
String requestJson = toJson(request);
|
String responseJson = toJson(response);
|
JSONObject requestObject = parseObject(requestJson);
|
JSONObject responseObject = parseObject(responseJson);
|
IcbcPaymentFlowRecord record = new IcbcPaymentFlowRecord();
|
record.setOutTradeNo(outTradeNo);
|
record.setBusinessType(outTradeNo != null && outTradeNo.startsWith("ICBCTEST") ? "TEST" : "CHARGING_ORDER");
|
record.setEventType(eventType);
|
record.setPaymentType(paymentType);
|
record.setAmount(amount);
|
record.setIcbcOrderId(firstNotBlank(value(responseObject, "order_id"), value(responseObject, "orderId"),
|
value(responseObject, "transaction_id"), value(requestObject, "order_id"), value(requestObject, "orderId")));
|
record.setIcbcMsgId(firstNotBlank(value(responseObject, "msg_id"), value(responseObject, "msgId"),
|
value(requestObject, "msg_id"), value(requestObject, "msgId")));
|
record.setThirdTradeNo(firstNotBlank(value(responseObject, "third_trade_no"), value(responseObject, "thirdTradeNo"),
|
value(requestObject, "third_trade_no"), value(requestObject, "thirdTradeNo")));
|
record.setStatus(status);
|
record.setRequestJson(requestJson);
|
record.setResponseJson(responseJson);
|
record.setErrorMessage(truncate(errorMessage, 1000));
|
record.setCreateTime(LocalDateTime.now());
|
record.setUpdateTime(LocalDateTime.now());
|
record.setDelFlag(0);
|
mapper.insert(record);
|
} catch (Exception e) {
|
log.warn("工行支付流水审计记录失败,事件:{},订单号:{}", eventType, outTradeNo, e);
|
}
|
}
|
|
private String toJson(Object value) {
|
if (value == null) {
|
return null;
|
}
|
return value instanceof String ? (String) value : JSON.toJSONString(value);
|
}
|
|
private JSONObject parseObject(String value) {
|
if (value == null || value.trim().isEmpty()) {
|
return null;
|
}
|
try {
|
return JSON.parseObject(value);
|
} catch (Exception ignored) {
|
return null;
|
}
|
}
|
|
private String value(JSONObject object, String key) {
|
return object == null ? null : object.getString(key);
|
}
|
|
private String firstNotBlank(String... values) {
|
for (String value : values) {
|
if (value != null && !value.trim().isEmpty()) {
|
return value;
|
}
|
}
|
return null;
|
}
|
|
private String truncate(String value, int maxLength) {
|
return value == null || value.length() <= maxLength ? value : value.substring(0, maxLength);
|
}
|
}
|