支付宝沙箱环境使用

news2025/2/27 8:14:57

第一步、开通支付宝开放平台账户  https://open.alipay.com/

第二步、选择沙箱环境,按照官方文档操作即可 https://opendocs.alipay.com/common/02kkv7

进入沙箱控制台 https://open.alipay.com/develop/sandbox/app

第三步、配置接口的加密方式,选择自定义密钥

商户生成一对应用公钥和应用私钥,应用私钥商户需要自行保管,用于支付时的加密操作,应用公钥需要上传给支付宝用于对商户的支付进行验证。同时支付宝也会根据商户上传的应用公钥生成一对支付宝应用公钥和私钥,其中支付宝私钥用于对支付结果进行加密,支付宝公钥交给商户用于对支付结果的验证,支付宝私钥则由支付宝秘密保管,不对外公开。

将生成的应用公钥填入沙箱控制台的接口加密配置中,保存后支付宝沙箱会根据填入的应用公钥生成一个支付宝公钥

整合进项目

1、引入依赖:

参考官网:https://opendocs.alipay.com/open/54/103419

通用版,需要jdk1.6+

<dependency>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-sdk-java</artifactId>
   <version>4.35.45.ALL</version>
</dependency>

简化版,需要jdk1.8+

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.2.0</version>
</dependency>

推荐使用通用版

  1. 配置参数,使用自定义配置动态配置

@Getter
@Setter
@Component
@PropertySource("classpath:/pay/alipay.properties")
@ConfigurationProperties(prefix = "alipay")
public class AliPayProperties {

    /**
     * 在支付宝中注册的应用ID
     */
    private String appId;

    /**
     * 开发者应用私钥,由开发者自己生成
     */
    private String privateKey;

    /**
     * 支付宝公钥,由支付宝生成
     */
    private String publicKey;

    /**
     * 支付宝网关(固定)
     */
    private String serverUrl;

    /**
     * 服务器异步支付结果通知页面路径,必须外网可以正常访问
     */
    private String notifyUrl;

    /**
     * 页面跳转同步通知页面路径,必须外网可以正常访问 商户可以自定义同步跳转地址
     */
    private String returnUrl;

    /**
     * 参数返回格式,只支持 JSON 格式(固定)
     */
    private String format;

    /**
     * 编码集,支持 GBK/UTF-8
     */
    private String charset;

    /**
     * 生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐使用 RSA2。
     */
    private String signType;
}

// @PropertySource 和 @ConfigurationProperties
// 组合使用,可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。也就是从默认的应用配置文件取值改为从指定文件取值
// alipay.properties 中的内容使用 Unicode 编码

alipay.properties 中的配置内容如下:

alipay.appId=\u5E94\u7528\u7F16\u53F7
alipay.privateKey=\u5E94\u7528\u79C1\u94A5
alipay.publicKey=\u652F\u4ED8\u5B9D\u516C\u94A5\uFF0C
alipay.serverUrl=\u652F\u4ED8\u5B9D\u652F\u4ED8\u7F51\u5173\uFF0C\u6C99
alipay.notifyUrl=https://openapi.alipaydev.com/gateway.do
alipay.returnUrl=https://openapi.alipaydev.com/gateway.do
alipay.format=\u652F\u4ED8\u5B9D\u516C\u94A5\u8BC1\u4E66
alipay.charset=\u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
alipay.signType=\u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66

配置阿里支付操作代理对象:

@Configuration
public class AliPayConfig {

    @Bean
    @SneakyThrows
    public AlipayClient alipayClient(AliPayProperties properties) {
        AlipayConfig config = new AlipayConfig();
        config.setAppId(properties.getAppId());
        config.setPrivateKey(properties.getPrivateKey());
        config.setAlipayPublicKey(properties.getPublicKey());
        config.setServerUrl(properties.getServerUrl());
        config.setFormat(properties.getFormat());
        config.setCharset(properties.getCharset());
        config.setSignType(properties.getSignType());
        return new DefaultAlipayClient(config);
    }
}

简单测试:

@Autowired
private AlipayClient alipayClient;
 
@Autowired
private AliPayProperties properties;
 
