rk
2 天以前 467fe3b3ec6aa9d449b094bdd9df4611323d88d1
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.doumee.config.alipay;
 
import com.alibaba.fastjson.JSONObject;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayFundTransUniApi;
import com.alipay.v3.model.*;
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 com.wechat.pay.java.core.RSAAutoCertificateConfig;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import com.wechat.pay.java.core.http.*;
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;
 
@Slf4j
@org.springframework.context.annotation.Configuration
public class AlipayFundTransUniTransfer {
 
    @Autowired
    private AlipayProperties alipayProperties;
 
    private static AlipayConfig alipayConfig;
 
    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(alipayProperties.getAppId());
//            String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
            config.setPrivateKey(alipayProperties.getPrivateKey());
            config.setAppCertPath(alipayProperties.getAppCertPath());
            config.setAlipayPublicCertPath(alipayProperties.getAlipayPublicCertPath());
            config.setRootCertPath(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("1");
        // 设置描述特定的业务场景
        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("佣金报酬");
        // 设置原支付宝业务单号
        data.setOriginalOrderId(dto.getOutBizNo());
        // 设置收款方信息
        data.setOrderTitle("佣金报酬");
        Participant payeeInfo = new Participant();
        payeeInfo.setIdentity(dto.getPayeeAccount());
        payeeInfo.setName(dto.getPayeeName());
        payeeInfo.setIdentity(dto.getPayeeAccount());
        payeeInfo.setName(dto.getPayeeName());
        payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
        data.setPayeeInfo(payeeInfo);
        // 设置业务备注
        data.setRemark("佣金报酬");
        // 设置转账场景名称
        data.setRemark(dto.getRemark());
        data.setTransferSceneName("佣金报酬");
        // 设置转账场景上报信息
        List<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<TransferSceneReportInfo>();
        TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo();
        transferSceneReportInfos0.setInfoType("佣金报酬说明");
        transferSceneReportInfos0.setInfoContent("佣金报酬");
        transferSceneReportInfos.add(transferSceneReportInfos0);
        data.setTransferSceneReportInfos(transferSceneReportInfos);
        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();
            System.out.println("调用失败:" + errorObject);
            log.error("支付宝转账失败, outBizNo={}, error={}", dto.getOutBizNo(), errorObject);
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
                    "转账失败:" + (errorObject != null ? errorObject.toString() : e.getMessage()));
        }
    }
 
 
}