Java对接支付宝全过程详解
支付宝是中国最流行的支付平台之一,本文将详细介绍如何使用Java对接支付宝支付功能,包括环境准备、SDK配置、支付流程实现以及常见问题解决方案。
1. 准备工作
1.1 申请支付宝开放平台账号
在开始开发前,需要完成以下准备工作:
-
注册支付宝开放平台账号:https://open.alipay.com
-
创建应用并获取必要的参数:
-
APPID
-
应用私钥(RSA2)
-
支付宝公钥
-
支付宝网关地址
1.2 引入支付宝SDK
在Maven项目中添加支付宝SDK依赖:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.35.79.ALL</version>
</dependency>
2. 配置支付宝参数
创建配置类来管理支付宝相关参数:
package com.example.alipay.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AlipayConfig {
// 应用ID,您的APPID
@Value("${alipay.app-id}")
private String appId;
// 商户私钥,您的PKCS8格式RSA2私钥
@Value("${alipay.merchant-private-key}")
private String merchantPrivateKey;
// 支付宝公钥
@Value("${alipay.alipay-public-key}")
private String alipayPublicKey;
// 服务器异步通知页面路径,需http://格式的完整路径
@Value("${alipay.notify-url}")
private String notifyUrl;
// 页面跳转同步通知页面路径,需http://格式的完整路径
@Value("${alipay.return-url}")
private String returnUrl;
// 签名方式
private String signType = "RSA2";
// 字符编码格式
private String charset = "utf-8";
// 支付宝网关
private String gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 支付宝网关
@Value("${alipay.gateway-url:https://openapi.alipay.com/gateway.do}")
public void setGatewayUrl(String gatewayUrl) {
this.gatewayUrl = gatewayUrl;
}
// getter方法
public String getAppId() {
return appId;
}
public String getMerchantPrivateKey() {
return merchantPrivateKey;
}
public String getAlipayPublicKey() {
return alipayPublicKey;
}
public String getNotifyUrl() {
return notifyUrl;
}
public String getReturnUrl() {
return returnUrl;
}
public String getSignType() {
return signType;
}
public String getCharset() {
return charset;
}
public String getGatewayUrl() {
return gatewayUrl;
}
}
在application.properties
或application.yml
中配置相关参数:
# 支付宝配置
alipay.app-id=2021000000000000
alipay.merchant-private-key=MIIEvQIBADANBgkqhkiG9w0BAQEF...
alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ...
alipay.notify-url=http://your-domain.com/api/pay/alipay/notify
alipay.return-url=http://your-domain.com/api/pay/alipay/return
# 沙箱环境使用
# alipay.gateway-url=https://openapi.alipaydev.com/gateway.do
3. 创建支付宝服务类
package com.example.alipay.service;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.example.alipay.config.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AlipayService {
private final AlipayConfig alipayConfig;
private final AlipayClient alipayClient;
@Autowired
public AlipayService(AlipayConfig alipayConfig) {
this.alipayConfig = alipayConfig;
this.alipayClient = new DefaultAlipayClient(
alipayConfig.getGatewayUrl(),
alipayConfig.getAppId(),
alipayConfig.getMerchantPrivateKey(),
"json",
alipayConfig.getCharset(),
alipayConfig.getAlipayPublicKey(),
alipayConfig.getSignType());
}
/**
* 生成支付宝PC端支付表单
*
* @param outTradeNo 商户订单号
* @param totalAmount 订单金额
* @param subject 订单标题
* @param body 订单描述
* @return 支付表单HTML
*/
public String createPagePayForm(String outTradeNo, String totalAmount, String subject, String body) throws AlipayApiException {
// 创建API对应的request
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
// 设置回调地址
alipayRequest.setReturnUrl(alipayConfig.getReturnUrl());
alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl());
// 填充业务参数
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo(outTradeNo);
model.setTotalAmount(totalAmount);
model.setSubject(subject);
model.setBody(body);
model.setProductCode("FAST_INSTANT_TRADE_PAY");
alipayRequest.setBizModel(model);
// 调用SDK生成表单
return alipayClient.pageExecute(alipayRequest).getBody();
}
/**
* 查询订单状态
*
* @param outTradeNo 商户订单号
* @return 查询结果
*/
public AlipayTradeQueryResponse queryOrder(String outTradeNo) throws AlipayApiException {
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(outTradeNo);
request.setBizModel(model);
return alipayClient.execute(request);
}
/**
* 退款
*
* @param outTradeNo 商户订单号
* @param refundAmount 退款金额
* @param refundReason 退款原因
* @param outRequestNo 退款请求号
* @return 退款结果
*/
public AlipayTradeRefundResponse refund(String outTradeNo, String refundAmount, String refundReason, String outRequestNo) throws AlipayApiException {
AlipayTr