SSM实现支付宝沙盒支付

文章目录

    • 沙盒支付
      • 准备
      • 配置
      • 测试

沙盒支付

这里用的支付宝的一个沙盒环境,是支付宝提供给开发者测试用的。

下面主要梳理一下,支付功能的实现,其实还是很简单的,因为支付宝都提供好了,我们只要调用接口去传入参数即可。

准备

导入依赖

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

进入支付包开方平台
https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopen.alipay.com%2Fdevelop%2Fsandbox%2Fapp

进入沙盒应用,可以看到一些参数,都是我们要用到的

在这里插入图片描述

接口价签方式我这里用的是自定义的密钥,也可以使用提供的默认密钥。

在这里插入图片描述
在这里插入图片描述

利用支付宝的工具可以生成应用公钥和私钥,公钥复制到自定义设置中,即可生成支付宝公钥。

在这里插入图片描述

配置

ssm项目中添加配置类。

然后将将你的appid,应用私钥,支付宝公钥,复制粘贴到对应参数上。

notify回调函数也就是支付成功的调用路径。

package com.qcby.controller.Config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class AlipayConfig {

    // 应用ID
    public static String app_id = "";

    // 商户私钥
    public static String merchant_private_key = "";
    // 支付宝公钥
    public static String alipay_public_key = "";

    // 服务器异步通知页面路径,
    public static String notify_url = "";

    // 页面跳转同步通知页面路径, 成功跳转
    public static String return_url = "";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl = "";

}

也可以写一个properties文件, 然后配置类中导入。

支付宝回调只能回调公网中的地址,所以这里我们需要用到一个工具。

natapp,用于内网穿透,把我们的端口号映射到公网上,可以访问到。

申请一个免费的,映射上你需要的端口号,复制authtoken。
在这里插入图片描述

下载app
在这里插入图片描述

创建一个bat在同目录下,配置上你的authtoken.
在这里插入图片描述

启动:
在这里插入图片描述

可以看到已经给你配置了一个地址映射你本地的端口。

我们将此地址复制,在回调函数中替换我们的端口。

注意:每次启动地址都不一样,所以每次需要重新配置。

