当前位置: 首页 > news >正文

springboot3+vue3支付宝交易案例-结算支付

springboot3+vue3支付宝交易案例-结算支付!今天下午整理了一下结算的内容。遇到了很多问题。汇总分享给大家。

第一个问题:支付宝结算后,返回的交易编码,和交易时间,交易状态,都应该使用varchar来存。

第二个问题:它交易支付完成后,会自动返回购物车的页面地址。


package com.example.demo.controller;import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;import com.alipay.api.internal.util.AlipaySignature;
import com.example.demo.config.AliPayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.example.demo.bean.Orders;
import com.example.demo.service.IOrdersService;
import com.example.demo.service.impl.OrdersService;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/alipay")
public class AlipayController {//支付宝沙箱测试网关地址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";@Resourceprivate IOrdersService ordersService;@Resourceprivate AliPayConfig alipayConfig;/*** 向支付宝发送支付的接口。* @param orderNo* @param httpResponse* @throws IOException*/@GetMapping("/pay")public void pay(Integer orderNo, HttpServletResponse httpResponse) throws IOException {//查询订单信息List<Orders> ordersList= ordersService.getOneOrdersByOrderNo(orderNo);Orders order = ordersList.get(0);if(order == null){return;}//private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";// 1. 创建Client,通用SDK提供的Client,负责调用支付宝的APIAlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, alipayConfig.getAppId(),alipayConfig.getAppPrivateKey(), FORMAT, CHARSET, alipayConfig.getAlipayPublicKey(), SIGN_TYPE);// 2. 创建 Request并设置Request参数AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 发送请求的 Request类request.setNotifyUrl(alipayConfig.getNotifyUrl());//疑惑之一。JSONObject bizContent = new JSONObject();bizContent.set("out_trade_no", orderNo);  // 我们自己生成的订单编号bizContent.set("total_amount", order.getTotal()); // 订单的总金额bizContent.set("subject", order.getGoodsName());   // 支付的名称bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置request.setBizContent(bizContent.toString());request.setReturnUrl("http://127.0.0.1:5173/cart_list");// 执行请求,拿到响应的结果,返回给浏览器String form = "";try {form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单} catch (AlipayApiException e) {e.printStackTrace();}//官方回传了一个页面,输入账户,密码,完成支付。httpResponse.setContentType("text/html;charset=" + CHARSET);httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面httpResponse.getWriter().flush();httpResponse.getWriter().close();}@PostMapping("/notify")  // 注意这里必须是POST接口public void payNotify(HttpServletRequest request) throws Exception {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");//支付交易的编码String status = params.get("trade_status");//交易状态String sign = params.get("sign");String content = AlipaySignature.getSignCheckContentV1(params);boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, alipayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名// 支付宝验签if (checkSignature) {// 验签通过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"));// 更新订单未已支付(更新数据库信息)//tradeNo, "已支付", gmtPayment, alipayTradeNo//查询订单信息Integer orderNo = Integer.valueOf(tradeNo);List<Orders> ordersList= ordersService.getOneOrdersByOrderNo(orderNo);Orders order = ordersList.get(0);order.setStatus(status);order.setAlipayNo(alipayTradeNo);order.setPayTime(gmtPayment);ordersService.updateOneOrders(order);}}}
}

这里面就是支付宝交易的控制器内容。里面有2个方法。一个是支付的,一个是回调的。


package com.example.demo.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {private String appId;private String appPrivateKey;private String alipayPublicKey;private String notifyUrl;
}

这个是一个配置类,读取了我们的配置信息。


