SpringBoot基于沙箱环境实现支付宝支付教程

2025-03-10 17:50

本文主要是介绍SpringBoot基于沙箱环境实现支付宝支付教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试...

一、支付宝沙箱环境介绍

沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境,开发者在沙箱环境中调用接口无需具备所需的商业资质,无需绑定和开通产品,同时不会对生产环境中的数据造成任何影响。

合理使用沙箱环境,可以让研发流程与商业流程并行,降低联调资损风险,加速项目的交付。

更为详细的说明可以看官方文档:https://opendocs.alipay.com/common/02kkv7

二、沙箱环境准备

2.1 注册入驻支付宝开放平台

登录支付宝开放平台,支付宝登录平台,找到开发接入入驻为开发者。

SpringBoot基于沙箱环境实现支付宝支付教程

2.2 配置沙箱环境

进入到开发者的控制台,找到最下方的开发者工具推荐 ,点击沙箱。

SpringBoot基于沙箱环境实现支付宝支付教程

2.3 沙箱应用

获取支付参数信息

打开沙箱应用后,需要拿到3个参数,appId,应用私钥,支付宝公钥,用于对接支付接口使用。

SpringBoot基于沙箱环境实现支付宝支付教程

SpringBoot基于沙箱环境实现支付宝支付教程

支付宝网关里的https://不要复制,会帮我们自动拼接

SpringBoot基于沙箱环境实现支付宝支付教程

三、SpringBoot 结合 支付宝沙箱

SpringBoot基于沙箱环境实现支付宝支付教程

3.1 pom.xml

<!--引入支付宝sdk -->
		<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
		<dependency>
			<groupId>com.alipay.sdk</groupId>
			<artifactId>alipay-easysdk</artifactId>
			<version>2.2.2</version>
		</dependency>

3.2 application.yml

spring:
  application:
    name:
      SpringBoot_Pay
alipay:
  appId: 9021000137619573
  appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC43Mr6YjCPwWDhb+d+2fxatYjDeJjrNKj78KY6oD2hatVAWsQvG/dw9Sr3bouit2rvOc6AQIem7CJQ3gQEvw15dn8Q4Uh+LWxBB5aujCjgr2Fvp0ELqHlnKNUgxACPgzfqLCpIYGcGI6zqrrGtA2PCD3TyjNbgyo18c4OZLLWhpokr2Ml7fI/F0h0irMM+zymupY2L/Q5Zjcf2Y7Z7cVFefOF+wI06CRCfpFQE9mjffH/MNHMdgxmY/mqvFE1slCPulmRi2wMDKV34dQZFQ0B0cMBMbIlwNFAa/QtEJ5xN3ksvNZ2VS7Fj9r5/Z7pEUtHEQT8OYbDnZye2OjHSKt1ZAgMBAAECggEACc1TSfF457Z2P53iZXyDf//OL6cuXJJfP3SkK8mhWvTCN/ZYHrNZ6xd23sXSy570IZksFOrXBofQzf7nsaS7vywEUs3PPTmFWvFfEQRHippiDTyOG2MkhM7KdkFOUk2/4j/TQiEydUXg/lSjASyD1p9hMRc8sZCr7eRmHvIa82Y9D078bprdzEDjcFRiLN8jxikpmCnezPcSmI2VwpKQIemo62HIuYD3iQUr+S0MYmlkH229HU4c9rBJ+MCjuDj9eWkyT7DhtmhFcUlQvae/lGQukRu4ZEIdY1eBvICJ2SExmH0oCu11CuPIeu2KSI5zaInnDr7bAsQRg90U+JFs7QKBgQDqbMv1/s8X6Cu/GfGMLJrVkANR6C+N0EhEzJ/53HowZopyVI1qaLmFpK7veMukPxVYbmO/h+iSbahQ1+S2Gw3CsEQDimGrC1+s1dhkrgFZhWTpVg3I1rIbXFkHDNvAa6+HgtB/ZIjP0qUrmGO+HipUSEmvCXNRV0L3TlWpco2G4wKBgQDJ4EV/KoPFk/XOJHGn/Kt6QhK+YOCC59835qOM3zX9f6klWGl+9NeIefxRcQ4kqDp4kCQzw+y5Ds7Lv5EYGiWsuYVN2ObcG+MLj0qisrMwE61mJ1bCXok7C+1ild3+FyXMBXqp7zuNog3rGwZAzS99x5ouELl/Mems1n/pt1NDkwKBgQC0E4UN34Hn5HIOZ3h0bCM4YFschRZagp+xMdrFzgaSvYImVysWjYHN1naHACy2a7sS5iF7lIQkT1YXW/CVruyAHHTyn09tW9xP4SlMFZp10RF2aKNIHxxMBkFhOBBqnI4Gs4dEBM9PjYlRlssv1O5BNhJcAg9ycWzAmo0VECkFbwKBgBD+hTswTAl87CtfXAYFOjY/i65lH2FFvb/J9aitPbFKZuXS7IaYe/BsPHZqqwMg+lMd5z5IVww5F+WFCeTahqNktrkX8k9DNbjKZkEOBBGfBnDcDOyt4qWK2n/7F8YFEtR6/ZmCnyPMKZnKG5um6kGPZQZNuB/iBsbbA8eb/DFrAoGAdM5Wn1q8G6uB7QsxHFfjir6kbvfrf3WMPDvIIDTKS49t0WucVvLPNtIPGCSb99MEWOEZvWvMhn0RmCZNHWX7Fy4HB4FcJW57aWvIDKwxEcI9gdy5Vmg0uRIsd3WPzcZxbTCERUvIXRgh/tacaTq9/wPTEq1vp0AGYXoJHQslxLs=
  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArEEt6BXEXKinvjjQooptYjjyJIy+4DHhxBK2BOMUWs2Ol9xQStPrkCz3gVwZg0yM1nIvv/G970u8siXL7GN42CbPEw3pythonhVimCjiclDn1qMaurTakOUtUT0RygF118wThny40rZYsMbnDs7uCV4yynI8/5dEhHvUfe4pZm3by8Wy+aNjlX9Fwn1FbRa8aWnZmglcEp92xGkIyhC7Yc/DJA7J4xc44mgWVcHy8lNJv7Cznoehsq9dAew5mpjYvRCr1PIwGHw8D9Tkz/T1gOREiiejaBwF3zZpEUhq85t1GBoyPKwGtsb2Ve8ribP3EfKbqORgOc9ay7CnMkz8KRTRuK4wIDAQAB
