沙箱支付支付宝

news2024/9/24 19:17:03

沙箱支付支付宝

文章目录

  • 沙箱支付支付宝
    • 一、进入沙箱应用-支付宝
    • 二、基本配置
      • 2.1 查看自己的基本信息
      • 2.2 生成自定义密钥,进行配置
    • 三、springboot整合沙箱支付
      • 3.1 需要导入的两个相关依赖(pom.xml)
      • 3.2 需要加入的配置文件信息(application.yml)
      • 3.3 controller层
      • 3.4 config
      • 3.5 entity
      • 3.6 启动
    • 四、 NATAPP
      • 4.1 获取免费渠道
      • 4.2 配置authtoken,并运行
        • 4.2.1选择【我的渠道】---【配置】
        • 4.2.2 打开下载的NATAPP文件包
        • 4.2.3 外网访问

一、进入沙箱应用-支付宝

沙箱应用-开发平台(支付宝):https://open.alipay.com/develop/sandbox/app

密钥下载: 密钥工具下载 - 支付宝文档中心 (alipay.com)

二、基本配置

2.1 查看自己的基本信息

这里查看自己的APPID、支付宝网关地址、选择自定义密钥,

在这里插入图片描述

用来交易的账号密码

在这里插入图片描述

2.2 生成自定义密钥,进行配置

将下载好的密钥工具打开,选择生成密钥

在这里插入图片描述

保存好公钥和私钥

· 公钥:是密钥对中公开的部分,用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据
· 私钥:是非公开的部分,用于解密和签名

在这里插入图片描述

回到沙箱应用,选择设置并查看,将生成的密钥复制进去,

在这里插入图片描述

在这里插入图片描述

三、springboot整合沙箱支付

3.1 需要导入的两个相关依赖(pom.xml)

   		<!--        支付宝依赖沙箱支付 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-easysdk</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!--        支付宝相关-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
        <version>4.34.0.ALL</version>
        </dependency>

3.2 需要加入的配置文件信息(application.yml)

alipay:
  appId:APPID)
  appPrivateKey: (私钥)
  alipayPublicKey: (公钥)
  notifyUrl: http://4.2.3/alipay/notify

3.3 controller层


import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.easysdk.factory.Factory;
import com.cqie.config.AliPayConfig;
import com.cqie.entity.AliPay;
import com.cqie.entity.Orders;
import com.cqie.mapper.OrderMapper;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
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 java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("alipay")
@Transactional(rollbackFor = Exception.class)
@Slf4j
public class AliPayController {

    @Resource
    AliPayConfig aliPayConfig;

    //    @Resource
    private OrderMapper shopOrderMapper;
    private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
    private static final String FORMAT = "JSON";
    private static final String CHARSET = "utf-8";
    private static final String SIGN_TYPE = "RSA2";

    @GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
    public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
                aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setNotifyUrl(aliPayConfig.getNotifyUrl());
        request.setBizContent("{\"out_trade_no\":\"" + aliPay.getTraceNo() + "\","
                + "\"total_amount\":\"" + aliPay.getTotalAmount() + "\","
                + "\"subject\":\"" + aliPay.getSubject() + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        String form = "";
        try {
            // 调用SDK生成表单
            form = alipayClient.pageExecute(request).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset=" + CHARSET);
        // 直接将完整的表单html输出到页面
        httpResponse.getWriter().write(form);
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

    @PostMapping("/notify")  // 注意这里必须是POST接口
    public String payNotify(HttpServletRequest request) throws Exception {
        log.info("回调执行操作");
        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");
            // 支付宝验签
            if (Factory.Payment.Common().verifyNotify(params)) {
                // 验签通过
                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"));
                // 更新订单未已支付
                Orders order = new Orders();
                order.setId(Long.valueOf(tradeNo));
                order.setStatus(2);
//                order.setCheckoutTime(params.get("gmt_payment"));
//                shopOrderMapper.updateById(order);
            }
        }
        return "success";
    }
}

3.4 config


import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import jakarta.annotation.PostConstruct;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;



@Data
@Component
//读取yml文件中alipay 开头的配置
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
    private String appId;
    private String appPrivateKey;
    private String alipayPublicKey;
    private String notifyUrl;


    @PostConstruct
    public void init() {
        // 设置参数(全局只需设置一次)
        Config config = new Config();
        config.protocol = "https";
        config.gatewayHost = "openapi.alipaydev.com";
        config.signType = "RSA2";
        config.appId = this.appId;
        config.merchantPrivateKey = this.appPrivateKey;
        config.alipayPublicKey = this.alipayPublicKey;
        config.notifyUrl = this.notifyUrl;
        Factory.setOptions(config);
        System.out.println("=======支付宝SDK初始化成功=======");
    }
}