alipay.appId=9021000134634591
alipay.appPrivateKey=MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCvWMRgjeKZdKnT8tT7nh1Yh6RiLhYCablc5a67CojvWRk5NrooIpP39oXkisV7H2nf5J8zfLmS2l2qroDlwAx4Zx3+Woloo6rcLZ42G0QuB8yBZm4doa73/lMurenmucSgCDaS+ap1opEGvlAFZnRi2O0KZy5t9g9WhwzC/D2EWJMSwroclfSTpVxr/on0MLw7l+jTeqcZTul4czXUhnGufWgVjmA7qAd3we7FhAMCqUcWXa3pLCCGIeSaBkqiaoToyql7eqYuwoV2UkT1DeqCN0fW/Zc5h7YpbuGTDfm2SSB/lfQAvHeV5Y+aNIOFJ1G25VKDnAIQgfQgrDYU3Eg1AgMBAAECgf99V/cJDmPtTngYCn41X9Gad1wK0ubo0qquvYEqM12vuwFM5NIt3onnt1H/DTQdz1bftY4YQBBn6bELUbLSiXZgm1XVfOK86kI5ImL2SodyYCDQX2hXxjxNCoBr3eZWCHWF8FkSt2YisRL6vxB0y8hm4KqRxTBranmMYP2+ZJGVCIyimxHAespfG47yPy42fk02DXf9StJpWqOTw5juCfUNDjDbgYLkk6B5gEmH9sj8jeG2OrNOxxjTLRnMgxxsRGV1goRQqAHD7wUAUYu1oFQCAMz3QAQeIv29OvXklRh9AxohridPImQxqzGOm9AnVB0US2GbnXYNBUEdrADn0+ECgYEA4SF+br+uTANdLANvHjP6uzG7UrOef6imUw0Yoepwzbc4pimxkH8p3lQZFpR9i06/7skIu/u7YAOgrcMVFcDQkmprqLDSXeML/YgQzocCqPg4cwYU6EDrMFrjAT7uBRXJFHaRdVNuEpTdtWWQMMdJe/WbNVxQMf2XBe8NM5AO3PkCgYEAx2PCm//PHkeuaEoOi0hcdCmKf67iA3uahyCl3+IzLO7bgEtpldLAlMiNMxNL+HiuxnGMUxmJXb5GkGeSNPjajMGmYY+pOx2h2SiJcMuHtMLjHwBmnEVWbMzWcD5huF//66jMI8NJN8eXZcfNxcjcD/BIEhlP6bi2vnCs1PInQB0CgYAZWR8WMyjZ0CsmcICLYwjhGNlhl23KK+AGS9wxJudqki2jr+AZR+gb61Yjz7ZPAB/mL+Z23AId7mqiBewS1fHl+muCw937yjuoYTCbQGJRShl5Af9KozyX5jPXCRHdqrVIQ41fK3SiTPalnPjeNSIV/fJq0KkK5+WgOmk/HAJAaQKBgBEat7kWKrhYQdfkcnb0UCoO3jix0eWmlsz8uf4Is4cpPl81GOunVqnswmAdSakZATU4zGbci/IkvnzoxZwRtP3aJuG7pzLRCe9NEO1CKHQTO9SO/j5tnEpdEBA06cEdSyD2K/ztZbyJPK2YhEhxQJ+FZ0lWLorIM7UGiW0DEObpAoGAUaWp+93D8VLYKzLlutCrZXmXw7gFfFXkmr5rd0ylFW7OqTtGPbvXwREpByyoKGyXZSIR9gnyYtjw4PQctKrXNvqqPevFEJ1I8EWm+sKsN9E8Sg7j0M9BhRaJ+9B4/OwDv9+G1N6WOjaia88RBx45s8lVb9l6Fjd5wsI2O5p/1Xw=
alipay.alipayPublicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoBuX6xKYpLdexDoGc+jmfGGijjFnsv/0jvPmPydnt+bUgIWF8ghk2v3ddbY2C6toqdk1n367CyIF/swQl2gZFscWg83tvPHOho+fyHJ9ZANzJqQDeEXD2YVfrOGcTJQt0dnX6w5rfZerzsrD685C1OhAIttP5HKff2iplyvx1ZPaHEhghacYjD4ObFREXo6M1+pkKJJBo5mUmPQ6MBwWwkKqtIaQMMUnszO+o7GyVbVd7CttS/VDXwqTNay0pPlWyyBpH9rSl45XClGGHOFgpkN//CVNO7dBtskLOCKDZ++fGIBPKqU5vEkZXoGanlYBOKhrh38gALiR2CaENPdCIwIDAQAB
alipay.notifyUrl=http://8btgff.natappfree.cc/alipay/notify

这个就是配置参数文件内的配置参数信息。


如图,我们都是使用的字符串存储的。否则很容易报错。存不下。 


 

如图,使用沙箱测试账户(用户角色)jiuky可以支付完成了。


这个就是刚刚结算的订单信息。第一个是支付宝回传过来的交易编码。第二个是交易结算时间,第三个是交易结算状态。 

相关文章:

springboot3+vue3支付宝交易案例-结算支付

springboot3vue3支付宝交易案例-结算支付&#xff01;今天下午整理了一下结算的内容。遇到了很多问题。汇总分享给大家。 第一个问题&#xff1a;支付宝结算后&#xff0c;返回的交易编码&#xff0c;和交易时间&#xff0c;交易状态&#xff0c;都应该使用varchar来存。 第二…...

c语言 ceil() 函数

ceil()是C语言中的一个数学函数&#xff0c;用于向上取整。它的函数原型定义在math.h头文件中。 ceil()函数的作用是返回一个大于或等于给定参数的最小整数值&#xff0c;即将参数向上取整到最接近的整数。返回值的数据类型为double。 以下是ceil()函数的函数原型&#xff1a…...

