支付寶企業轉賬到支付寶賬戶
準備工作
- 注冊企業支付寶,企業認證
- 產品中心(支付寶商家平臺)->簽約轉賬到支付寶賬戶
- 創建應用(支付寶開放平臺)默認簽約會有一個應用
相關網站
- 支付寶開發文檔:https://opendocs.alipay.com/open/309/106235?ref=api
- 支付寶開放平臺:https://open.alipay.com/
- 支付寶商家平臺:https://b.alipay.com/page/home
注意事項
- 創建的支付寶應用需要綁定對應的產品才可以使用
- 應用需要上線審核通過接口才可以調用
- 接口加簽方式必須使用證書方式
- 轉賬需要賬號和實名認證姓名一致
代碼示例
阿里SDK
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.72.ALL</version>
</dependency>
單例模式工具類
本示例所有證書都放在
resource/certs目錄下載加載,方便遷移,如果放在其他路徑,項目遷移每次都需手動上傳服務器。
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundTransUniTransferModel;
import com.alipay.api.domain.Participant;
import com.alipay.api.internal.util.file.FileUtils;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* @description:
* @author: Mr.Fang
* @create: 2023-9-8
**/
@Slf4j
public class AlipayUtil {
private String URL = "https://openapi.alipay.com/gateway.do";
private String APPID = "應用APPID";
private String app_private_key = "certs/appPrivate.txt";
private String CHARSET = "UTF8";
private String FORMAT = "json";
private String SIGN_TYPE = "RSA2";
private String app_cert_path = "certs/appCertPublicKey.crt";
private String alipay_cert_path = "certs/alipayCertPublicKey_RSA2.crt";
private String alipay_root_cert_path = "certs/alipayRootCert.crt";
private AlipayConfig alipayConfig;
private static AlipayUtil instance;
// 無慘構造,默認加載支付寶配置信息
private AlipayUtil() throws IOException {
alipayConfig = new AlipayConfig();
//設置網關地址
alipayConfig.setServerUrl(URL);
//設置應用ID
alipayConfig.setAppId(APPID);
//設置應用私鑰
alipayConfig.setPrivateKey(readToString(new ClassPathResource(app_private_key).getInputStream()));
//設置請求格式,固定值json
alipayConfig.setFormat(FORMAT);
//設置字符集
alipayConfig.setCharset(CHARSET);
//設置簽名類型
alipayConfig.setSignType(SIGN_TYPE);
//設置應用公鑰證書路徑
alipayConfig.setAppCertContent(readToString(new ClassPathResource(app_cert_path).getInputStream()));
//設置支付寶公鑰證書路徑
alipayConfig.setAlipayPublicCertContent(readToString(new ClassPathResource(alipay_cert_path).getInputStream()));
//設置支付寶根證書路徑
alipayConfig.setRootCertContent(readToString(new ClassPathResource(alipay_root_cert_path).getInputStream()));
}
/**
* 讀取 resource 文件
*
* @param inputStream
* @return
*/
private String readToString(InputStream inputStream) {
try {
DataInputStream dataInputStream = new DataInputStream(inputStream);
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = dataInputStream.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
return output.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static AlipayUtil getInstance() throws IOException {
if (instance == null) {
synchronized (AlipayUtil.class) {
if (instance == null) {
instance = new AlipayUtil();
}
}
}
return instance;
}
/**
* description: 支付寶企業轉賬到個人
* create by: Mr.Fang
*
* @param bizNo 訂單編號
* @param amount 金額
* @param title 轉賬說明
* @param identity 支付寶手機號或郵箱
* @param name 支付寶真實姓名
* @return: Result<java.lang.String>
* @date: 2023/9/8
*/
public Result<String> transfer(String bizNo, String amount, String title, String identity, String name) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
model.setOutBizNo(bizNo); // 訂單編號
model.setTransAmount(amount); // 金額
model.setBizScene("DIRECT_TRANSFER");
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
model.setOrderTitle(title); // 訂單標題
Participant payeeInfo = new Participant();
payeeInfo.setIdentity(identity); // 用戶支付寶賬戶
payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); // 固定值
payeeInfo.setName(name); // 用戶真實姓名
model.setPayeeInfo(payeeInfo);
request.setBizModel(model);
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
log.info("轉賬響應結果:{}", response.getBody());
if (response.isSuccess()) {
return Result.OK("轉賬成功", response.getBody());
}
return Result.error("轉賬失敗", response.getBody());
}
}
resource目錄擴展
- springboot 打包jar文件后通過
ClassPathResource對象可以獲取到文件,但是文件路徑是無法使用的。 - 阿里提供的
AlipayConfig對象支持配置證書相關參數有兩種方式:第一種證書內容,第二種文件路徑。 - 通過
ClassPathResource拿到文件對象,readToString方法讀取文件內容配置證書內容信息。
AlipayConfig 部分代碼
public void setRootCertPath(String rootCertPath) {
this.rootCertPath = rootCertPath;
}
……………………省略
public void setRootCertContent(String rootCertContent) {
this.rootCertContent = rootCertContent;
}
哇!又賺了一天人民幣

浙公網安備 33010602011771號