java ,springboot 对接支付宝支付,实现生成付款二维码,退款,查询订单状态等接口

news2025/4/9 6:30:09

查看文档 支付宝文档地址:

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

使用沙箱环境

沙箱登录地址

登录 - 支付宝

点击查看 才能看钥匙截图写错了。。 问号可以看默认加密方式

点击沙箱帐号 这里我们就具备所有条件了

实战开始

pom文件增加依赖

<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.0.ALL</version>
</dependency>

创建配置文件,将沙箱内的信息填写到配置文件

# 支付宝网关名
open_api_domain = https://openapi-sandbox.dl.alipaydev.com/gateway.do

#此处请填写你的PID
pid = 20887210111111
#此处请填写你当面付的APPID
appid = 902101111110

# RSA私钥、公钥和支付宝公钥
#此处请填写你的应用私钥且转PKCS8格式
private_key = cpwVvks4h8PwdWDm13Jc207PvY5iy+8xMQd919ClW9H8lVBbpuyA+uyRmoPHp63SpmSnyXAye7ZvjDvuJ4kH9edbLnL
#此处请填写你的应用公钥
public_key = qRhLEXLU+LvD91mAs1iVCGx4bpfl2eLpwLMYvCePwijD6xdBPuRsNv3Chw4xUHfoqK6MKRLzXeqJPdEinhr/DZrAnSbkdH8BwIDAQAB

#SHA256withRsa对应支付宝公钥
alipay_public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqGJldKdkvrx1WirZ4LGUP1DCELrb9Ci1qIdU1Y35z7v4V44BWv2QZoFVVjqVd7mAy7EtCM/cnTH5

# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2
# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000

# 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000

# 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

#异步通知url(注意拦截器是否拦截)
NotifyUrl=http://fpwquz.natappfree.cc/callbac

支付实体

package com.bjbr.controller;

import com.alipay.api.domain.GoodsDetail;

import java.util.List;

/**
 * 支付宝当面付实体类
 *
 */
public class ZFBFaceToFaceModel {
    private String outTradeNo;// (必填) 商户网站订单系统中唯一订单号 ,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成

    private String subject; // (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”
    private String totalAmount;// (必填) 订单总金额单位为元,不能超过1亿元 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
    private String undiscountableAmount;// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
    private String sellerId;// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
    private String body;// // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
    private String operatorId; // 商户操作员编号,添加此参数可以为商户操作员做销售统计
    private String storeId; // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
    private String timeoutExpress;//支付超时如:“120m”,定义为120分钟
    private List<GoodsDetail> goodsDetailList; //商品明细列表,需填写购买商品详细信息,
    private String NotifyUrl;// 支付成功之后 支付宝异步调用的接口地址;
    private String MoblieReturnUrl;//手机支付同步通知页面地址;
    private String refundReason;//退款原因,(退款使用)
    private String tradeNo;//支付宝订单号,(退款使用)