然后编写接口即可。

    /**
     * 订单支付功能
     * @param request
     * @param response
     * @throws IOException
     */
    @ResponseBody
    @RequestMapping("/pay")
    public void payController(HttpServletRequest request, HttpServletResponse response) throws IOException {

        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        // 商户订单号
        String out_trade_no = getOrderNo();
        // 付款金额
        String total_amount = request.getParameter("money");
        // 订单名称
        String subject = request.getParameter("order_name");
        // 商品描述
        String body = request.getParameter("describe");
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount
                + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        System.out.println("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\","
                + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        // String form = "";
        String s = "";
        try {
            // form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
            //get方式请求,即生成url链接
            s = alipayClient.pageExecute(alipayRequest,"GET").getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        // 将支付表单嵌入HTML并输出到页面
        // System.out.println(form);
        System.out.println(s);
        response.setContentType("text/html;charset=" + AlipayConfig.charset);
        response.getWriter().write(s);//直接将完整的表单html输出到页面
        response.getWriter().flush();
        response.getWriter().close();
    }

传入我们的订单信息,如订单编号,金额,描述等,可以查看支付宝给的参数解析,参数的规则, setBizContent配置我们的订单信息。

生成我们的表单直接返回或者生成连接,它会自动跳转我们的支付页面,这个页面也不需要我们写,都是支付宝提供好的,我们只需要支付即可。

在这里插入图片描述

测试

这里支付,我们用支付宝给我们提供的虚拟的账户和密码支付即可。
也可以用手机下载沙盒支付宝登录,扫码支付。

在这里插入图片描述

支付成功后,会等几秒自动调用回调函数,返回到我们要跳转的页面。

在这里插入图片描述

支付流程成功。

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

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

相关文章

【后端高频面试题--Linux篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Linux篇 Windows和Linux的区别&#xff1f;Unix和Linux有什么区别&#xff1f…

【原创 附源码】Flutter安卓及iOS海外登录--Google登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月8日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&#…

代码随想录算法训练营第42天(动态规划04 ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

动态规划part04 01背包问题 二维动态规划五部曲 01背包问题 一维 (没理解动态规划五部曲 416. 分割等和子集解题思路 对于面试的话&#xff0c;其实掌握01背包&#xff0c;和完全背包&#xff0c;就够用了&#xff0c;最多可以再来一个多重背包。 每一件物品其实只有两个状态&a…

使用耳机壳UV树脂制作私模定制耳塞有哪些选择呢?

私模定制耳塞人士的选择可以从以下几个方面考虑&#xff1a; 专业经验&#xff1a;选择有丰富经验的私模定制耳塞人士&#xff0c;能够更好地理解用户需求&#xff0c;提供更专业的建议和服务。可以通过查看其作品和客户评价来了解其经验和口碑。材料质量&#xff1a;选择使用…

模型 AISAS(注意、兴趣、搜索、行动、分享)

系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。消费者行为模型。 1 模型AISAS(注意、兴趣、搜索、行动、分享)的应用 1.1 AISAS用于社交媒体营销 假设我们有一家健身中心&#xff0c;想要通过社交媒体营销来吸引新客户。 A&#xff08;A…

使用耳机壳UV树脂制作私模定制耳塞有什么优点和缺点呢?

使用耳机壳UV树脂制作私模定制耳塞具有以下优点&#xff1a; 个性化定制&#xff1a;UV树脂可以根据用户的耳型进行个性化定制&#xff0c;使耳塞与用户的耳朵形状完美契合&#xff0c;提高舒适度和佩戴稳定性。高强度和耐磨性&#xff1a;UV树脂具有高强度和耐磨性&#xff0…

宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)

宿舍报修小程序目录 目录 基于微信小程序的宿舍报修系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户小程序功能模块 2、学生信息管理 3、维修人员管理 4、故障上报管理 5、论坛信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&…

C++重新入门-C++ 函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#xff0c;划分通常…

python+flask+django医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具…

基于无线传感器网络的LC-DANSE波束形成算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1LC-DANSE算法原理 4.2 LCMV算法原理 5.完整程序 1.程序功能描述 在无线传感器网络中&#xff0c;通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR&#xff0c;mse等指标…

QT学习文件操作类 QFile

&#xff08;一&#xff09;QFile QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能&#xff0c;支持文本和二进制文件。QFile 继承自 QIODevice &#xff0c;因此它可以像其他 IO 设备一样使用。 &#xff08;1&#xff09;主要功能 1. 文件读写…

深度优先搜索(DFS)与广度优先搜索(BFS):探索图与树的算法

一、引言 在图论和树形结构中&#xff0c;搜索算法是寻找从起点到终点的路径的关键。其中&#xff0c;深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;是最常用且最基础的两种搜索算法。本文将详细介绍广度优先搜索&#xff08;BFS&#xf…

CVE-2022-25487 漏洞复现

漏洞描述&#xff1a;Atom CMS 2.0版本存在远程代码执行漏洞&#xff0c;该漏洞源于/admin/uploads.php 未能正确过滤构造代码段的特殊元素。攻击者可利用该漏洞导致任意代码执行。 其实这就是一个文件上传漏洞罢了。。。。 打开之后&#xff0c;/home路由是个空白 信息搜集&…

分享88个鼠标特效,总有一款适合您

分享88个鼠标特效&#xff0c;总有一款适合您 88个鼠标特效下载链接&#xff1a;https://pan.baidu.com/s/1ljcxwgXGpw7baiufUGJjZA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

C++之继承

一&#xff0c;概念及用法 1&#xff09;概念 首先我们来了解一下官方的概念&#xff1a;继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&a…

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点&#xff1a; 线程的缺点&#xff1a; 线程的用途&#xff1a; 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…

原来你也可以DDOS?

首先祝大家新年快乐 这次内容就主要是纸上谈兵&#xff08;因为无法未经试验无法保证成功&#xff09;&#xff0c;而且有关这方面的科普视频也已经有很多了。 原文地址&#xff1a;原来你也可以DDOS&#xff1f; - Pleasure的博客 下面是正文内容&#xff1a; 前言 DDOS是一…

Hive SQL编译成MapReduce任务的过程

一、 Hive 底层执行架构 1.1 Hive底层架构 1 &#xff09;用户接口&#xff1a; Client CLI &#xff08; command-line interface &#xff09;、 JDBC/ODBC(jdbc 访问 hive) 、 WEBUI &#xff08;浏览器访问 hive &#xff09; 2 &#xff09;元数据&#xff1a; Metas…

mxxWechatBot流程与原理

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑封禁账号&#xff01;&#xff01;&#xff01;本人不对任何工具的使用负责&am…