longz
2026-07-21 700cbb19a285e639bb05404503efa3da9988c083
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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(resolveBusinessType(outTradeNo));
            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);
    }
 
    private String resolveBusinessType(String outTradeNo) {
        if (outTradeNo != null && outTradeNo.startsWith("ICBCTEST")) {
            return "TEST";
        }
        if (outTradeNo != null && outTradeNo.startsWith("HY")) {
            return "VIP_ORDER";
        }
        if (outTradeNo != null && outTradeNo.startsWith("GW")) {
            return "SHOPPING_ORDER";
        }
        return "CHARGING_ORDER";
    }
}