3.5 entity


import lombok.Data;

@Data
public class AliPay {
    private String traceNo;
    private double totalAmount;
    private String subject;
    private String alipayTraceNo;
}

3.6 启动

在浏览器url地址栏输入(subject-收款方 ,traceNo-支付方 , totalAmount-交易金额 )

http://localhost:8080/alipay/pay?subject=xxx&traceNo=xxx&totalAmount=1000

按照2.1的买方信息填入即可

在这里插入图片描述

四、 NATAPP

NATAPP是一款内网穿透工具,它可以把用户将本地服务器映射到公网上,使得在任何地点都能够访问到用户本地的应用或服务

4.1 获取免费渠道

首先进入 NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 ,去注册一个新账号

然后购买一个免费渠道

在这里插入图片描述

这里的端口根据项目来就行(后面也可以改)

在这里插入图片描述

4.2 配置authtoken,并运行

下载地址: NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

若下载无ini文件: 使用本地配置文件config.ini - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

4.2.1选择【我的渠道】—【配置】

在这里插入图片描述

复制authtoken

在这里插入图片描述

4.2.2 打开下载的NATAPP文件包

在这里插入图片描述

双击natapp.exe文件,出现下面样式就完成了

在这里插入图片描述

4.2.3 外网访问
只能被本地访问的: http://localhost:8080/alipay/pay?subject=xxx&traceNo=xxx&totalAmount=1000
可以被外网访问的: http://上图的地址.cc/alipay/pay?subject=xxx&traceNo=xxx&totalAmount=1000

手机端浏览器打开:

在这里插入图片描述

电脑浏览器打开:

在这里插入图片描述

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

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

相关文章

网站建设完成后, 行业网站如何做seo

行业网站的SEO优化是一个系统工程&#xff0c;涉及多个方面以确保网站能够在搜索引擎中有良好的表现。以下是行业网站SEO的详细解析&#xff1a; 关键词研究与布局 目标受众分析&#xff1a;了解目标受众的搜索习惯和需求&#xff0c;确定适合的关键词。使用工具来发现相关关键…

启航未来,共绘科技蓝图,2024青岛软件博览会(青岛软博会)

在金秋送爽、硕果累累的十月&#xff0c;青岛&#xff0c;这座镶嵌于黄海之滨的璀璨明珠&#xff0c;以其独特的海滨风光与深厚的文化底蕴&#xff0c;即将迎来一场科技领域的璀璨盛宴——2024青岛国际软件融合创新博览会&#xff08;简称&#xff1a;青岛软博会&#xff09;。…

C++ | Leetcode C++题解之第378题有序矩阵中第K小的元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;} else…

Java 5.3 - MyBatis

#{} 和 ${} 的区别是什么&#xff1f; ${} 是 Properties 文件中的变量占位符&#xff0c;它可以用于标签属性值和 sql 内部&#xff0c;属于静态文本替换&#xff0c;比如 ${driver} 被静态替换为 com.mysql.jdbc.Driver #{} 是 sql 的参数占位符 xml 映射文件中&#xff0c…

labelImg使用

创建一个名字为data的文件夹&#xff0c;里面images文件夹存放图片&#xff1b;labels存放标注的标签文件&#xff1b;最后创建一个名为 classes.txt 的txt文件来存放所要标注的类别名称。 终端输入&#xff1a; labelImg images classes.txt images 存储图像的文件夹 classe…

【一文详解】内外网文件摆渡系统,解决网间数据安全传输问题

一、内外网文件摆渡系统的背景 数字化转型进一步推动了数据的移动&#xff0c;而随着攻击者加速利用日常生活中的数据依赖性&#xff0c;数据泄露也随之扩大。企业为保护网络安全和数据安全&#xff0c;使用网络隔离手段进行网络隔离&#xff0c;如银行内部将网络隔离为生产网…

基于FFMPEG读取摄像头图像编码为h264

1.调用ffmpeg命令采集摄像头图像 $ ffmpeg -f v4l2 -framerate 30 -video_size 1280*720 -i /dev/video0 -c:v libx264 -preset veryfast -f h264 output.h264-f v4l2: 指定输入设备采用Video4Linux2框架。   -framerate 30: 设置帧率为30。   -video_size 1280720: 设置视…

Shell 脚本入门指南

Shell 脚本入门指南 引言1.1 什么是 Shell 脚本&#xff1f;1.2 为什么学习 Shell 脚本&#xff1f; 准备工作2.1 选择和安装 Shell&#xff08;Bash&#xff09;2.2 设置脚本编辑环境&#xff08;文本编辑器&#xff09; Hello World&#xff01;基本语法4.1 变量4.2 条件判断…

