在Spring Boot项目中集成支付宝的网站支付、APP支付、单笔转账给用户以及退款功能,可以通过以下步骤实现:
1. 项目准备
1.1 添加依赖
在
pom.xml
中添加支付宝SDK依赖:<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.79.ALL</version>
</dependency>
1.2 配置支付宝参数
在
application.yml
或application.properties
中配置支付宝相关参数:alipay:
app-id: your-app-id
merchant-private-key: your-private-key
alipay-public-key: alipay-public-key
notify-url: http://your-domain/notify
return-url: http://your-domain/return
gateway-url: https://openapi.alipay.com/gateway.do
format: json
charset: utf-8
sign-type: RSA2
2. 支付功能实现
2.1 网站支付
创建支付服务类
AlipayService
,实现网站支付功能:import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
@Service
public class AlipayService {
@Autowired
private Environment env;
public String createWebPayment(String subject, String totalAmount) {
AlipayClient alipayClient = new DefaultAlipayClient(
env.getProperty("alipay.gateway-url"),
env.getProperty("alipay.app-id"),
env.getProperty("alipay.merchant-private-key"),
"json",
"UTF-8",
env.getProperty("alipay.alipay-public-key"),
"RSA2");
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(env.getProperty("alipay.return-url"));
request.setNotifyUrl(env.getProperty("alipay.notify-url"));
request.setBizContent("{"
+ "\"out_trade_no\":\"" + UUID.randomUUID().toString() + "\","
+ "\"total_amount\":\"" + totalAmount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\""
+ "}");
try {
return alipayClient.pageExecute(request).getBody();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
2.2 APP支付
APP支付的实现方式类似,但需要调用
AlipayTradeAppPayRequest
接口,生成支付参数后返回给APP客户端。3. 单笔转账给用户
实现单笔转账功能:
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
public String transfer(String outBizNo, String payeeAccount, String amount) {
AlipayClient alipayClient = new DefaultAlipayClient(
env.getProperty("alipay.gateway-url"),
env.getProperty("alipay.app-id"),
env.getProperty("alipay.merchant-private-key"),
"json",
"UTF-8",
env.getProperty("alipay.alipay-public-key"),
"RSA2");
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
request.setBizContent("{"
+ "\"out_biz_no\":\"" + outBizNo + "\","
+ "\"payee_type\":\"ALIPAY_LOGON_ID\","
+ "\"payee_account\":\"" + payeeAccount + "\","
+ "\"amount\":\"" + amount + "\","
+ "\"remark\":\"转账备注\""
+ "}");
try {
return alipayClient.execute(request).getBody();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
4. 退款功能
实现退款功能:
import com.alipay.api.request.AlipayTradeRefundRequest;
public String refund(String outTradeNo, String refundAmount) {
AlipayClient alipayClient = new DefaultAlipayClient(
env.getProperty("alipay.gateway-url"),
env.getProperty("alipay.app-id"),
env.getProperty("alipay.merchant-private-key"),
"json",
"UTF-8",
env.getProperty("alipay.alipay-public-key"),
"RSA2");
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizContent("{"
+ "\"out_trade_no\":\"" + outTradeNo + "\","
+ "\"refund_amount\":\"" + refundAmount + "\""
+ "}");
try {
return alipayClient.execute(request).getBody();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
5. 异步通知处理
创建一个Controller处理支付宝的异步通知:
@PostMapping("/notify")
public String handleNotify(HttpServletRequest request) {
Map<String, String> params = request.getParameterMap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()[0]));
boolean verifyResult = AlipaySignature.rsaCheckV1(params, env.getProperty("alipay.alipay-public-key"), "UTF-8", "RSA2");
if (verifyResult) {
String outTradeNo = params.get("out_trade_no");
String totalAmount = params.get("total_amount");
// 更新订单状态等业务逻辑
return "success";
} else {
return "fail";
}
}
6. 安全与测试
-
签名验证:确保所有回调和请求都进行签名验证,防止数据被篡改。
-
HTTPS配置:强制使用HTTPS,保护用户数据。
-
沙箱测试:在支付宝沙箱环境中测试支付、退款、回调等功能。
通过以上步骤,你可以在Spring Boot项目中完整实现支付宝的网站支付、APP支付、单笔转账和退款功能。