    public String getTradeNo() {
        return tradeNo;
    }

    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo;
    }

    public String getRefundReason() {
        return refundReason;
    }

    public void setRefundReason(String refundReason) {
        this.refundReason = refundReason;
    }

    /**
     * (必填) 商户网站订单系统中唯一订单号 ,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成
     * @return
     */
    public String getOutTradeNo() {
        return outTradeNo;
    }
    /**
     * (必填) 商户网站订单系统中唯一订单号 ,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成
     * @param outTradeNo
     */
    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo;
    }
    /**
     * (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”
     * @return
     */
    public String getSubject() {
        return subject;
    }
    /**
     * (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”
     * @param subject
     */
    public void setSubject(String subject) {
        this.subject = subject;
    }
    /**
     *  (必填) 订单总金额单位为元,不能超过1亿元 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
     * @return
     */
    public String getTotalAmount() {
        return totalAmount;
    }
    /**
     *  (必填) 订单总金额单位为元,不能超过1亿元 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
     * @param totalAmount
     */
    public void setTotalAmount(String totalAmount) {
        this.totalAmount = totalAmount;
    }
    /**
     * (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
     * @return
     */
    public String getUndiscountableAmount() {
        return undiscountableAmount;
    }
    /**
     * (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
     * @param undiscountableAmount
     */
    public void setUndiscountableAmount(String undiscountableAmount) {
        this.undiscountableAmount = undiscountableAmount;
    }
    /**
     * // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
     * @return
     */
    public String getSellerId() {
        return sellerId;
    }
    /**
     * // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
     * @param sellerId
     */
    public void setSellerId(String sellerId) {
        this.sellerId = sellerId;
    }
    /**
     * 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
     * @return
     */
    public String getBody() {
        return body;
    }
    /**
     * 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
     * @param body
     */
    public void setBody(String body) {
        this.body = body;
    }
    /**
     *商户操作员编号,添加此参数可以为商户操作员做销售统计
     * @return
     */
    public String getOperatorId() {
        return operatorId;
    }
    /**
     *商户操作员编号,添加此参数可以为商户操作员做销售统计
     * @param operatorId
     */
    public void setOperatorId(String operatorId) {
        this.operatorId = operatorId;
    }
    /**
     * (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
     * @return
     */
    public String getStoreId() {
        return storeId;
    }
    /**
     * (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
     * @param storeId
     */
    public void setStoreId(String storeId) {
        this.storeId = storeId;
    }
    /**
     *支付超时如:“120m”,定义为120分钟
     * @return
     */
    public String getTimeoutExpress() {
        return timeoutExpress;
    }
    /**
     *支付超时如:“120m”,定义为120分钟
     * @param timeoutExpress
     */
    public void setTimeoutExpress(String timeoutExpress) {
        this.timeoutExpress = timeoutExpress;
    }
    /**
     *商品明细列表,需填写购买商品详细信息,
     * @return
     */
    public List<GoodsDetail> getGoodsDetailList() {
        return goodsDetailList;
    }
    /**
     *商品明细列表,需填写购买商品详细信息,
     * @param goodsDetailList
     */
    public void setGoodsDetailList(List<GoodsDetail> goodsDetailList) {
        this.goodsDetailList = goodsDetailList;
    }
    /**
     *支付成功之后 支付宝异步调用的接口地址;
     * @return
     */
    public String getNotifyUrl() {
        return NotifyUrl;
    }
    /**
     *支付成功之后 支付宝异步调用的接口地址;
     * @param notifyUrl
     */
    public void setNotifyUrl(String notifyUrl) {
        NotifyUrl = notifyUrl;
    }
    /**
     * 手机支付后跳转的页面地址
     * @return
     */
    public String getMoblieReturnUrl() {
        return MoblieReturnUrl;
    }
    /**
     * 手机支付后跳转的页面地址
     * @return
     */
    public void setMoblieReturnUrl(String moblieReturnUrl) {
        MoblieReturnUrl = moblieReturnUrl;
    }
}

根据键值获取配置文件内容方法

