rk
15 小时以前 ab9cd2c82bd64de8e33510db1d1e78a5b3b4de70
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
106
107
108
package com.doumee.config.alipay;
 
import com.alipay.v3.ApiClient;
import com.alipay.v3.ApiException;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayFundTransUniApi;
import com.alipay.v3.model.*;
import com.alipay.v3.util.model.AlipayConfig;
import com.doumee.config.mybatis.SpringUtils;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.dto.AlipayTransferDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
 
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 支付宝单笔转账工具类
 * @author rk
 * @date 2026/04/20
 */
@Slf4j
@org.springframework.context.annotation.Configuration
public class AlipayFundTransUniTransfer {
 
    private static AlipayConfig alipayConfig;
 
    @Autowired
    private AlipayProperties alipayProperties;
 
    public static AlipayFundTransUniTransfer me() {
        return SpringUtils.get().getBean(AlipayFundTransUniTransfer.class);
    }
 
    @PostConstruct
    void init() {
        this.loadAlipayConfig();
    }
 
    public void loadAlipayConfig() {
        try {
            AlipayConfig config = new AlipayConfig();
            config.setServerUrl("https://openapi.alipay.com");
            config.setAppId(StringUtils.trimToNull(alipayProperties.getAppId()));
            config.setPrivateKey(StringUtils.trimToNull(alipayProperties.getPrivateKey()));
            config.setAppCertPath(StringUtils.trimToNull(alipayProperties.getAppCertPath()));
            config.setAlipayPublicCertPath(StringUtils.trimToNull(alipayProperties.getAlipayPublicCertPath()));
            config.setRootCertPath(StringUtils.trimToNull(alipayProperties.getRootCertPath()));
            alipayConfig = config;
            log.info("支付宝配置初始化成功, appId={}", config.getAppId());
        } catch (Exception e) {
            log.error("支付宝配置初始化失败: {}", e.getMessage(), e);
        }
    }
 
    /**
     * 单笔转账到支付宝账户
     *
     * @param dto 转账参数
     * @return 支付宝转账单号
     */
    public static String transfer(AlipayTransferDTO dto) throws ApiException {
        ApiClient defaultClient = Configuration.getDefaultApiClient();
        defaultClient.setAlipayConfig(alipayConfig);
        AlipayFundTransUniApi api = new AlipayFundTransUniApi();
        AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel();
        data.setOutBizNo(dto.getOutBizNo());
        data.setTransAmount(dto.getTransAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
        data.setBizScene("DIRECT_TRANSFER");
        data.setProductCode("TRANS_ACCOUNT_NO_PWD");
        data.setOrderTitle("佣金提现");
 
        Participant payeeInfo = new Participant();
        payeeInfo.setIdentity(dto.getPayeeAccount());
        payeeInfo.setName(dto.getPayeeName());
        payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
        data.setPayeeInfo(payeeInfo);
 
        data.setRemark(dto.getRemark());
        data.setTransferSceneName("佣金报酬");
 
        List<TransferSceneReportInfo> reportInfos = new ArrayList<>();
        TransferSceneReportInfo reportInfo = new TransferSceneReportInfo();
        reportInfo.setInfoType("佣金报酬说明");
        reportInfo.setInfoContent("佣金提现");
        reportInfos.add(reportInfo);
        data.setTransferSceneReportInfos(reportInfos);
 
        data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
 
        try {
            AlipayFundTransUniTransferResponseModel response = api.transfer(data);
            log.info("支付宝转账成功, outBizNo={}, orderId={}", dto.getOutBizNo(), response.getOrderId());
            return response.getOrderId();
        } catch (ApiException e) {
            AlipayFundTransUniTransferDefaultResponse errorObject =
                    (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject();
            log.error("支付宝转账失败, outBizNo={}, error={}", dto.getOutBizNo(), errorObject);
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
                    "转账失败:" + (errorObject != null ? errorObject.toString() : e.getMessage()));
        }
    }
}