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()));
|
}
|
}
|
}
|