public static String getZFBinfoValue(String name){

		try(InputStream inputStream = CommonUtils.class.getClassLoader().getResourceAsStream("config/zfbinfo.properties")) {
			if(properties==null){
				properties = new Properties();
				properties.load(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
			}
			return properties.getProperty(name,"");
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			return "";
		}

	}

获取二维码接口

public static String getZFBPreorder(ZFBFaceToFaceModel zfbFaceToFaceModel) throws AlipayApiException {

            CommonUtils commonUtils = new CommonUtils();
            /** 支付宝网关 **/
            String URL = commonUtils.getZFBinfoValue("open_api_domain");

            /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
            String APP_ID = commonUtils.getZFBinfoValue("appid");

            /** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
            String APP_PRIVATE_KEY = commonUtils.getZFBinfoValue("private_key");

            /** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/
            String ALIPAY_PUBLIC_KEY = commonUtils.getZFBinfoValue("alipay_public_key");

            /** 初始化 **/
            AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2");

            /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.precreate(统一收单线下交易预创建(扫码支付)) **/
            AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

            /** 设置业务参数  **/
            AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();

            /** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
            model.setOutTradeNo(zfbFaceToFaceModel.getOutTradeNo());

            /**订单标题 **/
            model.setSubject(zfbFaceToFaceModel.getSubject());

            /** 订单金额,精确到小数点后两位 **/
            model.setTotalAmount(zfbFaceToFaceModel.getTotalAmount());

            /** 订单描述 **/
            model.setBody(zfbFaceToFaceModel.getBody());


            /** 将业务参数传至request中 **/
            request.setBizModel(model);

            /** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/
            request.setNotifyUrl(zfbFaceToFaceModel.getNotifyUrl());


            /** 通过alipayClient调用API,获得对应的response类  **/
            AlipayTradePrecreateResponse response = alipayClient.execute(request);

            /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/
            System.out.println(response.getBody());
            return response.getBody();

    }

退款接口

public static String ZFBTradeRefund(ZFBFaceToFaceModel zfbFaceToFaceModel) throws AlipayApiException {

                CommonUtils commonUtils = new CommonUtils();
                /** 支付宝网关 **/
                String URL = commonUtils.getZFBinfoValue("open_api_domain");

                /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
                String APP_ID = commonUtils.getZFBinfoValue("appid");

                /** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
                String APP_PRIVATE_KEY = commonUtils.getZFBinfoValue("private_key");

                /** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/
                String ALIPAY_PUBLIC_KEY = commonUtils.getZFBinfoValue("alipay_public_key");

                /** 初始化 **/
                AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2");

                /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.refund(统一收单交易退款接口) **/
                AlipayTradeRefundRequest  request = new AlipayTradeRefundRequest();

                /** 设置业务参数  **/
                AlipayTradeRefundModel model = new AlipayTradeRefundModel ();

                /** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
                model.setOutTradeNo(zfbFaceToFaceModel.getOutTradeNo());
                model.setTradeNo(zfbFaceToFaceModel.getTradeNo());
                // 设置退款金额
                model.setRefundAmount(zfbFaceToFaceModel.getTotalAmount());

                // 设置退款原因说明
                model.setRefundReason(zfbFaceToFaceModel.getRefundReason());

                // 设置退款请求号 退款请求号。 标识一次退款请求,需要保证在交易号下唯一
                model.setOutRequestNo(UUID.randomUUID().toString());

                /** 将业务参数传至request中 **/
                request.setBizModel(model);

                /** TODO暂时不用退款通知 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/
                request.setNotifyUrl("");


                AlipayTradeRefundResponse response = alipayClient.execute(request);
                /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/
                System.out.println(response.getBody());
                if (response.isSuccess()) {
                        System.out.println("调用成功");
                } else {
                        System.out.println("调用失败");
                }
                return response.getBody();

        }

查询订单状态接口

public static String ZFBTradeQuery(ZFBFaceToFaceModel zfbFaceToFaceModel) throws AlipayApiException {

                CommonUtils commonUtils = new CommonUtils();
                /** 支付宝网关 **/
                String URL = commonUtils.getZFBinfoValue("open_api_domain");

                /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
                String APP_ID = commonUtils.getZFBinfoValue("appid");

                /** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
                String APP_PRIVATE_KEY = commonUtils.getZFBinfoValue("private_key");

                /** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/
                String ALIPAY_PUBLIC_KEY = commonUtils.getZFBinfoValue("alipay_public_key");

                /** 初始化 **/
                AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2");

                /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.refund(统一收单交易退款接口) **/
                AlipayTradeQueryRequest request = new AlipayTradeQueryRequest ();

                /** 设置业务参数  **/
                AlipayTradeQueryModel model = new AlipayTradeQueryModel  ();

                /** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
                model.setOutTradeNo(zfbFaceToFaceModel.getOutTradeNo());
                model.setTradeNo(zfbFaceToFaceModel.getTradeNo());

                /** 将业务参数传至request中 **/
                request.setBizModel(model);


                AlipayTradeQueryResponse response = alipayClient.execute(request);
                /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/

                //解析json数据
                JSONObject jsonObject=JSONObject.parseObject(response.getBody());
                //得到alipay_trade_query_response数据后再强转JSONObject
                JSONObject jsonobj_two=(JSONObject)jsonObject.get("alipay_trade_query_response");
                //再通过jsonobj_two获取到二维码地址

                String code=jsonobj_two.get("code").toString();
                //交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
                String trade_status=jsonobj_two.get("trade_status").toString();
                if (trade_status.equals("TRADE_SUCCESS")) {//用户已付款 直接调用回调

                        return "yzf";
                }else {
                        return "wzf";
                }

        }

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

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

相关文章

深入内核讲明白Android Binder【三】

深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …

chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确

问题描述 chrome游览器又一款JSON插件叫JSON Formatter&#xff0c;游览器GET请求调用接口时&#xff0c;如果返回的数据是json格式&#xff0c;则会自动格式化展示&#xff0c;类似这样&#xff1a; 但是今天突然发现怎么也格式化不了&#xff0c;打开一个json文件倒是可以格…

canvas基础

今天我们简单的来认识学习一下canvas的基础概念和使用方法。 1. 认识canvas 1.1 什么是canvas 在网页开发中&#xff0c;canvas是html5中的一个元素&#xff0c;用于通过JavaScript绘制图形。它可以用来制作简单的图表、动画和游戏等。 1.2. 使用场景 游戏开发&#xff1a…

OneData体系架构详解

阿里巴巴的 OneData 体系架构方法论&#xff0c;主要分为三个阶段&#xff1a;业务板块、规范定义 和 模型设计。每个阶段的核心目标是确保数据的高效管理、共享与分析能力。 一. 业务板块&#xff08;Business Segment&#xff09; 业务板块是OneData体系架构中的第一步&…

【C++】哈希表的使用

unordered_map/unordered_set 这是C11才新增的两个容器 原本觉得avl树和红黑树效率已经够了。 后来探索和觉得哈希还是有必要加进来的。 JAVA里面是这样取名的&#xff1a; unordered_set unordered_map/set与map/set的功能基本一致&#xff0c;但细节上有所不同&#x…

微信小程序1.1 微信小程序介绍

1.1 微信小程序介绍 内容提要 什么是微信小程序 微信小程序的功能 微信小程序使用场景 微信小程序能取代App吗 微信小程序的发展历程 微信小程序带来的机会

前端Vue2项目使用md编辑器

项目中有一个需求&#xff0c;要在前端给用户展示内容&#xff0c;内容有 AI 生成的&#xff0c;返回来的是 md 格式&#xff0c;所以需要给用户展示 md 格式&#xff0c;并且管理端也可以编辑这个 md 格式的文档。 使用组件库 v-md-editor。 https://code-farmer-i.github.i…

26、正则表达式

目录 一. 匹配字符 .&#xff1a;匹配除换行符外的任意单个字符。 二. 位置锚点 ^&#xff1a;匹配输入字符串的开始位置。 $&#xff1a;匹配输入字符串的结束位置。 \b&#xff1a;匹配单词边界。 \B&#xff1a;匹配非单词边界。 三. 重复限定符 *&#xff1a;匹配…

K8S中Service详解(一)

Service介绍 在Kubernetes中&#xff0c;Service资源解决了Pod IP地址不固定的问题&#xff0c;提供了一种更稳定和可靠的服务访问方式。以下是Service的一些关键特性和工作原理&#xff1a; Service的稳定性&#xff1a;由于Pod可能会因为故障、重启或扩容而获得新的IP地址&a…

【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?

目录 前言一、怎么设置成开发者模式&#xff1f;二、真机调试基本步骤&#xff1f; &#x1f680;写在最后 前言 edge浏览器 edge://inspect/#devices 谷歌浏览器&#xff08;开tizi&#xff09; chrome://inspect 一、怎么设置成开发者模式&#xff1f; Android 设备 打开设…

初探大数据流式处理

文章目录 初探大数据流式处理批式处理系统特点流式处理系统特点大批次计算微批次计算适用场景 流式计算的应用场景流式大数据的特征流式计算的关键技术流式处理框架的特征三大流式数据处理框架 初探大数据流式处理 大数据处理系统主要分为批式处理和流式处理两类。批式处理将大…

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开&#xff0c;使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版&#xff0c;仅包含Conda和Python&#xff0c;如果只做深度学习&#xff0c;可使用miniconda。 [注]&#xff1a;Anaconda、Conda与Miniconda Conda&#xff1a;创建和管…

部门管理查询部门,nginx反向代理,前端如何访问到后端Tomcat 注解@RequestParam

接口开发 增删改通常是不用返回data数据&#xff0c;返回null 列表查询-结果封装&#xff0c;时间 前后端联调测试 nginx反向代理&#xff0c;前端如何访问到后端Tomcat服务器 删除部门

PID 控制算法(二):C 语言实现与应用

在本文中&#xff0c;我们将用 C 语言实现一个简单的 PID 控制器&#xff0c;并通过一个示例来演示如何使用 PID 控制算法来调整系统的状态&#xff08;如温度、速度等&#xff09;。同时&#xff0c;我们也会解释每个控制参数如何影响系统的表现。 什么是 PID 控制器&#xf…

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…

RTMP|RTSP播放器只解码视频关键帧功能探讨

技术背景 我们在做RTMP|RTSP直播播放器的时候&#xff0c;遇到过这样的技术诉求&#xff0c;在一些特定的应用场景中&#xff0c;可能只需要关键帧的信息&#xff0c;例如视频内容分析系统&#xff0c;可能只对关键帧进行分析&#xff0c;以提取特征、检测对象或场景变化。鉴于…

C#防止重复提交

C#防止重复提交 文章目录 C#防止重复提交前言防止重复提交的思路Web API 防止重复提交代码实现代码讲解使用方法 MVC防止重复提交总结 前言 当用户在前端进行提交数据时&#xff0c;如果网络出现卡顿和前端没有给出响应的话顾客通常都会狂点提交按钮&#xff0c;这样就很容易导…

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框&#xff08;QMessageBox&#xff09;和对话框&#xff08;QDialog&#xff09;&#xff0c;比如对话框用于用户名和密码输入&#xff0c;消息框用于提示登录成功、密码错误。 • 基础知识&#xff1a;PySide6&#xff08;PyQT5&#xff09;的常用对话…

在 Kubernetes 上快速安装 KubeSphere v4.1.2

目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…