调用第三方接口——支付宝付款

沙箱环境是支付宝开放平台为开发者提供的用于接口开发及主要功能联调的模拟环境。

参考 登录 - 支付宝

在沙箱环境下,已经分配好了用于模拟测试的应用信息、商家信息、买家信息等

小程序文档 - 支付宝文档中心

 内网穿透(支付宝付款需要在公网进行检查网站)

这里使用natapp内网穿透工具,参考 NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

1.创建前端页面

订单列表页 order.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>订单列表</title><style>tr{text-align: center;}</style>
</head>
<body><table border="1px" width="700px" height="200px"><tr><th>序号</th><th>订单号</th><th>订单名称</th><th>订单金额</th><th>下单时间</th><td>操作</td></tr><tr><td>1</td><td>202312100001</td><td>测试订单1</td><td>¥1.0</td><td>2023-12-10 10:30:21</td><td><a href="pay.html">去支付</a></td></tr><tr><td>2</td><td>202312100002</td><td>测试订单2</td><td>¥1.0</td><td>2023-12-10 10:30:21</td><td><a href="pay.html">去支付</a></td></tr><tr><td>3</td><td>202312100003</td><td>测试订单3</td><td>¥1.0</td><td>2023-12-10 10:30:21</td><td><a href="pay.html">去支付</a></td></tr></table>
</body>
</html>

确认付款页 pay.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>确认付款</title>   
</head>
<body><h2>确认付款</h2><form id="payForm" method="post" action="http://localhost:8080/alipay/pay"><p>订单号:<input type="text" name="orderNo" value="202312100001"></p><p>订单名称:<input type="text" name="subject" value="测试订单1"></p><p>付款金额:<input type="text" name="totalAmount" value="1.0"></p><p><input type="submit" value="付款"></p></form>
</body>
</html>

后端界面:
引入相关的依赖:

processor是为了将配置类中的信息,一次性读取注入到属性中:

        <!--   支付宝     --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.34.0.ALL</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>

application.yml 

# 支付宝配置信息
alipay:appId: xxxxxxxappPrivateKey: xxxxxxxalipayPublicKey: xxxxxxxsignType: RSA2charset: utf-8gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.donotifyUrl: xxxxxxxreturnUrl: http://127.0.0.1:5500/order.html

创建Alipay属性类:

@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {// 应用idprivate String appId;// 应用私钥private String appPrivateKey;// 支付宝公钥private String alipayPublicKey;// 签名方式private String signType;// 字符编码private String charset;// 支付宝网关private String gatewayUrl;// 异步通知地址private String notifyUrl;// 同步跳转地址,即支付完成后跳转的地址private String returnUrl;
}

 创建Alipay配置类

@Configuration
public class AlipayConfig {@Resourceprivate AlipayProperties alipayProperties;/*** 创建支付客户端*/@Beanpublic AlipayClient alipayClient(){AlipayClient alipayClient = new DefaultAlipayClient(alipayProperties.getGatewayUrl(),alipayProperties.getAppId(),alipayProperties.getAppPrivateKey(),"json",alipayProperties.getCharset(),alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());return alipayClient;}/*** 创建支付请求对象*/@Beanpublic AlipayTradePagePayRequest alipayTradePagePayRequest(){AlipayTradePagePayRequest payRequest = new AlipayTradePagePayRequest();payRequest.setNotifyUrl(alipayProperties.getNotifyUrl());payRequest.setReturnUrl(alipayProperties.getReturnUrl());return payRequest;}
}

创建Alipay控制类:

package net.wanho.controller;import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.wanho.properties.AlipayProperties;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;@RestController
@RequestMapping("/alipay")
@CrossOrigin
@Slf4j
public class AlipayController {@Resourceprivate AlipayClient alipayClient;@Resourceprivate AlipayTradePagePayRequest payRequest;@Resourceprivate AlipayProperties alipayProperties;/*** 支付方法*/@SneakyThrows@PostMapping("/pay")public void pay(String orderNo, String subject, Double totalAmount, HttpServletResponse response) {//封装业务参数JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", orderNo);//订单号bizContent.put("subject", subject); //订单名称bizContent.put("total_amount", totalAmount); //订单总金额bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); // 产品码,固定值bizContent.put("timeout_express", "15m"); //超时时间,15minpayRequest.setBizContent(bizContent.toString());//向支付宝发起支付请求String result = alipayClient.pageExecute(payRequest).getBody();//将结果返回给前端,进入支付用户登录界面response.setContentType("text/html;charset=utf-8");response.getWriter().print(result);}/*** 异步通知*/@SneakyThrows@PostMapping("/notify")public String notify(@RequestParam Map<String, String> params) {System.out.println(params);/*** 进行验签操作,防止签名被窜改*/boolean flag = AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(), alipayProperties.getCharset(), alipayProperties.getSignType());if (!flag) {log.info("验证签名失败!");return "fail";}/*** 判断返回的订单号、订单总金额是否与发送的一致,防止数据被篡改*/String out_trade_no = params.get("out_trade_no");String total_amount = params.get("total_amount");/*** 判断支付宝返回的状态是否正常*/String trade_status = params.get("trade_status");if (!trade_status.equals("TRADE_SUCCESS")) {log.info("交易失败!");return "fail";}/*** 更新相应的订单状态,例如将订单标记为已支付、更新库存等*/
//        orderService.updateOrderStatus();return "success";}}

实现效果:

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

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

相关文章

PyTorch深度学习框架:从入门到实战

前言 学习 PyTorch 深度学习框架之前先学会深度学习和卷积神经网络 CNN &#xff0c;这样学习起来会更香嗷。 Windows系统下PyTorch的环境配置 Anaconda是什么&#xff1a; Anaconda是一个开源的Python发行版本&#xff0c;专注于数据分析领域。它包含了conda、Python等190多…

为什么感觉没有效果

以前在辅导小儿作业的时候&#xff0c;我会在常用的搜索引擎里去寻找答案&#xff0c;一般情况下都能解决问题。 但是最近一段时间&#xff0c;我发现&#xff0c;搜索引擎搜出来的结果还没有利用短视频搜出来的答案更全面&#xff0c;短视频软件不仅可以显示AI整理出来的答案…

CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

在我遇到的题目中&#xff0c;想要读取文件必然是要执行cat /flag这个命令&#xff0c;但是题目当然不会这么轻松。让你直接cat出来&#xff0c;必然会有各种各样的滤过条件&#xff0c;你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。 下面我…

【C++风云录】跨越星辰大海:六大库在宇宙物理学和天文学的实际应用

走近科学&#xff1a;理解和利用宇宙物理学与天文学的科研工具 前言 本文将探讨六个不同的库&#xff0c;分别是HEALPix&#xff0c;CCfits&#xff0c;CFITSIO&#xff0c;WCSLIB&#xff0c;AstroPy和ROOT&#xff0c;他们在宇宙物理学和天文学中的重要应用。我们将详细介绍…

【LeetCode 121】买卖股票的最佳时机

思路 思路&#xff1a; 所谓代码的复杂性来源于业务的复杂性&#xff0c;如果能够想清楚业务实现逻辑&#xff0c;就能够轻松写出代码&#xff1b; 假设当前是第i天&#xff0c;如何在第i天赚到最多的钱&#xff1f;需要在第i天之前以最低价买入股票&#xff1b; 所以需要求…

微博视频怎么下载无水印

在当今社交媒体时代&#xff0c;微博已经成为人们获取信息、分享生活的重要平台之一。许多人在浏览微博时常常遇到一个问题&#xff1a;如何下载微博视频而不留下烦人的水印呢?今天&#xff0c;我将分享一些神秘的方法&#xff0c;让你轻松解锁微博视频的无水印下载技巧。 第…

Python实现2048游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待! 在这篇博客中,我们将使用 Python 和 Pygame 库来编写经典的 2048 游戏。2048 是一个益智类游戏,通过在 4x4 网格上滑动方块并合并它们来创建一个新的数字,直到获得数字 2048 或者无法继…

武汉星起航:跨境电商行业领航者,一站式孵化服务引领全球趋势

在全球化日益深入的今天&#xff0c;跨境电商作为连接各国市场的桥梁&#xff0c;其重要性日益凸显。在这一潮流中&#xff0c;武汉星起航电子商务有限公司以其前瞻性的战略眼光和丰富的运营经验&#xff0c;迅速崛起为跨境电商行业的领军者。公司不仅自营亚马逊跨境电商业务&a…

一对一WebRTC视频通话系列(四)——offer、answer、candidate信令实现

本篇博客主要讲解offer、answer、candidate信令实现&#xff0c;涵盖了媒体协商和网络协商相关实现。 本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客 一…

vue3引入element-plus完整步骤

在Vue 3项目中引入Element Plus的完整步骤如下&#xff1a; 安装Element Plus&#xff1a; 使用npm&#xff08;或cnpm&#xff0c;如果你在中国并且希望使用淘宝的npm镜像&#xff09;来安装Element Plus。在项目的根目录下&#xff0c;打开命令行工具并执行以下命令&#x…

Python深度学习:【模型系列】强化学习简介及优质学习资源

文章目录 1.强化学习概述基本组成主要算法类别应用领域2.优质在线学习资源1.强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习的一个子领域,它涉及智能体(agent)通过与环境的交互来学习如何在给定的任务中最大化某种累积奖励。 强化学习不同于监督学习,它…

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…

如何取消xhr / fetch / axios请求

如何取消xhr请求 setTimeout(() > { xhr.abort() }, 1000)如何取消fetch请求 fetch()请求发送以后&#xff0c;如果中途想要取消&#xff0c;需要使用AbortController对象。 let controller new AbortController(); let signal controller.signal;fetch(url, {signal:…

论生命价值

我们该如何定义一个人的生命价值&#xff0c;这是一个十分值得我们深思的问题&#xff0c;而谈论到生命的价值&#xff0c;我们先从非人的东西去谈论它的价值&#xff0c;从我们作为人的角度去思考价值&#xff0c;一个东西对我们有用&#xff0c;这个东西能够让我们的主观上的…

【简单介绍下Debian常用命令】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

基于51单片机的手动数字时钟设计

基于51单片机的手动数字时钟 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.八位数码管显示时分秒&#xff0c;格式为XX-XX-XX&#xff1b; 2.六个按键控制时、分、秒的加减&#xff1b; 3.复位按键重新计时&#xff1b; ​演示视频&am…

代码随想录-算法训练营day27【回溯算法03:组合总和、分割回文串】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第七章 回溯算法part03● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串详细布置 39. 组合总和 本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制题目链接/文章讲解:https://…

ESG视角下的多期DID构建(2009-2022年)4.5万+数据

随着ESG信息越来越受到重视&#xff0c;一些第三方评级机构开始推出ESG评级产品&#xff0c;目前在第三方数据库能够查到华证、富时罗素、商道融绿、社会价值投资联盟以及Wind自有的ESG评级数据等。其中&#xff0c;商道融绿是中国最早发布ESG评级数据的机构&#xff0c;也是国…

代码随想录-算法训练营day29【回溯算法05:递增子序列、全排列】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第七章 回溯算法part05* 491.递增子序列 * 46.全排列 * 47.全排列 II详细布置 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A…

独孤思维:做副业吵架互怼后,该赚钱继续赚钱

01 我从来都没有觉得别人指出我的问题&#xff0c;甚至骂我是不应该的。 每个人&#xff0c;都有表达自己观点的权利。 更何况&#xff0c;人家如果指出的问题&#xff0c;正好是我应该提升的地方。 我当然要虚心接受。 这没有什么丢人的&#xff0c;也没有什么好抗拒的。…