原创

Spring Boot 集成支付宝当面付

1.介绍

支付宝是中国最大的第三方支付平台之一,提供了多种支付方式,其中当面付是一种常用的支付方式。通过集成支付宝的当面付功能,开发者可以在自己的应用中实现便捷的支付体验。本文将介绍如何在Spring Boot项目中集成支付宝的当面付功能,包括原理和示例代码。

2.原理

支付宝的当面付流程主要包括以下几个步骤:

  1. 创建订单:用户在应用中选择商品并生成订单。
  2. 调用支付宝接口:应用向支付宝的支付接口发送请求,生成支付二维码。
  3. 用户扫码支付:用户使用支付宝扫描二维码进行支付。
  4. 支付结果通知:支付宝会将支付结果通过异步通知的方式告知应用。
  5. 查询订单状态:应用可以根据需要查询订单的支付状态。

3.环境准备

在开始之前,请确保你已经完成以下准备工作:

  1. 注册支付宝商户账号,并获取应用的 APP_ID 和 商户私钥
  2. 下载支付宝的 SDK,并将其添加到你的项目中。
个人如何申请当面付流程请参考这个链接https://blog.csdn.net/weixin_64051447/article/details/129816337

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"; // 返回成功响应
    }
}

5.测试

启动Spring boot应用,访问http://127.0.0.1:8088/ order 点击提交 pretrade 使用支付宝app扫描支付

6.总结

通过以上步骤,你可以在Spring Boot项目中成功集成支付宝的当面付功能。用户可以通过扫描二维码进行支付,支付结果也可以通过异步通知进行处理。根据实际需求,你可以进一步扩展功能,例如订单查询、退款等。

7.引用

正文到此结束
Loading...