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

目录

一、支付宝沙箱环境介绍

二、沙箱环境准备

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

2.2 配置沙箱环境

2.3 沙箱应用

 三、SpringBoot 结合 支付宝沙箱

3.1 pom.xml

3.2 application.yml

3.3 对应的配置类

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

3.5 支付页面 apy.html

3.6 支付成功的页面 payok.html

四、测试

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


一、支付宝沙箱环境介绍

    沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境,开发者在沙箱环境中调用接口无需具备所需的商业资质,无需绑定和开通产品,同时不会对生产环境中的数据造成任何影响。合理使用沙箱环境,可以让研发流程与商业流程并行,降低联调资损风险,加速项目的交付。更为详细的说明可以看官方文档:https://opendocs.alipay.com/common/02kkv7

二、沙箱环境准备

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

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

2.2 配置沙箱环境

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

2.3 沙箱应用

  • 获取支付参数信息

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

 

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

 三、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/G970u8siXL7GN42CbPEw3hVimCjiclDn1qMaurTakOUtUT0RygF118wThny40rZYsMbnDs7uCV4yynI8/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.stereotype.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";

        // 业务配置
        config.appId = this.appId;
        config.merchantPrivateKey = this.appPrivateKey;
        config.alipayPublicKey = 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.alipay.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编码 

 

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

3.6 支付成功的页面 payok.html

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

四、测试

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

做好智慧校园的顶层设计,助力教育信息化发展

教育信息化已被视为我国教育事业发展的重要支撑。随着国家教育信息化一系列重大工程的部署和实施&#xff0c;我国教育信息化进入快速发展时期&#xff0c;取得了显著成绩。我们认识到国家教育信息化正由初步应用融合阶段向着全面融合创新阶段过度&#xff0c;无论从国家地区的…

炫酷网页设计:HTML5 + CSS3打造8种心形特效

你以为520过去了&#xff0c;你就逃过一劫了&#xff1f;那不是还有分手呢&#xff0c;那不是还得再找对象呢&#xff0c;那不是还有七夕节呢&#xff0c;那不是还有纪念日呢&#xff0c;那不是还有各种各样的节日呢&#xff0c;所以呀&#xff0c;这8种HTML5 CSS3打造8种心形…

Java.lang.InterruptedException被中止异常解决方案

大家好&#xff01;我是咕噜铁蛋&#xff01;在Java编程的世界里&#xff0c;java.lang.InterruptedException是一个常见的异常&#xff0c;尤其是在处理多线程和并发任务时。这个异常通常表示一个线程在等待、休眠或其他占用时间不长的操作时被中断。作为一个资深的Java开发者…

Timeline

