1.介绍
支付宝是中国最大的第三方支付平台之一,提供了多种支付方式,其中当面付是一种常用的支付方式。通过集成支付宝的当面付功能,开发者可以在自己的应用中实现便捷的支付体验。本文将介绍如何在Spring Boot项目中集成支付宝的当面付功能,包括原理和示例代码。
2.原理
支付宝的当面付流程主要包括以下几个步骤:
- 创建订单:用户在应用中选择商品并生成订单。
- 调用支付宝接口:应用向支付宝的支付接口发送请求,生成支付二维码。
- 用户扫码支付:用户使用支付宝扫描二维码进行支付。
- 支付结果通知:支付宝会将支付结果通过异步通知的方式告知应用。
- 查询订单状态:应用可以根据需要查询订单的支付状态。
3.环境准备
在开始之前,请确保你已经完成以下准备工作:
- 注册支付宝商户账号,并获取应用的
APP_ID
和商户私钥
。 - 下载支付宝的 SDK,并将其添加到你的项目中。
个人如何申请当面付流程请参考这个链接blog.csdn.net/weixin_6405…
4.示例代码
1. 添加依赖
在你的 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>
2. 配置支付宝参数
在 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: 你的返回地址
3. 创建支付服务
创建一个支付服务类,用于处理订单支付逻辑:
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();
}
}
}
4. 创建控制器
创建一个控制器,处理前端请求并返回二维码:
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";
}
}
}
5. 支付结果通知
支付宝会通过异步通知的方式告知支付结果,你需要创建一个接口来接收这个通知:
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"; // 返回成功响应
}
}
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
- github.com/Harries/spr…(Alipay-facetoface)
5.测试
启动Spring boot应用,访问http://127.0.0.1:8088/[](www.liuhaihua.cn/wp-content/…](p3-xtjj-sign.byteimg.com/tos-cn-i-73…)](www.liuhaihua.cn/wp-content/…
6.总结
通过以上步骤,你可以在Spring Boot项目中成功集成支付宝的当面付功能。用户可以通过扫描二维码进行支付,支付结果也可以通过异步通知进行处理。根据实际需求,你可以进一步扩展功能,例如订单查询、退款等。