virtualBox虚拟机安装ubuntu后的必要配置

1. 使能双向copy 粘贴功能。在device menu的 shared clipboard项, 选bidirectional. 2.启用共享文件夹。 在device 菜单的 shared folder 项配置&#xff0c; (对于日期乱码问题和命令行打不开的问题请见ubuntu18.04安装后时间日期乱码及terminal打不开解决方法_电脑日期变成…...

《Pandas 简易速速上手小册》第6章:Pandas 时间序列分析(2024 最新版)

文章目录 6.1 时间序列数据基础6.1.1 基础知识6.1.2 重点案例&#xff1a;股票市场分析6.1.3 拓展案例一&#xff1a;温度变化分析6.1.4 拓展案例二&#xff1a;电商平台日销售额分析 6.2 日期与时间功能6.2.1 基础知识6.2.2 重点案例&#xff1a;活动日志分析6.2.3 拓展案例一…...

滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)招标公告

滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)招标公告 (招标编号&#xff1a;YDZOH20240158) 项目所在地区&#xff1a;云南省,临沧市,市辖区 一、招标条件 本滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)已由项目审批/核准/备案机关批准&#xff0c;项目资金来源为…...

(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法

Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …...

【Linux】环境基础开发工具的使用之gcc详解(二)

前言&#xff1a;上一篇文章中我们讲解了Linux下的vim和yum的工具的使用&#xff0c;今天我们将在上一次的基础上进一步的讲解开放工具的时候。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4a…...

go语言-用channel控制goroutine的退出

用channel控制goroutine的退出 本文简要介绍了&#xff0c;如何用channel控制goroutine的退出的基本方法 for-range主动停止goruitine package mainimport ("fmt""sync""time" )/* Go并发编程模型&#xff1a;主动停止goroutine 方法一&#…...

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…...

单元测试框架深入(一):单元测试框架深入

一、一个简单的例子 1、引入Maven依赖&#xff1a;JUnit框架和Surefire插件 2.在src/test/java目录下新建名字以“Test”结尾的测试类&#xff0c;并用Test注释测试方法 3.运行单元测试用例 或用mvn命令运行单元测试&#xff1a; 二、单元测试基础之单元测试框架&#xff1a;J…...

苏门X学士常识学习

前言 苏轼&#xff08;1037年—1101年&#xff09;是北宋的文坛领袖&#xff0c;很喜欢奖掖后进。其门下最有名的是“苏门四学士”&#xff0c;另外还有“苏门六学士”和“苏门后四学士”之说。 一、苏门四学士 苏轼在《与李昭玘书》中说&#xff1a; 轼蒙庇粗遣&#xff0…...

MD5算法:高效安全的数据完整性保障

摘要&#xff1a;在数字世界中&#xff0c;确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中&#xff0c;Message Digest Algorithm 5&#xff08;MD5&#xff09;算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…...

JavaScript基础五对象 内置对象 Math.random()

内置对象-生成任意范围随机数 Math.random() 随机数函数&#xff0c; 返回一个0 - 1之间&#xff0c;并且包括0不包括1的随机小数 [0, 1&#xff09; 如何生成0-10的随机数呢&#xff1f; Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…...

curl之网络接口

Curl_cftype 连接接口定义 struct Curl_cftype {const char *name; /* name of the filter type */int flags; /* flags of filter type */int log_level; /* log level for such filters */Cu…...

Pytest中doctests的测试方法应用

在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…...

Android 8.1 铃声音量通话音量同步调节

Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈&#xff0c;想要实现铃声音量通话音量同步调节&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…...

C++——字符串string

C——字符串string C语言中对字符串的表示通常用指针&#xff0c;新手会面临内存泄漏或者段错误等众多问题。 在 C 中&#xff0c; string 类是标准库的一部分&#xff0c;用于表示和操作字符串。它是对传统的 C 风格字符串&#xff08;以空 字符 ‘\0’ 结尾的字符数组&…...

HBuilder使用[微信小程序开发者工具] 显示 × initialize报错

解决办法 我们先要单独打开 微信开发者工具 点击设置里面的安全,把服务器端口打开 然后再回到我们的HBuilder使用重新打开打开 成功打开...

洛谷P8599 [蓝桥杯 2013 省 B] 带分数

[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式&#xff1a; 100 3 69258 714 100 3 \frac{69258}{714} 100371469258​。 还可以表示为&#xff1a; 100 82 3546 197 100 82 \frac{3546}{197} 100821973546​。 注意特征&#xff1a;带分…...

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...