【OpenCV】离散傅里叶变换

离散傅里叶变换 傅里叶变换代码实现扩展图片创建储存实部和虚部值的矩阵进行离散傅里叶变换将复数转换成振幅对数转换裁剪和重排归一化 离散傅里叶变换在图像处理中的应用参考 傅里叶变换 在图片处理中&#xff0c;傅里叶变化会将对图片的时域分析转变为频域分析。 傅里叶的基…

模型 麦肯锡七步成诗法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。问题到解决方案的七步跨越。 1 麦肯锡七步成诗法的应用 1.1零售业客户体验转型实践 随着消费者对购物体验的要求日益提高&#xff0c;一家零售企业面临客户流失和销售增长放缓的问题。企业管理层决定…

分类预测|基于哈里斯鹰优化混合核极限学习机的数据分类预测Matlab程序HHO-HKELM多特征输入多类别输出含基础程序

分类预测|基于哈里斯鹰优化混合核极限学习机的数据分类预测Matlab程序HHO-HKELM多特征输入多类别输出含基础程序 文章目录 前言分类预测|基于哈里斯鹰优化混合核极限学习机的数据分类预测Matlab程序HHO-HKELM多特征输入多类别输出含基础程序 一、HHO-HKELM模型HHO-HKELM 分类预…

告别PDF格式困扰,2024年PDF转换器推荐

PDF现在已经逐渐成为了文件传输的主流格式了&#xff0c;它有保存文件页面版式的优点&#xff0c;但是这个格式编辑对大部分人来说还是不那么方便&#xff0c;日常我们还是习惯将它们转换成我们常见的 文本格式来操作。今天我分享一下可以实现PDF格式转换的pdf转换器有哪些吧。…

CSS3实现购物车动画效果

概述 小程序商城或者 web 端网站时,我们可以只通过 CSS 的 animation 和transform,而不需要借助额外的第三方库轻松实现简单的动画效果,丰富页面的表达效果 效果 如下图所示,点击按钮就会有个商品进入左下角的购物车内 购物车动画示例地址 代码示例 元素 开始只需要写…

Uniapp 调用aar、jar包

废话 坑是真的多&#xff0c;官方文档简陋到可以忽略不计。 大概流程 1. 新建一个Android模块&#xff0c;需要用这个模块打包成aar 2. 用这个模块引用uniapp-v8-release.aar以及你需要用到的aar、jar&#xff0c;用不到则忽略这步 坑一&#xff1a;不要直接放到这个模块的…

window11彻底关闭Microsoft Defender

Microsoft Defender Antivirus 是 Microsoft Windows 11 操作系统的默认防病毒解决方案。默认情况下它处于打开的状态。大多数第三方的杀毒软件都可以识别&#xff0c;并代替它。 但是大多数情况下&#xff0c;我们总是有各种理由需要关闭它&#xff0c;例如 Windows Defender …

轻量级冠军:NVIDIA 发布具有领先准确率的小语言模型

Mistral-NeMo-Minitron 8B 是最近发布的 Mistral NeMo 12B 模型的微型版本&#xff0c;具有高精度和高计算效率&#xff0c;可在 GPU 加速数据中心、云和工作站上运行模型。 生成式 AI 开发者通常需要在模型尺寸和准确性之间做出权衡。然而&#xff0c;NVIDIA 发布的一款新语言…

内存管理篇-14kmalloc机制实现分析

引入这个kmalloc的目的&#xff0c;是因为前面的slab接口太过于复杂&#xff0c;因此需要一个全新的封装kmalloc接口&#xff0c;内存申请编程接口实现。kmalloc底层起始也是基于slab缓存实现的。 1.kmalloc 调用流程 参数解析: 解析 gfp_mask 参数&#xff0c;确定分配时是否…

数据结构与算法学习day18-层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。…

硬盘崩溃数据无踪?Windows数据恢复TOP4揭秘,2024年助你找回宝贵资料

现在我们的生活、工作、学习都离不开电脑&#xff0c;电脑里的硬盘就像个装满宝贝的箱子&#xff0c;里面全是我们宝贵的照片、文档、视频和美好回忆。但要是硬盘突然坏了&#xff0c;东西一下子全没了&#xff0c;那感觉真是太糟糕了。别担心&#xff0c;今天我们就给你介绍几…

2024年中国运筹学会运筹竞赛(数据驱动赛道)报名通知

竞赛组织 主办单位&#xff1a;中国运筹学会&#xff08;国家一级学会&#xff09; 承办单位&#xff1a;中国科学技术大学 支持单位&#xff1a;杉数科技、海康威视、中国科学技术大学管理学院、《运筹学学报》杂志 竞赛内容 本次竞赛&#xff08;本科生组&#xff09;由竞…