Spring Boot 集成支付宝沙箱支付

Spring Boot集成支付宝沙箱支付

1、注册支付宝开发者账户,进入开发者控制台

https://openhome.alipay.com/platform/developerIndex.htm

支付宝沙箱支付

沙箱界面:

沙箱界面

2、Spring Boot集成沙箱支付

1、导入Maven依赖

<!--支付宝沙箱支付-->
<dependency>
	<groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.22.110.ALL</version>
</dependency>

2、在application.yml进行配置

alipay:
  appId: 
  appPrivateKey:
  alipayPublicKey: 
  notifyUrl: 

alipay配置1
alipay配置2

3、内网穿透:https://natapp.cn/ 配置免费隧道

alipay配置3

4、下载客户端并解压,配置authtoken

alipay配置4
alipay配置5

5、双击start.bat启动 ,启动后不要关闭

alipay配置6

6、更新application.yml的配置,如果是在本地运行,每次启动项目的时候都要启动start.bat,并且都要更改notifyUrl

alipay:
  appId: 
  appPrivateKey:
  alipayPublicKey: 
  # 这里的notifyUrl是:上面的红圈部分/alipay/notify
  notifyUrl: http://zg689r.natappfree.cc/alipay/notify   

7、Java配置沙箱支付:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
    private String appId;
    private String appPrivateKey;
    private String alipayPublicKey;
    private String notifyUrl;
}
import lombok.Data;

@Data
public class AliPay {
    private String traceNo;
    private double totalAmount;
    private String subject;
    private String alipayTraceNo;
}
import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.example.springbootdesign.common.config.AliPayConfig;
import com.example.springbootdesign.controller.dto.AliPay;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/alipay")
public class AliPayController {

    private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
    private static final String FORMAT = "JSON";
    private static final String CHARSET = "UTF-8";
    //签名方式
    private static final String SIGN_TYPE = "RSA2";

    @Resource
    private AliPayConfig aliPayConfig;

    @GetMapping("/pay")
    public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
        // 1. 创建Client,通用SDK提供的Client,负责调用支付宝的API
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
                aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);

        // 2. 创建 Request并设置Request参数
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 发送请求的 Request类
        request.setNotifyUrl(aliPayConfig.getNotifyUrl());
        JSONObject bizContent = new JSONObject();
        bizContent.set("out_trade_no", aliPay.getTraceNo());  // 我们自己生成的订单编号
        bizContent.set("total_amount", aliPay.getTotalAmount()); // 订单的总金额
        bizContent.set("subject", aliPay.getSubject());   // 支付的名称
        bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置
        request.setBizContent(bizContent.toString());

        // 执行请求,拿到响应的结果,返回给浏览器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset=" + CHARSET);
        httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

    @PostMapping("/notify")  // 注意这里必须是POST接口
    public String payNotify(HttpServletRequest request) throws Exception {
        if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
            System.out.println("=========支付宝异步回调========");

            Map<String, String> params = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
                System.out.println(name + " = " + request.getParameter(name));
            }

            String tradeNo = params.get("out_trade_no");
            String gmtPayment = params.get("gmt_payment");
            String alipayTradeNo = params.get("trade_no");

            String sign = params.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(params);
            boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, aliPayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名
            // 支付宝验签
            if (checkSignature) {
                // 验签通过
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));

                //更新订单为已支付,这里根据自己的订单来操作


            }
        }
        return "success";
    }

}

8、启动项目,测试运行

测试URL:http://localhost:9090/alipay/pay?subject=xxx&traceNo=xxx&totalAmount=1000

其中subject为交易名称,traceNo为订单号,totalAmount为支付金额

浏览器输入URL:http://localhost:9090/alipay/pay?subject=支付宝沙箱支付&traceNo=112121313123&totalAmount=1000

运行结果:

支付的账号密码在沙箱界面的沙箱账号
沙箱支付账号
支付宝支付界面
沙箱支付成功

### Spring Boot支付宝沙箱模拟支付的流程图及实现步骤 #### 一、整体流程概述 Spring Boot 集成支付宝沙箱模拟支付的核心在于理解其完整的支付流程。以下是基于已有引用内容整理的整体流程: 1. **初始化配置** 开发者需完成实名认证并获取免费隧道服务,随后调整本地开发环境的相关配置文件以匹配实际需求[^1]。 2. **用户下单操作** 用户在前端界面确认订单详情后触发“立即支付”按钮,此时向服务器发送请求(如 `/pay` 接口),传递必要的订单参数(如商品 ID、数量等)。此阶段涉及客户端与服务器之间的数据交换[^2]。 3. **服务器端逻辑处理** - 根据接收到的商品信息及其他附加条件(例如优惠券应用情况),动态计算最终应付金额。 - 构造唯一订单编号用于区分不同交易记录。 - 调用支付宝官方 API 提交前述组装好的必要字段至网关地址 `https://openapi.alipaydev.com/gateway.do?` 进行下一步验证[^2]。 4. **生成支付页面** 成功接收来自支付宝平台反馈的数据包之后,通常包含一段嵌入式的 HTML 片段用来渲染具体的付款视图组件;接着将这部分内容原样回传给浏览器呈现出来供消费者继续操作[^2]。 5. **同步通知机制** 当整个资金流转结束以后,系统会依据预设规则自动跳转会特定 URL 地址告知当前状态改变情形 —— 即所谓 “Return_URL”。不过需要注意的是该环节仅适用于简单提示性质的功能展现而非正式结算依据[^2]。 6. **异步回调校验** 更加严谨可靠的判定手段则依靠后台监听器捕捉由第三方推送过来的消息体并通过签名算法加以甄别真伪状况进而落实关联事务管理诸如更新数据库表结构或者发放奖励措施等等。 --- #### 二、具体技术要点解析 ##### (一)引入依赖库 为了便于项目快速接入功能模块,推荐采用 Maven 方式声明所需外部资源如下所示: ```xml <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.4.27.ALL</version> </dependency> ``` 上述片段明确了版本号的选择标准以便于后续维护升级工作顺利开展[^3]。 ##### (二)编写核心代码示例 以下列举部分关键方法实现概览: ###### 1. 创建 AlipayClient 对象实例化连接通道 ```java AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipaydev.com/gateway.do", app_id, merchant_private_key, "json", charset, alipay_public_key, sign_type); ``` ###### 2. 组织请求参数封装实体类对象 ```java AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.setBizContent("{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":" + total_amount + "," + "\"subject\":\"" + subject + "\"," "} "); ``` ###### 3. 执行远程调用获得响应结果字符串形式表达 ```java String result = alipayClient.pageExecute(request).getBody(); // 返回HTML格式的内容可以直接输出到前端展示区域 ``` 以上三段分别展示了如何建立通信桥梁、准备传输资料以及最后取得目标产物三个重要组成部分的具体表现形态[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值