@Test
public void aliPayTest() throws AlipayApiException {
    AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
    AlipayTradePagePayModel model = new AlipayTradePagePayModel();
    // 商户订单号,必填
    model.setOutTradeNo("123456789");
    // 付款金额,必填
    model.setTotalAmount("2023");
    // 订单商品名称,必填
    model.setSubject("商品SKU,魅族20");
    // 商品描述,可空
    model.setBody("PC支付测试");
    request.setBizModel(model);
    // 设置支付结果消息通知地址
    request.setNotifyUrl(properties.getNotifyUrl());
    // 设置支付之后的重定向地址
    request.setReturnUrl(properties.getReturnUrl());

    request.setBizContent("{\"out_trade_no\":\""+ model.getOutTradeNo() +"\","
                + "\"total_amount\":\""+ model.getTotalAmount() +"\","
                + "\"subject\":\""+ model.getSubject() +"\","
                + "\"body\":\""+ model.getBody() +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
    AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
    System.out.println(response.getBody());
}

将打印的内容复制到一个html文件中,然后打开,效果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Modbus通信协议学习笔记

Modbus主从设备 主控设备&#xff08;Modbus Master&#xff09;&#xff1a;工控机、PLC、触摸屏等等 从设备&#xff08;Modbus Slave&#xff09;&#xff1a;PLC、Modbus采集模块、带485通讯的传感器、仪器仪表等等 Modbus物理接口&#xff1a;串口&#xff08;RS232、RS4…

零信任-深信服零信任aTrust介绍(5)

​深信服零信任aTrust介绍 深信服是国内领先的互联网信任服务提供商&#xff0c;也是国内首家通过认证的全球信任服务商。深信服零信任是其中一项核心的信任技术&#xff0c;主要针对身份认证、数字签名、数字证书等方面的信任问题。 深信服零信任提供了一种新的安全保护模式…

【老王读Spring Transaction-5】Spring事务传播行为propagation behavior的实现原理

Spring事务传播行为propagation behavior的实现原理前言Spring 版本正文事务传播行为(propagation behavior)列举事务传播行为归类事务传播行为的实现原理小结前言 Spring 对事务的封装除了实现了基本的事务管理之外&#xff0c;还提供了事务传播行为(propagation behavior)的…

【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时

【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是TIM6 只…

深度学习——自注意力机制和位置编码(笔记)

1.自注意力&#xff1a; ①在深度学习中&#xff0c;经常使用卷积神经网络或者循环神经网络对序列进行编码 ②对于key,value和query&#xff0c;自注意力有一套自己的选法&#xff0c;因为key&#xff0c;value和query的值来自同一组输入。因此被称为自注意力或内部注意力 2…

CDGA|数据治理为什么绕不开数据权责问题?如何确定数据权责?

许多企业在经历过信息化建设之后&#xff0c;自然而然地将数据管理的重任交付给了IT部门&#xff0c;而当企业数据质量产生问题时&#xff0c;高层管理者也往往将其归结为IT部门的责任。然而&#xff0c;企业IT部门真的能够管理好这些数据&#xff0c;使其发挥最大效能吗&#…

在 Kubernetes 上运行《我的世界》

最近给小朋友装上了叨叨许久的 Minecraft&#xff08;我的世界&#xff09;&#xff0c;为了体验安装的是开源启动器 HMCL。其实这游戏我也关注比较久了&#xff0c;不过感觉太耗时间。但被小朋友拉上一起玩&#xff0c;便研究了下自建服务器。GitHub 发现已经有人做好了 Minec…

操作系统(四):磁盘调度算法,先来先服务,最短寻道时间优先,电梯算法

文章目录一、磁盘结构二、先来先服务三、最短寻道时间优先四、电梯算法 SCAN一、磁盘结构 盘面&#xff08;Platter&#xff09;&#xff1a;一个磁盘有多个盘面&#xff1b; 磁道&#xff08;Track&#xff09;&#xff1a;盘面上的圆形带状区域&#xff0c;一个盘面可以有多…

大数据处理学习笔记1.2 Scala变量与数据类型

文章目录零、本讲学习目标一、变量声明&#xff08;一&#xff09;简单说明&#xff08;二&#xff09;利用val声明变量1、声明方式2、案例演示&#xff08;三&#xff09;利用var声明变量1、声明方式2、案例演示&#xff08;四&#xff09;换行输入语句&#xff08;续行&#…

生产故障|Kafka ISR频繁伸缩引发性能急剧下降

生产故障&#xff5c;Kafka ISR频繁伸缩引发性能急剧下降-阿里云开发者社区 本文是笔者双十一系列第二弹&#xff0c;源于一个双十一期间一个让笔者猝不及防的生产故障&#xff0c;本文将详细剖析Kafka的副本机制&#xff0c;以及ISR频繁变更(扩张与伸缩)为什么会导致集群不可…

深入浅出C++ ——queue类深度剖析

文章目录一、queue的简介二、queue类常用接口三、STL中queue类的模拟实现一、queue的简介 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端提取元素。队列作为容器适配器实现&#xff0c;容器适配…

【RNN详解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow实现

目录1.摘要2.SimpleRNN2.1.原理介绍2.2.代码实现3.LSTM3.1.原理介绍3.2.代码实现4.LSTM改进—bi_LSTM5.总结感觉不错的话&#xff0c;记得点赞收藏啊。1.摘要 RNN是一种特殊的神经网络结构&#xff0c;它是根据“人的认知是基于过往的经验和记忆”这一观点提出的&#xff0c;它…

node.js+vue图书销售租赁书店运营管理系统mysql vscode

图书销售租赁书店运营管理系 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时本图书馆租赁管理系统主要分…

面向新手的git实战教程

嗨&#xff01;我是团子&#xff0c;大家好久不见呀~ 记得之前在网上学习git相关知识时&#xff0c;看到的文章大部分都是讲解git的基本命令有哪些&#xff0c;用处是什么&#xff0c;但是自己真正上手使用git时&#xff0c;仍然无从下手。 所以今天就想从初始化一个git仓库开始…

Quartz 快速入门案例,看这一篇就够了

前言 Quartz 是基于 Java 实现的任务调度框架&#xff0c;对任务的创建、修改、删除、触发以及监控这些操作直接提供了 api&#xff0c;这意味着开发人员拥有最大的操作权&#xff0c;也带来了更高的灵活性。 什么是任务调度&#xff1f; 任务调度指在将来某个特定的时间、固…

rabbitmq topic模式设置#通配符情况下 消费者队列未接收消息问题排查解决

目录说明说明 生产者配置 Exchange&#xff1a;topic_exchange_shcool Routing key&#xff1a;topic.shcool.# 消费者代码配置 Exchange&#xff1a;topic_exchange_shcool Routing key&#xff1a;topic.shcool.user PostConstructpublic void twoRabbitInit() {//声明交换…

基于微信小程序云开发实现考研题库小程序项目(完整版)

今天手把手的带大家实现一款答题类的题库小程序&#xff0c;如果着急的话&#xff0c;可以直接去看文末源码.下载与项目部署。考研题库小程序云开发实战&#xff0c;完整版提供给大家学习。题库小程序&#xff0c;基于云开发的微信答题小程序&#xff0c;软件架构是微信原生小程…

YOLOv8进行改进并训练自定义的数据集

一.训练数据集准备 YOLOv8的训练数据格式与YOLOv5的训练数据格式一致&#xff0c;这一部分可以进行沿用。之前博文有发布VOC标注格式转YOLO标注格式的脚本&#xff0c;有需要可以查看。 二.项目克隆 YOLOv8项目文件可以直接去github上下载zip文件然后解压&#xff0c;也可以直…

Telerik UI for WPF 2023 R1

Telerik UI for WPF 2023 R1 之 WPF 的 Telerik 用户界面&#xff0c;WPF 控件库开发人员信任&#xff0c;快速构建美观、高性能的 WPF 业务应用程序。现在支持 .NET 6 和 7.0。 概述部分背景图像 主要特征 现代专业主题图标&#xff0c;现代专业主题 通过各种受 Office、Wind…

【机器学习】P0 基础与相关名词

机器学习基础与相关名词什么是机器学习监督学习与非监督学习Classification And RegressionClusteringModel and Function什么是机器学习 机器学习是计算机发展到一定阶段的必然产物。相比于19世纪一个房间大小的计算机&#xff0c;当前的计算机更便携&#xff0c;性能更强&am…