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

SpringBoot集成支付宝,看这一篇就够了。

前 言

在开始集成支付宝支付之前,我们需要准备一个支付宝商家账户,如果是个人开发者,可以通过注册公司或者让有公司资质的单位进行授权,后续在集成相关API的时候需要提供这些信息。
下面我以电脑网页端在线支付为例,介绍整个从集成、测试到上线的具体流程。

1. 预期效果展示

在开始之前我们先看下我们要达到的最后效果,具体如下:

  • 前端点击支付跳转到支付宝界面
  • 支付宝界面展示付款二维码
  • 用户手机端支付
  • 完成支付,支付宝回调开发者指定的url

在这里插入图片描述

2. 开发流程

2.1 沙盒调试

支付宝为我们准备了完善的沙盒开发环境,我们可以先在沙盒环境调试好程序,后续新建好应用并成功上线后,把程序中对应的参数替换为线上参数即可。
1. 创建沙盒应用
直接进入 https://open.alipay.com/develop/sandbox/app 创建沙盒应用即可,
在这里插入图片描述
这里因为是测试环境,我们就选择系统默认密钥就行了,下面选择公钥模式,另外应用网关地址就是用户完成支付之后,支付宝会回调的url。在开发环境中,我们可以采用内网穿透的方式,将我们本机的端口暴露在某个公网地址上,这里推荐 https://natapp.cn/ ,可以免费注册使用。
2. SpringBoot代码实现
在创建好沙盒应用,获取到密钥,APPID,商家账户PID等信息之后,就可以在测试环境开发集成对应的API了。这里我以电脑端支付API为例,介绍如何进行集成。
关于电脑网站支付的详细产品介绍和API接入文档可以参考:https://opendocs.alipay.com/open/repo-0038oa?ref=api 和 https://opendocs.alipay.com/open

  • 步骤1, 添加alipay sdk对应的Maven依赖。
<!-- alipay -->  
<dependency>  <groupId>com.alipay.sdk</groupId>  <artifactId>alipay-sdk-java</artifactId>  <version>4.35.132.ALL</version>  
</dependency>
  • 步骤2,添加支付宝下单、支付成功后同步调用和异步调用的接口。
    这里需要注意,同步接口是用户完成支付后会自动跳转的地址,因此需要是Get请求。异步接口,是用户完成支付之后,支付宝会回调来通知支付结果的地址,所以是POST请求。
@RestController  
@RequestMapping("/alipay")  
public class AliPayController {  @Autowired  AliPayService aliPayService;  @PostMapping("/order")  public GenericResponse<Object> placeOrderForPCWeb(@RequestBody AliPayRequest aliPayRequest) {  try {  return aliPayService.placeOrderForPCWeb(aliPayRequest);  } catch (IOException e) {  throw new RuntimeException(e);  }  }  @PostMapping("/callback/async")  public String asyncCallback(HttpServletRequest request) {  return aliPayService.orderCallbackInAsync(request);  }  @GetMapping("/callback/sync")  public void syncCallback(HttpServletRequest request, HttpServletResponse response) {  aliPayService.orderCallbackInSync(request, response);  }  }
  • 步骤3,实现Service层代码
    这里针对上面controller中的三个接口,分别完成service层对应的方法。下面是整个支付的核心流程,其中有些地方需要根据你自己的实际情况进行保存订单到DB或者检查订单状态的操作,这个可以根据实际业务需求进行设计。