# 回调函数的地址 http://localhost:8080/api/alipay/notify
#  要使用公网地址,用路由侠进行内网穿透
  notifyUrl: https://o4662e9430.vicp.fun/api/alipay/notify
  gatewayHost: openapi-sandbox.dl.alipaydev.com

3.3 对应的配置类

package com.by.config;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotypepython.Component;

import Javax.annotation.PostConstruct;

@Component
@ConfigurationProperties(prefix = "alipay")
@Data
public class AlipayConfig {
    // 应用Id

    private String appId;
    // 应用私钥
    private String appPrivateKey;
    // 支付宝公钥
    private String publicKey;
    // 回调接口路径,要进行内网穿透
    private String notifyUrl;
    // 支付宝网关地址:配置文件中不要写https://,会自动补全
    private String gatewayHost;


    @PostConstruct
    public void init(){
        Config config = new Config();
        // 基础配置
        config.protocol = "https";
        config.gatewayHost = this.gatewayHost;// 支付宝网关地址
        config.signType = "RSA2";

        // 业务配js置
        config.appId = this.appId;
        config.merchantPrivateKey = this.appPrivateKey;
        config.alphpipayPublicKey = this.publicKey;
        config.notifyUrl = this.notifyUrl;

        // 将配置信息, 添加到相应的工厂类
        Factory.setOptions(config);
        System.out.println("支付宝初始化配置完成");

    }

}

3.4 支付接口,和支付的回调接口

package com.by.controller;

import com.alipay.easysdk.factory.Factory;
import com.aliandroidpay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api/alipay")
public class PayController {

    /**
     * 订单支付接口, 核心是调用支付宝的 Factory.Payment.Page().pay() 方法
     * @param subject  支付对象信息
     * @param outTradeNo  订单号
     * @param totalAmount 订单金额
     * @param returnUrl   支付成功以后返回的页面地址
     * @return
     */
    @GetMapping
    public String pay(String subject, String outTradeNo, String totalAmount,String returnUrl) throws Exception {
        AlipayTradePagePayResponse response = Factory.Payment.Page().pay(subject, outTradeNo, totalAmount, returnUrl);
        String body = response.getBody();
        return body;
    }


    /**
     * 支付回调接口,如果支付成功,支付宝将会请求此接口,将成功信息返回
     */
    @PostMapping("/notify")
    public String notify(@RequestParam Map parameterMap) throws Exception {
        String tradeStatus = parameterMap.getOrDefault("trade_status","").toString();

        if (tradeStatus.trim().equals("TRADE_SUCCESS")) {
            // 验证请求的有效性
            if (Factory.Payment.Common().verifyNotify(parameterMap)) {
                System.out.println("通过支付宝的验证");
                System.out.println("订单id:" + parameterMap.get("out_trade_no"));
            }else {
                System.out.println("支付验证不通过");
            }
        }
        return "success";
    }

}

3.5 支付页面 apy.html

传递的参数用于支付接口接收 ,其中里的

  • subject 商品名称或交易标题
  • outTradeNo 商户订单号
  • totalAmount 订单总金额,单位为元
  • returnUrl 订单返回URL,本来应该为http://localhost:8080/payok.html?orderId=1001,要传递一个下单id,因为有问号,所以要进行url编码

SpringBoot基于沙箱环境实现支付宝支付教程

<body>
<a href="/api/alipay?subject=商品支付&outTradeNo=3123&totalAmount=16.8&returnUrl=http%3A%2F%2Flocalhost%3A8080%2Fpayok.html%3ForderId%3D1001" rel="external nofollow"  class="a">
    <img src="https://zhengxin-pub.bj.bcebos.com/logopic/a9936a369e82e0c6c42112674a5220e8_fullsize.jpg?x-bce-process=image/resize,m_lfit,w_200" alt="SpringBoot基于沙箱环境实现支付宝支付教程">
    <h2>支付宝支付</h2>
</a>
</body>

3.6 支付成功的页面 payok.html

<div class="alert alert-primary" role="alert">
    支付成功
</div>

四、测试

4.1 访问http://localhost:8080/pay.html

SpringBoot基于沙箱环境实现支付宝支付教程

SpringBoot基于沙箱环境实现支付宝支付教程

SpringBoot基于沙箱环境实现支付宝支付教程SpringBoot基于沙箱环境实现支付宝支付教程

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于SpringBoot基于沙箱环境实现支付宝支付教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153683

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2