支付宝是中国最大的第三方支付平台之一,提供了多种支付方式,其中当面付是一种常用的支付方式。通过集成支付宝的当面付功能,开发者可以在自己的应用中实现便捷的支付体验。本文将介绍如何在Spring Boot项目中集成支付宝的当面付功能,包括原理和示例代码。
支付宝的当面付流程主要包括以下几个步骤:
在开始之前,请确保你已经完成以下准备工作:
APP_ID
和 商户私钥
。在你的 pom.xml
文件中添加支付宝 SDK 的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot-demo</artifactId>
<groupId>com.et</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Alipay-facetoface</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入支付宝-->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.35.37.all</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
</project>
在 application.properties
文件中配置支付宝相关参数:
server:
port: 8088
alipay:
app_id: xxx
merchant_private_key:xxxxx
alipay_public_key:xxx
gateway_url: https://openapi.alipay.com/gateway.do
notify_url: 你的回调通知地址
return_url: 你的返回地址
创建一个支付服务类,用于处理订单支付逻辑:
package com.et.service;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.et.config.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AlipayService {
@Autowired
private AlipayConfig alipayConfig;
public String createOrder(String outTradeNo, String totalAmount, String subject) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getAppId(), alipayConfig.getMerchantPrivateKey(), "json", "UTF-8", alipayConfig.getAlipayPublicKey(), "RSA2");
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\",\"total_amount\":\"" + totalAmount + "\",\"subject\":\"" + subject + "\"}");
request.setNotifyUrl(alipayConfig.getNotifyUrl());
request.setReturnUrl(alipayConfig.getReturnUrl());
try {
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
return response.getQrCode(); // 返回二维码链接
} else {
return "创建支付失败: " + response.getMsg();
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "异常: " + e.getMessage();
}
}
public String queryPayment(String outTradeNo) {
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getAppId(), alipayConfig.getMerchantPrivateKey(), "json", "UTF-8", alipayConfig.getAlipayPublicKey(), "RSA2");
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"}");
try {
AlipayTradeQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
return response.getTradeStatus(); // 返回订单状态
} else {
return "查询失败: " + response.getMsg();
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "异常: " + e.getMessage();
}
}
}
创建一个控制器,处理前端请求并返回二维码:
package com.et.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.et.service.AlipayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class PaymentController {
@Autowired
private AlipayService alipayService;
@GetMapping("/")
public String index() {
return "index";
}
@PostMapping("/createOrder")
public String createOrder(@RequestParam String totalAmount, @RequestParam String subject, Model model) {
String outTradeNo = "ORDER_" + System.currentTimeMillis(); // 生成订单号
try {
String qrCodeUrl = alipayService.createOrder(outTradeNo, totalAmount, subject);
model.addAttribute("qrCodeUrl", qrCodeUrl);
model.addAttribute("totalAmount", totalAmount);
model.addAttribute("subject", subject);
model.addAttribute("outTradeNo", outTradeNo);
return "payment";
} catch (Exception e) {
model.addAttribute("error", "创建订单失败");
return "error";
}
}
@PostMapping("/queryPayment")
public String queryPayment(String outTradeNo) {
String TradeStatus=alipayService.queryPayment(outTradeNo);
if(TradeStatus.equals("TRADE_SUCCESS")||TradeStatus.equals("TRADE_FINISHED")){
return "success";
}else{
return "error";
}
}
}
支付宝会通过异步通知的方式告知支付结果,你需要创建一个接口来接收这个通知:
package com.et.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class NotificationController {
@PostMapping("/notify")
public String handleNotification(@RequestBody String notification) {
// 解析通知内容并进行相应处理
// 例如:更新订单状态等
log.info("Received notification: {}", notification);
return "success"; // 返回成功响应
}
}
通过以上步骤,你可以在Spring Boot项目中成功集成支付宝的当面付功能。用户可以通过扫描二维码进行支付,支付结果也可以通过异步通知进行处理。根据实际需求,你可以进一步扩展功能,例如订单查询、退款等。