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

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

参考 登录 - 支付宝

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

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

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

这里使用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。 下面我…

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

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

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视频通话系列往期博客 一…

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

早期 对外采购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:…

【简单介绍下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…

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

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

产业空间集聚DO指数计算

1.前言 创始人 :Duranton and Overman&#xff08;2005&#xff09; 目前应用较多的产业集聚度量指数主要基于两类&#xff0c;一是根据不同空间地理单元中产业经济规模的均衡性进行构造&#xff0c;如空间基尼系数与EG指数&#xff1b;二是基于微观企业地理位置信息形成的产业…

商城数据库88张表结构完整示意图41~50(十二)

四十一&#xff1a; 四十二&#xff1a; 四十三&#xff1a; 四十四&#xff1a; 四十五&#xff1a; 四十六&#xff1a; 四十七&#xff1a; 四十八&#xff1a; 四十九&#xff1a; 五十&#xff1a;

【GameFi】链游 | Seraph | 区块链上的动作角色扮演 NFT 装备收集和掠夺游戏

官网下载 新赛季公告&#xff1a;https://www.seraph.game/#/news/357 开始时间&#xff1a;2024年4月19日 11:00 (UTC8&#xff09; discard会有人发送一些激活码&#xff0c;或者有一些活动&#xff0c;只需要填表格关注账号&#xff0c;参与了就会将激活码发到你的邮箱 …

AI不只是技术,更是一种思维方式

一、AI思维 1.个人&#xff1a;提升自己的综合能力&#xff0c;成为一名懂技术、懂设计、懂硬件、懂市场运营等知识的综合型人才 2.数据&#xff1a;从全局视角看数据流向&#xff0c;挖掘数据价值 3.产品&#xff1a;运用新技术&#xff0c;发掘新需求点&#xff0c;探索产…

io (fscanf fprintf)

20 #include <sys/un.h>21 typedef struct stu22 {23 char name[16];24 int age;25 double score;26 }stu;27 int main(int argc, const char *argv[])28 {29 /* 有如下结构体30 31 申请该结构体数组&#xff0c;容量为5&#xff0c;初始化5个学生的信息32 …

奶爸预备 |《伯克毕生发展心理学.从0岁到青少年》 / (美) 劳拉·E. 伯克著——读书笔记

目录 引出第一篇 人的发展理论与研究第1章 历史、理论和研究方法 第二篇 发展的基础第2章 生物基础与环境基础第3章 孕期发育、分娩及新生儿 第三篇 婴儿期和学步期&#xff1a;0~2岁第4章 婴儿期和学步期的身体发育第5章 婴儿期和学步期的认知发展第6章 婴儿期和学步期的情绪与…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null&#xff0c;count为0 Null 不支持加减乘除&#xff0c;大小比较&#xff0c;相等比较&#xff0c;否则只能为空&#xff1b;只能用‘is [not] null’来进行判断&#xff1b; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

ADS基础教程9-理想模型和厂商模型实现及对比

目录 一、概要二、厂商库使用1.新建cell2.调用厂商库中元器件3.元器件替换及参数选择4.完成参数选择5.导入子图 三、仿真实现注意事项 一、概要 本文将介绍在ADS中调用厂商提供的库&#xff0c;来进行原理图仿真&#xff0c;并实现与ADS系统提供的理想元器件之间的比较。 二、…