liujie
2026-08-21 ad5db85e540947e82c7a4d5612879b3b3ecdf459
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
package com.tourguide.common.huifu.biz;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.huifu.bspay.sdk.opps.core.net.BasePayRequest;
import com.tourguide.common.huifu.properties.HuiFuProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
 
/**
 * DouGong account split helper.
 */
@Component
public class FenZhangUtil {
    private static final Logger log = LoggerFactory.getLogger(FenZhangUtil.class);
    private final HuiFuProperties huiFuProperties;
 
    public FenZhangUtil(HuiFuProperties huiFuProperties) {
        this.huiFuProperties = huiFuProperties;
    }
 
    public Map<String, Object> fenzhang(String reqSeqId, String reqDate, String ordAmt, String receiverHuifuId) throws Exception {
        DouGongRequestSupport.initBasePay(huiFuProperties);
        BigDecimal amount = new BigDecimal(ordAmt).setScale(2, RoundingMode.HALF_UP);
 
        Map<String, Object> paramsInfo = new HashMap<>();
        paramsInfo.put("req_seq_id", reqSeqId);
        paramsInfo.put("req_date", reqDate);
        paramsInfo.put("out_huifu_id", huiFuProperties.getHuifuId());
        paramsInfo.put("ord_amt", amount.toString());
        paramsInfo.put("acct_split_bunch", acctSplitBunch(amount, receiverHuifuId));
        paramsInfo.put("risk_check_data", riskCheckData());
        paramsInfo.put("trans_fee_take_flag", "OUT");
        log.info("调用斗拱主账户划账,reqSeqId={},receiverHuifuId={},amount={}",
                reqSeqId, receiverHuifuId, amount);
        Map<String, Object> response = BasePayRequest.requestBasePay(
                "v2/trade/acctpayment/pay", paramsInfo, null, false);
        log.info("斗拱主账户划账响应,reqSeqId={},response={}", reqSeqId, response);
        return response;
    }
 
    public Map<String, Object> queryFenzhang(String reqSeqId, String reqDate) throws Exception {
        DouGongRequestSupport.initBasePay(huiFuProperties);
 
        Map<String, Object> paramsInfo = new HashMap<>();
        paramsInfo.put("huifu_id", huiFuProperties.getHuifuId());
        paramsInfo.put("org_req_date", reqDate);
        paramsInfo.put("org_req_seq_id", reqSeqId);
        return BasePayRequest.requestBasePay("v2/trade/acctpayment/pay/query", paramsInfo, null, false);
    }
 
    public Map<String, Object> payFromUser(String reqSeqId, String reqDate, String ordAmt, String outHuifuId) throws Exception {
        DouGongRequestSupport.initBasePay(huiFuProperties);
        BigDecimal amount = new BigDecimal(ordAmt).setScale(2, RoundingMode.HALF_UP);
 
        Map<String, Object> paramsInfo = new HashMap<>();
        paramsInfo.put("req_seq_id", reqSeqId);
        paramsInfo.put("req_date", reqDate);
        paramsInfo.put("out_huifu_id", outHuifuId);
        paramsInfo.put("ord_amt", amount.toString());
        paramsInfo.put("acct_split_bunch", acctSplitBunch(amount, huiFuProperties.getHuifuId()));
        paramsInfo.put("risk_check_data", riskCheckData());
        paramsInfo.put("trans_fee_take_flag", "OUT");
        return BasePayRequest.requestBasePay("v2/trade/acctpayment/pay", paramsInfo, null, false);
    }
 
    private String acctSplitBunch(BigDecimal amount, String huifuId) {
        JSONObject acctInfo = new JSONObject();
        acctInfo.put("div_amt", amount.toString());
        acctInfo.put("huifu_id", huifuId);
 
        JSONArray acctInfos = new JSONArray();
        acctInfos.add(acctInfo);
 
        JSONObject root = new JSONObject();
        root.put("acct_infos", acctInfos);
        return root.toJSONString();
    }
 
    private String riskCheckData() {
        JSONObject data = new JSONObject();
        data.put("sub_product", "1");
        data.put("transfer_type", "04");
        return data.toJSONString();
    }
}