public class AliPayService {  @Autowired  AliPayHelper aliPayHelper;  @Resource  AlipayConfig alipayConfig;  @Transactional(rollbackFor = Exception.class)  public GenericResponse<Object> placeOrderForPCWeb(AliPayRequest aliPayRequest) throws IOException {  log.info("【请求开始-在线购买-交易创建】*********统一下单开始*********");  String tradeNo = aliPayHelper.generateTradeNumber();  String subject = "购买套餐1";  Map<String, Object> map = aliPayHelper.placeOrderAndPayForPCWeb(tradeNo, 100, subject);  if (Boolean.parseBoolean(String.valueOf(map.get("isSuccess")))) {  log.info("【请求开始-在线购买-交易创建】统一下单成功,开始保存订单数据");  //保存订单信息  // 添加你自己的业务逻辑,主要是保存订单数据log.info("【请求成功-在线购买-交易创建】*********统一下单结束*********");  return new GenericResponse<>(ResponseCode.SUCCESS, map.get("body"));  }else{  log.info("【失败:请求失败-在线购买-交易创建】*********统一下单结束*********");  return new GenericResponse<>(ResponseCode.INTERNAL_ERROR, String.valueOf(map.get("subMsg")));  }  }  // sync return page  public void orderCallbackInSync(HttpServletRequest request, HttpServletResponse response) {  try {  OutputStream outputStream = response.getOutputStream();  //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码  response.setHeader("content-type", "text/html;charset=UTF-8");  String outputData = "支付成功,请返回网站并刷新页面。";  /**  * data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表,  * 如果是中文的操作系统环境,默认就是查找查GB2312的码表,  */  byte[] dataByteArr = outputData.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换  outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组  } catch (IOException e) {  throw new RuntimeException(e);  }  }  public String orderCallbackInAsync(HttpServletRequest request) {  try {  Map<String, String> map = aliPayHelper.paramstoMap(request);  String tradeNo = map.get("out_trade_no");  String sign = map.get("sign");  String content = AlipaySignature.getSignCheckContentV1(map);  boolean signVerified = aliPayHelper.CheckSignIn(sign, content);  // check order status  // 这里在DB中检查order的状态,如果已经支付成功,无需再次验证。if(DB中拿到order,并且判断order是否支付成功过){  log.info("订单:" + tradeNo + " 已经支付成功,无需再次验证。");  return "success";  }  //验证业务数据是否一致  if(!checkData(map, order)){  log.error("返回业务数据验证失败,订单:" + tradeNo );  return "返回业务数据验证失败";  }  //签名验证成功  if(signVerified){  log.info("支付宝签名验证成功,订单:" + tradeNo);  // 验证支付状态  String tradeStatus = request.getParameter("trade_status");  if(tradeStatus.equals("TRADE_SUCCESS")){  log.info("支付成功,订单:"+tradeNo);  // 更新订单状态,执行一些业务逻辑return "success";  }else{  System.out.println("支付失败,订单:" + tradeNo );  return "支付失败";  }  }else{  log.error("签名验证失败,订单:" + tradeNo );  return "签名验证失败.";  }  } catch (IOException e) {  log.error("IO exception happened ", e);  throw new RuntimeException(ResponseCode.INTERNAL_ERROR, e.getMessage());  }  }  public boolean checkData(Map<String, String> map, OrderInfo order) {  log.info("【请求开始-交易回调-订单确认】*********校验订单确认开始*********");  //验证订单号是否准确,并且订单状态为待支付  if(验证订单号是否准确,并且订单状态为待支付){  float amount1 = Float.parseFloat(map.get("total_amount"));  float amount2 = (float) order.getOrderAmount();  //判断金额是否相等  if(amount1 == amount2){  //验证收款商户id是否一致  if(map.get("seller_id").equals(alipayConfig.getPid())){  //判断appid是否一致  if(map.get("app_id").equals(alipayConfig.getAppid())){  log.info("【成功:请求开始-交易回调-订单确认】*********校验订单确认成功*********");  return true;                    }  }  }  }  log.info("【失败:请求开始-交易回调-订单确认】*********校验订单确认失败*********");  return false;    }  
}
  • 步骤4,实现alipayHelper类。这个类里面对支付宝的接口进行封装。
public class AliPayHelper {  @Resource  private AlipayConfig alipayConfig;  //返回数据格式  private static final String FORMAT = "json";  //编码类型  private static final String CHART_TYPE = "utf-8";  //签名类型  private static final String SIGN_TYPE = "RSA2";  /*支付销售产品码,目前支付宝只支持FAST_INSTANT_TRADE_PAY*/  public static final String PRODUCT_CODE = "FAST_INSTANT_TRADE_PAY";  private static AlipayClient alipayClient = null;  private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");  private static final Random random = new Random();  @PostConstruct  public void init(){  alipayClient = new DefaultAlipayClient(  alipayConfig.getGateway(),  alipayConfig.getAppid(),  alipayConfig.getPrivateKey(),  FORMAT,  CHART_TYPE,  alipayConfig.getPublicKey(),  SIGN_TYPE);  };  /*================PC网页支付====================*/  /**  * 统一下单并调用支付页面接口  * @param outTradeNo  * @param totalAmount  * @param subject  * @return  */  public Map<String, Object> placeOrderAndPayForPCWeb(String outTradeNo, float totalAmount, String subject){  AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  request.setNotifyUrl(alipayConfig.getNotifyUrl());  request.setReturnUrl(alipayConfig.getReturnUrl());  JSONObject bizContent = new JSONObject();  bizContent.put("out_trade_no", outTradeNo);  bizContent.put("total_amount", totalAmount);  bizContent.put("subject", subject);  bizContent.put("product_code", PRODUCT_CODE);  request.setBizContent(bizContent.toString());  AlipayTradePagePayResponse response = null;  try {  response = alipayClient.pageExecute(request);  } catch (AlipayApiException e) {  e.printStackTrace();  }  Map<String, Object> resultMap = new HashMap<>();  resultMap.put("isSuccess", response.isSuccess());  if(response.isSuccess()){  log.info("调用成功");  log.info(JSON.toJSONString(response));  resultMap.put("body", response.getBody());  } else {  log.error("调用失败");  log.error(response.getSubMsg());  resultMap.put("subMsg", response.getSubMsg());  }  return resultMap;  }  /**  * 交易订单查询  * @param out_trade_no  * @return  */  public Map<String, Object> tradeQueryForPCWeb(String out_trade_no){  AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();  JSONObject bizContent = new JSONObject();  bizContent.put("trade_no", out_trade_no);  request.setBizContent(bizContent.toString());  AlipayTradeQueryResponse response = null;  try {  response = alipayClient.execute(request);  } catch (AlipayApiException e) {  e.printStackTrace();  }  Map<String, Object> resultMap = new HashMap<>();  resultMap.put("isSuccess", response.isSuccess());  if(response.isSuccess()){  System.out.println("调用成功");  System.out.println(JSON.toJSONString(response));  resultMap.put("status", response.getTradeStatus());  } else {  System.out.println("调用失败");  System.out.println(response.getSubMsg());  resultMap.put("subMsg", response.getSubMsg());  }  return resultMap;  }  /**  * 验证签名是否正确  * @param sign  * @param content  * @return  */  public boolean CheckSignIn(String sign, String content){  try {  return AlipaySignature.rsaCheck(content, sign, alipayConfig.getPublicKey(), CHART_TYPE, SIGN_TYPE);  } catch (AlipayApiException e) {  e.printStackTrace();  }  return false;  }  /**  * 将异步通知的参数转化为Map  * @return  */  public Map<String, String> paramstoMap(HttpServletRequest request) throws UnsupportedEncodingException {  Map<String, String> params = new HashMap<String, String>();  Map<String, String[]> requestParams = request.getParameterMap();  for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {  String name = (String) iter.next();  String[] values = (String[]) requestParams.get(name);  String valueStr = "";  for (int i = 0; i < values.length; i++) {  valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";  }  // 乱码解决,这段代码在出现乱码时使用。  
//            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");  params.put(name, valueStr);  }  return params;  }  }
  • 步骤5,封装config类,用于存放所有的配置属性。
@Data  
@Component  
@ConfigurationProperties(prefix = "alipay")  
public class AlipayConfig {  private String gateway;  private String appid;  private String pid;  private String privateKey;  private String publicKey;  private String returnUrl;  private String notifyUrl;  }

另外需要在application.properties中,准备好上述对应的属性。

# alipay config  
alipay.gateway=https://openapi.alipaydev.com/gateway.do  
alipay.appid=your_appid
alipay.pid=your_pid  
alipay.privatekey=your_private_key
alipay.publickey=your_public_key
alipay.returnurl=完成支付后的同步跳转地址 
alipay.notifyurl=完成支付后,支付宝会异步回调的地址

3. 前端代码实现
前端代码只需要完成两个功能, 1. 根据用户的请求向后端发起支付请求。 2. 直接提交返回数据完成跳转。

下面的例子中,我用typescript实现了用户点击支付之后的功能,

async function onPositiveClick() {  paymentLoading.value = true  const { data } = await placeAlipayOrder<string>({  //你的一些请求参数,例如金额等等})  const div = document.createElement('divform')  div.innerHTML = data  document.body.appendChild(div)  document.forms[0].setAttribute('target', '_blank')  document.forms[0].submit()  showModal.value = false  paymentLoading.value = false  
}

2.2 创建并上线APP

完成沙盒调试没问题之后,我们需要创建对应的支付宝网页应用并上线。
登录 https://open.alipay.com/develop/manage 并选择创建网页应用。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/57589dc53ae14dc68694c6ee9bc77dd8.png
填写应用相关信息:
在这里插入图片描述
创建好应用之后,首先在开发设置中,设置好接口加签方式以及应用网关。
在这里插入图片描述
注意密钥选择RSA2,其他按照上面的操作指南一步步走即可,注意保管好自己的私钥和公钥。

之后在产品绑定页,绑定对应的API,比如我们这里是PC网页端支付,找到对应的API绑定就可以了。如果第一次绑定,可能需要填写相关的信息进行审核,按需填写即可,一般审核一天就通过了。

在这里插入图片描述
最后如果一切就绪,我们就可以把APP提交上线了,上线成功之后,我们需要把下面SpringBoot中的properties替换为线上APP的信息,然后就可以在生产环境调用支付宝的接口进行支付了。

# alipay config  
alipay.gateway=https://openapi.alipaydev.com/gateway.do  
alipay.appid=your_appid
alipay.pid=your_pid  
alipay.privatekey=your_private_key
alipay.publickey=your_public_key
alipay.returnurl=完成支付后的同步跳转地址 
alipay.notifyurl=完成支付后,支付宝会异步回调的地址

相关文章:

SpringBoot集成支付宝,看这一篇就够了。

前 言 在开始集成支付宝支付之前&#xff0c;我们需要准备一个支付宝商家账户&#xff0c;如果是个人开发者&#xff0c;可以通过注册公司或者让有公司资质的单位进行授权&#xff0c;后续在集成相关API的时候需要提供这些信息。 下面我以电脑网页端在线支付为例&#xff0c;介…...

数据结构程序设计——哈希表的应用(2)->哈希表解决冲突的方法

目录 实验须知 代码实现 实验报告 一&#xff1a;问题分析 二、数据结构 1.逻辑结构 2.物理结构 三、算法 &#xff08;一&#xff09;主要算法描述 1.用除留余数法构造哈希函数 2.线性探测再散列法 &#xff08;一&#xff09;主要算法实现代码 四、上机调试 实…...

微信小程序开发系列-07组件

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…...

JavaScript 中 Set 和 Map 的区别

JavaScript 中的 Set 和 Map 都是用来存储数据的数据结构&#xff0c;它们之间的区别如下&#xff1a; Set 是一组唯一值的集合&#xff0c;而 Map 是一组键值对的集合。Set 中的值是唯一的&#xff0c;不允许重复&#xff1b;Map 中的键是唯一的&#xff0c;值可以重复。Set …...

web前端之JavaScript

MENU JavaScript之设计模式、单例、代理、装饰者、中介者、观察者、发布订阅、策略JavaScript之数组静态方法的实现、reduce、forEach、map、push、every JavaScript之设计模式、单例、代理、装饰者、中介者、观察者、发布订阅、策略 单例模式 概念 保证一个类仅有一个实例&am…...

C# 图标标注小工具-查看重复文件

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Windows.Forms;namespace ImageDuplicate {public partial clas…...

浅谈冯诺依曼体系和操作系统

&#x1f30e;冯诺依曼体系结构 文章目录 冯诺依曼体系结构 认识冯诺依曼体系结构       硬件分类       各个硬件的简单认识         输入输出设备         中央处理器         存储器 关于内存 对冯诺依曼体系的理解 操作系统 操作系统…...

Good Bye 2023

Good Bye 2023 Good Bye 2023 A. 2023 题意&#xff1a;序列a中所有数的乘积应为2023&#xff0c;现在给出序列中的n个数&#xff0c;找到剩下的k个数并输出&#xff0c;报告不可能。 思路&#xff1a;把所有已知的数字乘起来&#xff0c;判断是否整除2023&#xff0c;不够…...

多开工具对手机应用响应速度的优化与改进

多开工具对手机应用响应速度的优化与改进 摘要&#xff1a; 如今&#xff0c;手机应用的多样化和个性化需求不断增长&#xff0c;用户对应用的响应速度要求也越来越高。为了满足用户的需求&#xff0c;开发者们使用了多种技术手段进行应用的优化和改进。其中&#xff0c;多开工…...

文件批量整理,文件归类整理,文件批量归类

我们每天都要面对无数的文件&#xff0c;从工作报告、个人照片到电影和音乐。如何有效地管理和归类这些文件&#xff0c;成为了我们日常生活和工作中所要处理的。今天&#xff0c;小编就给大家介绍一款简单易用的工具——文件批量改名高手&#xff0c;助你轻松实现文件批量归类…...

Python+Django+Mysql+SimpleUI搭建后端用户管理系统(非常详细,每一步都清晰,列举了里面所有使用的方法属性)

一、在Anaconda环境下创建虚拟环境 &#xff08;1&#xff09;打开Anaconda Prompt(install)&#xff0c;创建虚拟环境&#xff0c;如下图所示&#xff1a; 方法一&#xff1a;默认情况下虚拟环境创建在Anaconda安装目录下的envs文件夹中 conda create --name usermanage …...

【Qt-QWidget-QLabel-QFrame-QSlider-View-Bar】

Qt编程指南 ■ Label■ QLabel■ QMovie 显示动画■ Widget■ QWidget■ QTabWidget■ QTableWidget■ QListWidget■ QStackedWidget■ QCalendarWidget■ QFrame■ QFrame■ View■ QT...

11|代理(上):ReAct框架,推理与行动的协同

11&#xff5c;代理&#xff08;上&#xff09;&#xff1a;ReAct框架&#xff0c;推理与行动的协同 在之前介绍的思维链&#xff08;CoT&#xff09;中&#xff0c;我向你展示了 LLMs 执行推理轨迹的能力。在给出答案之前&#xff0c;大模型通过中间推理步骤&#xff08;尤其…...

毫秒格式化

## 计算当前毫秒数&#xff1a; const [start,setStart] useState(new Date().getTime())useEffect(()>{setInterval(()>{setCurrMill(new Date().getTime()-start)},1)},[]) ## 格式化毫秒 function formatMilliseconds(milliseconds) {const totalSeconds Math.flo…...

pytorch与cuda版本对应关系汇总

pytorch与cuda版本关系 cuda版本支持pytorch版本cuda10.21.5 ~ 1.12cuda11.01.7 ~ 1.7.1cuda11.11.8 ~ 1.10.1cuda11.31.8.1 ~ 1.12.1cuda11.61.12.0 ~ 1.13.1cuda11.71.13.0 ~ 2.0.1cuda11.82.0.0 ~ 2.1.1cuda12.12.1.0 ~ 2.1.1 cuda 与 cudnn关系 cuda版本支持cudnn版本cu…...

Linux系统下隧道代理HTTP

在Linux系统下配置隧道代理HTTP是一个涉及网络技术的话题&#xff0c;主要目的是在客户端和服务器之间建立一个安全的通信通道。下面将详细解释如何进行配置。 一、了解基本概念 在开始之前&#xff0c;需要了解几个关键概念&#xff1a;代理服务器、隧道代理和HTTP协议。代理…...

unity学习笔记----游戏练习03

一、修复植物种植的问题 1.当手上存在植物时&#xff0c;再次点击卡片上的植物就会在手上添加新的植物&#xff0c;需要修改成只有手上没有植物时才能再次获取到植物。需要修改AddPlant方法。 public bool AddPlant(PlantType plantType) { //防止手上出现多个植…...

VistualStudio查看类图UML

点击菜单栏中的工具–》获取工具和功能。 然后在资源管理器中对应的代码中鼠标右键选择查看类图 生成一个ClassDiagram.cd文件就是类图的文件了。 根据需要拖拽就可以生成类图了。...

elasticsearch系列九:异地容灾-CCR跨集群复制

概述 起初只在部分业务中采用es存储数据&#xff0c;在主中心搭建了个集群&#xff0c;随着es在我们系统中的地位越来越重要&#xff0c;数据也越来越多&#xff0c;针对它的安全性问题也越发重要&#xff0c;那如何对es做异地容灾呢&#xff1f; 今天咱们就一起看下官方提供的…...

基于Java网上点餐系统设计与实现

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…...

公司电脑文件加密系统——防止内部核心文件数据 | 资料外泄,自动智能透明加密保护

一套从源头上保障企业电脑数据安全和电脑使用安全的加密软件。天锐绿盾加密软件包含了表格数据加密、图纸加密、文档文件加密、内网文件加密流转、密级管控、电脑离线管理、文件外发管理、灵活的审批流程、工作模式切换、服务器白名单等功能。天锐绿盾加密系统全面覆盖Mac、Win…...

计算机毕业设计------ssm茶叶溯源系统

项目介绍 茶叶溯源系统&#xff0c;分为前台与后台。普通用户可在前台通过18位的编码查询茶叶的出售历史。 后台分为两种角色&#xff0c;管理员与经销商&#xff1b; 管理员主要功能包括&#xff1a; 主界面&#xff1b; 管理员管理&#xff1a;管理员列表、添加管理员&am…...

【网络安全 | Misc】miss_01 太湖杯

解压时提示输入密码&#xff1a; 如果 frFlags 或 deFlags 不为0会导致zip的伪加密 将deFlags的值修改为0 将9改为0&#xff0c;另存为123.zip&#xff1a; 即可绕过加密&#xff1a; 得到一个zip一个docx&#xff0c;但zip需要密码&#xff1a; 因此看docx有无敏感信息&#x…...

【深度学习目标检测】十一、基于深度学习的电网绝缘子缺陷识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…...

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下&#xff0c;const描述的是运行时常量性&#xff0c;也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性&#xff0c;这是const关键字无法保证的。例如&am…...

C# 基于事件的观察者模式

观察者模式是一种软件设计模式&#xff0c;用于定义对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都将得到通知并自动更新。这种模式通过解耦合主题和观察者来提高对象的灵活性。 定义 观察者模式…...

ARM CCA机密计算软件架构之软件堆栈概述

Arm CCA平台通过硬件添加和固件组件的混合方式实现,例如在处理元素(PEs)中的RME以及特定的固件组件,特别是监视器和领域管理监视器。本节介绍Arm CCA平台的软件堆栈。 软件堆栈概述 领域VM的执行旨在与Normal world(正常世界)隔离,领域VM由Normal world Host(正常世界…...

《Python机器学习原理与算法实现》学习笔记

以下为《Python机器学习原理与算法实现》&#xff08;杨维忠 张甜 著 2023年2月新书 清华大学出版社&#xff09;的学习笔记。 根据输入数据是否具有“响应变量”信息&#xff0c;机器学习被分为“监督式学习”和“非监督式学习”。 “监督式学习”即输入数据中即有X变量&…...

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …...

介绍一款PDF在线工具

PDF是我们日常工作中的一种常见格式&#xff0c;其处理也是我们工作的重要基础性环节&#xff0c;一款可靠的处理工具显得十分重要。 完全免费、易于使用、丰富的PDF处理工具&#xff0c;包括&#xff1a;合并、拆分、压缩、转换、旋转和解锁PDF文件&#xff0c;以及给PDF文件…...

docker学习——汇总版

历时一个月将docker系统的学习了一下&#xff0c;并且记录了详细的笔记和实践过程。 希望能对工作需要的小伙伴们有所帮助~ docker基础篇 docker学习&#xff08;一、docker与VM对比&#xff09; docker学习&#xff08;二、安装docker&#xff09; docker学习&#xff08;…...

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展&#xff0c;数据规模指数级膨胀&#xff0c;对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板&#xff0c;只能适应有限的场景&#xff1a; >> 新型分布式…...

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型&#xff0c;它的主要目标是确保数据的准确性和一致性&#xff0c;防止未授权的修改和破坏。在这个模型中&#…...

ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装健身房预约系统软件来发挥其高效地信息处理的作用&#xff…...

基于 Element UI 适用于 Vue 2 版本的虚拟列表选择器组件el-select

背景&#xff1a;在某些使用情况下&#xff0c;单个选择器可能最终加载数万行数据。 将这么多的数据渲染至 DOM 中可能会给浏览器带来负担&#xff0c;从而造成性能问题。 ——vue3element-plus有现成的轮子。而vue2element-ui没有。 以下 文章大部分 摘自 源组件中的README.md…...

java常见面试题:请解释一下Java中的常用分布式框架,如Spring Boot、Dubbo等。

下面我将详细介绍Java中的两个常用分布式框架&#xff1a;Spring Boot和Dubbo。 1. Spring Boot Spring Boot是一个用于创建独立、可运行的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和部署&#xff0c;使得开发人员能够专注于编写业务逻辑&#xff0c…...

FreeRTOS列表与列表项相关知识总结以及列表项的插入与删除实战

1.列表与列表项概念及结构体介绍 1.1列表项简介 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表 1.2 列表、列表项、迷你列表项结构体 1&#xff09;列表结构体 typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VAL…...

07|输出解析:用OutputParser生成鲜花推荐列表

07&#xff5c;输出解析&#xff1a;用OutputParser生成鲜花推荐列表 模型 I/O Pipeline 下面先来看看 LangChain 中的输出解析器究竟是什么&#xff0c;有哪些种类。 LangChain 中的输出解析器 语言模型输出的是文本&#xff0c;这是给人类阅读的。但很多时候&#xff0c;你…...

cfa一级考生复习经验分享系列(十二)

背景&#xff1a;就职于央企金融机构&#xff0c;本科金融背景&#xff0c;一直在传统金融行业工作。工作比较忙&#xff0c;用了45天准备考试&#xff0c;几乎每天在6小时以上。 写在前面的话 先讲一下&#xff0c;整体一级考下来&#xff0c;我觉得知识点多&#xff0c;偏基础…...

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数&#xff0c;通常用于回归问题。它是 L1 损失和 L2 损失的结合&#xff0c;旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…...

Go语言中的HTTP重定向

大家好&#xff0c;我是你们可爱的编程小助手&#xff0c;今天我们要一起探讨如何使用Go语言实现HTTP重定向&#xff0c;让我们开始吧&#xff01; 大家都知道&#xff0c;网站开发中有时候需要将用户的请求从一个URL导向到另一个URL。比如说&#xff0c;你可能想将旧的URL结构…...

ORACLE P6 v23.12 最新虚拟机(VM)全套系统环境分享

引言 根据上周的计划&#xff0c;我简单制作了两套基于ORACLE Primavera P6 最新发布的23.12版本预构建了虚拟机环境&#xff0c;里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代…...

鸿蒙开发ArkTS基础学习-开发准备工具配置

文章目录 前言1. 准备工作2.开发文档3.鸿蒙开发路径一.详情介绍二.DevEco Studio安装详解-开发环境搭建2.1配置开发环境欢迎各位读者阅读本文,今天我们将介绍鸿蒙(HarmonyOS)应用开发的入门步骤,特别是在准备工作和开发环境搭建方面的重要信息。本文将对鸿蒙官方网站的关键…...

WEB 3D技术 three.js 雾 基础使用讲解

本文 我们说一下 雾 在three.js中有一个 Fog类 它可以创建线性雾的一个效果 她就是模仿现实世界中 雾的一个效果 你看到远处物体会组件模糊 直到完全被雾掩盖 在 three.js 中 有两种雾的形式 一种是线性的 一种是指数的 个人觉得 线性的会看着自然一些 他是 从相机位置开始 雾…...

Python中的网络编程

IP地址 IPv4IPv6查看本机的IP地址 win ipconfiglinux ifconfig ping命令 ping www.baidu.com 查看是否能连通指定的网站ping 192.168.1.222 查看是否能连通指定的IP Port端口 0-65535 TCP/IP协议 传输数据之前要建立连接&#xff0c;通过三次握手建立&#xff1a; 客户端 --&g…...

uni-app js语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

【论文阅读笔记】Detecting Camouflaged Object in Frequency Domain

1.论文介绍 Detecting Camouflaged Object in Frequency Domain 基于频域的视频目标检测 2022年发表于CVPR [Paper] [Code] 2.摘要 隐藏目标检测&#xff08;COD&#xff09;旨在识别完美嵌入其环境中的目标&#xff0c;在医学&#xff0c;艺术和农业等领域有各种下游应用。…...

Mysql(5日志备份恢复)

一.日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data 先看下mysql的日志文件有无&#xff1a; 修改配置文件添加&#xff1a;错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信息&#xff0c;默认已开启 修改配置文件添加&#xff1a;通用查…...

MR实战:实现数据去重

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、Map阶段实现&#xff08;1&#xff09;创建Maven项目&#xff08;2&#xff09;添加相关依赖…...

JVM 常用知识和面试题

1. 什么是JVM内存结构&#xff1f; jvm将虚拟机分为5大区域&#xff0c;程序计数器、虚拟机栈、本地方法栈、java堆、方法区&#xff1b; 程序计数器&#xff1a;线程私有的&#xff0c;是一块很小的内存空间&#xff0c;作为当前线程的行号指示器&#xff0c;用于记录当前虚拟…...