SignalTrack信号轨道和自定义带参数的Marker信号和轨道 MySignalReceiver using System; using System.ComponentModel; using UnityEngine.Playables; using UnityEngine.Events;namespace UnityEngine.Timeline { public class BaseSignalReceiver<T, Q> : MonoBeha…

04-Vue:ref获取页面节点--很简单

目录 前言在Vue中&#xff0c;通过 ref 属性获取DOM元素使用 ref 属性获取整个子组件&#xff08;父组件调用子组件的方法&#xff09; 前言 我们接着上一篇文章 03-02-Vue组件之间的传值 来讲。 下一篇文章 05-Vue路由 在Vue中&#xff0c;通过 ref 属性获取DOM元素 我们当然…

CTFHUB技能树——SSRF(三)

目录 URL Bypass 数字IP Bypass 302跳转 Bypass DNS重绑定 Bypass SSRF绕过方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口号 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

LabVIEW和ZigBee无线温湿度监测

LabVIEW和ZigBee无线温湿度监测 随着物联网技术的迅速发展&#xff0c;温湿度数据的远程无线监测在农业大棚、仓库和其他需环境控制的场所变得日益重要。开发了一种基于LabVIEW和ZigBee技术的多区域无线温湿度监测系统。系统通过DHT11传感器收集温湿度数据&#xff0c;利用Zig…

攻防世界-mobile-easy-app详解

序言 这道题网上很多分析&#xff0c;但是分析的都是arm版本的&#xff0c;我选了arm64的来分析&#xff0c;arm64相比arm难度高一些&#xff0c;因为arm64编译器搞了inline优化&#xff0c;看起来略抽象 分析 这道题逻辑很简单&#xff0c;输入flag然后一个check函数验证&a…

Python 造数据神器Faker

大家好&#xff0c;在编写代码过程中&#xff0c;我们经常需要一些假数据来进行测试或者演示。手动创建这些数据不仅耗时&#xff0c;而且容易出错。幸运的是&#xff0c;Python有一个非常有用的库叫做Faker&#xff0c;它可以生成各种类型的假数据&#xff0c;从名字、地址到公…

学习图形推理

学习图形推理 1.位置规律1.1平移1.2翻转、旋转2.样式规律2.1加减异同2.2黑白运算3.属性规律3.1对称性3.2曲直性3.3开闭性4.数量规律4.1面4.2线数量4.3笔画数4.4点数量4.5素数量5.空间重构5.1相对面5.2相邻面-公共边5.3相邻面-公共点5.4相邻面-画边法题型 一组图:从左往右找规律…

在代码中集成sentry项目

创建团队和项目 选择项目进入设置 选择错误跟踪选择对应的项目类型 根据配置和测试信息配置sentry项目到代码中并测试

如何用VSCode debug Python文件

诸神缄默不语-个人CSDN博文目录 需求&#xff1a;我其实一般都用print大法来“调试”程序&#xff0c;但是有时对于机械性比较强但是又有些复杂的程序&#xff0c;还是debug比较方便。 debug功能我之前用过NetBeans和eclipse&#xff0c;应该可以明显看出来我是Java转Python党…

虚拟ECU:彻底改变汽车软件开发与测试

汽车开发领域有着垂直性较强的一系列需求&#xff0c;其中最为瞩目的需求之一就是对安全高效的软件测试方法的需求。传统的汽车开发偏向使用硬件原型与真实ECU进行软件测试&#xff0c;但由于硬件设备往往在开发周期的中后阶段才生产完成&#xff0c;给汽车开发带来了成本与时间…

微软刚发布的Copilot+PC为什么让Intel和AMD尴尬?2024 AI PC元年——产业布局及前景展望

美国东部时间5月20日在微软位于华盛顿的新园区举行的发布会上&#xff0c;宣布将旗下AI助手Copilot全面融入Windows系统&#xff0c;能够在不调用云数据中心的情况下处理更多人工智能任务。 “将世界作为一个提示词就从Windows系统开始”。微软的新PC将是“CopilotPC”&#xf…

【SQL】外连接 LEFT JOIN

目录 一.内连接与外连接 1.内连接&#xff08;inner join&#xff09; 2.外连接&#xff08;outer join&#xff09; 二.两表连接 1.我们先来试试看内连接&#xff1a; 2.我们再来试试外连接 三.单表外连接 四.总结 一.内连接与外连接 先得介绍内连接和外连接两个概念&…

esp32(8266)如何在platformio中上传文件到单片机

本来认为这是基础内容&#xff0c;不用我来介绍&#xff0c;结果&#xff0c;在个人的单片机字库开源项目 GitHub - StarCompute/tftziku: 这是一个通过单片机在各种屏幕上显示中文的解决方案 中有两个人问到了&#xff0c;就特别来说明一下&#xff1a; 在platformio中新建一…

音视频开发7 音视频转换格式流程

先看条转换视频文件的命令 我们的目的是将 源文件 source_1920x1080.mp4 转换成 目标文件 dest_1280x720.flv ffmpeg -i source_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 dest_1280x720.flv -acodec copy 的意思是&#xff0c;目标的 音频格式 使用和 源文…

vue 引入 emoji 表情包

vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…

操作系统中的内存管理

虚拟内存 操作系统会提供一种机制&#xff0c;将不同进程的虚拟地址和不同内存的物理地址映射起来。如果程序要访问虚拟地址的时候&#xff0c;由操作系统转换成不同的物理地址&#xff0c;这样不同的进程运行的时候&#xff0c;写入的是不同的物理地址&#xff0c;这样就不会冲…