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

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

参考 登录 - 支付宝

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

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

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

这里使用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.hqwc.cn/news/671398.html

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

相关文章

RAG进阶(二): RAG 融合(rag fusion)

在上一篇博客中&#xff0c;我们学习了多重查询(Multi Query)技术&#xff0c;Multi Query的基本思想是当用户输入查询语句(自然语言)时&#xff0c;我们让大模型(LLM)基于用户的问题再生成多个查询语句&#xff0c;这些生成的查询语句是对用户查询语句的补充&#xff0c;它们是…

如何使git提交的时候忽略一些特殊文件?

认识.gitignore文件 在生成远程仓库的时候我们会看到这样一个选项&#xff1a; 这个.gitignore文件有啥用呢&#xff1f; .gotignore文件是Git版本控制系统中的一个特殊文件。用来指定哪些文件或者目录不被Git追踪或者提交到版本库中。也就意味着&#xff0c;如果我们有一些文…

国产最强多模态大模型Step Fun-1V,究竟有多好用?

前言&#xff1a; 2023年是大模型的元年&#xff0c;随着ChatGPT的爆火&#xff0c;将大模型带入了公众的视野 &#xff0c;国内也随之掀起了百模大战的浪潮。在这股浪潮的推动下&#xff0c;诸多科技公司&#xff0c;乃至大厂都争相推出自己的大模型产品&#xff0c;希望能够…

Flutter开发Dart中的队列(Queue)

文章目录 Dart中的队列&#xff08;Queue&#xff09;基本操作示例队列的类型队列的应用总结 Dart中的队列&#xff08;Queue&#xff09; 队列是一种抽象的数据结构&#xff0c;遵循“先进先出”&#xff08;FIFO&#xff09;的原则。这意味着最早添加的元素将首先被移除。队…

Java基础教程 - 5 数组

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 5 数组 前面我们保存数据…

正则将段落分割成句子

这里分割段落不区分中英文标点&#xff0c;你可以根据需求改 分割后标点跟随句子后面 def split_sentences_keep_delimiter(text):pattern r[^。!&#xff01;?&#xff1f;:&#xff1a;;&#xff1b;,&#xff0c;][。!&#xff01;?&#xff1f;:&#xff1a;;&#xff…

与Apollo共创生态:让智驾技术为各行业发展赋能

目录 一、引言 二、Apollo七周年大会主要内容回顾 2.1活动回顾链接 2.2Apollo项目介绍 2.2.1Apollo项目发展介绍 2.2.2实验用车传感器介绍 2.2.3硬件连接概述 2.2.4软件概述 2.3Apollo X 企业自动驾驶解决方案介绍 2.3.1Apollo X 企业自动驾驶解决方案优势 2.3.2 Ap…

LIUNX系统编程:进程池的实现

1.什么是进程池 每一个可执行程序&#xff0c;在被执行前都要转化为进程&#xff0c;操作系统都要为其创建PCB&#xff0c;地址空间&#xff0c;页表&#xff0c;构建映射关系&#xff0c;进程池就是创建进程时&#xff0c;创建很多个进程&#xff0c;如果要执行程序&#xff…

认识ansible 了解常用模块

ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。是自动化运维工具&#xff0…

硬件设计 之 压敏电阻简单介绍

1. 什么是压敏电阻&#xff08;Varistor Voltage&#xff09;&#xff1a; 压敏电阻&#xff08;Varistor&#xff09;是一种特殊类型的电阻器件&#xff0c;具有非线性电阻特性。它的主要作用是保护电子电路免受过电压或过电流的损害。 测定电流为1mA&#xff0c;此时TNR端子…

触动精灵纯本地离线文字识别插件

目的 触动精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但触动精灵的图色功能比较单一&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解…

LeetCode 226.翻转二叉树(全网最多的解法)

LeetCode 226.翻转二叉树 1、题目 题目链接&#xff1a;226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#…