java进行支付宝支付(沙箱环境)

目录

1.准备工作

2.idea配置文件准备

3.后端代码编写

接口1:支付订单

接口2:查询订单

接口3:订单退款

接口4:查询退款结果

接口5:获取总账单

接口6:取消订单

接口7:回调接口

定时任务:主动查询订单

4.前端代码编写

5.验证 

支付订单

查询订单

订单退款

查询退款

取消订单


1.准备工作

进入沙箱控制台获取自己的买家卖家id、网关等配置信息
快速接入 - 支付宝文档中心 (alipay.com)

将沙箱工具下载本地,方便支付和调试,支付宝沙箱版

2.idea配置文件准备


properties设置自己沙箱的信息:8个值

#alipay 沙箱环境
#自己的appid  沙箱应用里面
alipay.app-id=xxx
#商户pid 沙箱账号里面
alipay.seller-id=xxx
#支付宝公钥 沙箱应用里面  公钥模式-》查看
alipay.alipay-public-key=xxx
#应用私钥 沙箱应用里面
alipay.merchant-private-key=xxx
#支付宝网关地址 沙箱应用里面
alipay.gateway-url= xxx
#接口内容加密方式 沙箱应用里面-》接口内容加密方式
alipay.content-key=xxx
#支付回调返回地址 如果自己有页面就写,没的话就返回百度
alipay.return-url = https://www.baidu.com
#支付回调公网地址+接口   这个需要通过ngrok穿透,让自己本地的项目映射到公网 这里不多讲解
alipay.notify-url = xxx

3.后端代码编写

controller层:接口总共7个接口,其中有一个是支付宝回调接口,就是你支付完成后,支付宝调用你提供的接口给你传回调消息,所以需要你这个接口是能够在公网访问的接口,因此对于本地环境来说需要内网穿透。

接口1:支付订单

根据前端选择的商品id/编号,传入后台后,调用AlipayTradePagePayModel进行参数设置,最后通过AlipayTradePagePayRequest,设置1支付成功后的回调地址我写的百度2回调在哪个接口暴漏公网的接口,然后执行pageExecute完成签名执行请求

实现代码如下:

impl层代码

 public String createPay(Long orderId) {//1.请求AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();//2.设置数据AlipayTradePagePayModel bizModel = new AlipayTradePagePayModel();// 商品编号bizModel.setOutTradeNo(orderId.toString());//单位是元bizModel.setTotalAmount(String.valueOf(0.01));// 订单标题bizModel.setSubject("测试商品");//默认的bizModel.setProductCode("FAST_INSTANT_TRADE_PAY");//3.绑定request.setBizModel(bizModel);// 支付成功后返回哪里request.setReturnUrl(returnUrl);// 结果回调地址request.setNotifyUrl(notifyUrl);//用户支付后支付宝会以GET方法请求returnUrl,并且携带out_trade_no,trade_no,total_amount等参数.AlipayTradePagePayResponse response = null;try {//完成签名并执行请求response = alipayClient.pageExecute(request);if (response.isSuccess()) {log.debug("调用成功,参数为===>{}",JSON.toJSONString(response.getBody()));return response.getBody();} else {log.error("调用失败");log.error(response.getMsg());return null;}} catch (AlipayApiException e) {log.error("调用异常");return null;}}

支付回调接口

  /*** 支付宝回调* 发起支付后,商户进行的验证和保存记录等操作* 这个接口地址是根据配置文件进行配置的* @param params 支付宝返回的* @return 返回给支付宝的  只有两种状态 success  failure*/@PostMapping("/tradeNotify")public String tradeNotify(@RequestParam Map<String, String> params) {
//        支付通知正在执行
//        通知参数===>
//        {
//        "gmt_create":"2023-11-01 09:59:50",
//        "charset":"UTF-8",
//        "gmt_payment":"2023-11-01 10:00:15",
//        "notify_time":"2023-11-01 10:00:17",
//        "subject":"测试商品",
//        "sign":"f5/aoi4fNs+DZRuyqFr6uU1J6l6sImbZLZzJvYl76tDJFRW+gv3Ewk2DW6EemdD9zNt0QNpagfp3IS0CVDKnTrVly4aA/QehNQ9f6Ru9kNU9lqRhc/GRx2ikuQgYw7MUeoMLXNSL5xh9G09bVFBwl7iYa/I2fh8FgFQTyDgjUVjsFen7Kokt70DNi1KIWyuD7qLCMu7SRYP0NtNp6kA1AoRhx6zpu2MOCqRVlsMeQyYB5fbj0sWJcWogWBYcUuzTZrLE0X/lc7a8hMYw63IhBag47L9sbtxcZfOIq1Sd7/L20fmaPLl0PZllbILad+O6uIRXBRC5PvZa/t9IN2A2gw==",
//        "buyer_id":"2088722019936375",
//        "invoice_amount":"0.01",
//        "version":"1.0",
//        "notify_id":"2023110101222100016036370501117115",
//        "fund_bill_list":"[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
//        "notify_type":"trade_status_sync",
//        "out_trade_no":"486789",
//        "total_amount":"0.01","
//        trade_status":"TRADE_SUCCESS",
//        "trade_no":"2023110122001436370501040720",
//        "auth_app_id":"9021000131620971",
//        "receipt_amount":"0.01",
//        "point_amount":"0.00",
//        "buyer_pay_amount":"0.01",
//        "app_id":"9021000131620971",
//        "sign_type":"RSA2",
//        "seller_id":"2088721019958624"
//        }log.info("支付回调正在执行");log.info("支付宝回调参数为===>{}", JSON.toJSONString(params));//验签boolean signVerified = false;String result = "failure";try {// 入参signVerified = AlipaySignature.rsaCheckV1(params, aliPayPublicKey, AlipayConstants.CHARSET_UTF8, AlipayConstants.SIGN_TYPE_RSA2);//验签成功if (signVerified) {log.info("验签成功");// 1.商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号  数据库查询这条记录是否存在?在生成订单的时候创建订单String out_trade_no = params.get("out_trade_no");// 根据订单号查询这条记录,返回order,如果不存在返回result(failure)// 2.商户需要验证该通知数据中的total_amount是否为该订单的实际金额(即商户订单创建时的金额)String totalAmount = params.get("total_amount");int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue();// 将order中的价格拿出来跟这个作比较,若不同返回result(failure)// 3. 校验通知中的seller_id(或者sell_email)是否为out_trade_no 这笔单据的对应的操作方法  需要保持与商户pid一致String sellerId = params.get("seller_id");if (!sellerId.equals(aliPaySellerId)){log.error("商家pid校验失败");return result;}// 4. 验证app_id 是否为商户本身String appId = params.get("app_id");if (!appId.equals(aliPayAppId)){log.error("appId校验失败");return result;}// 5. 验证交易通知是否为TRADE_SUCCESS,只有为TRADE_SUCCESS支付宝才会认定买家付款成功String tradeStatus = params.get("trade_status");if (!"TRADE_SUCCESS".equals(tradeStatus)){log.error("支付未成功");return result;}// 处理订单后续log.info("5大校验验证通过,开始对回调函数进行处理");aliPayService.processOrder(params);result = "success";return result;} else {log.error("验签失败");return result;}} catch (AlipayApiException e) {log.error("验签异常");return result;}}

impl

 @Overridepublic void processOrder(Map<String, String> params) {String out_trade_no = params.get("out_trade_no");//支付宝支付中的支付编号String trade_no = params.get("trade_no");//交易类型(扫码 登录等等)String trade_status = params.get("trade_status");//存放全部数据(json)以备不时之需String s = JSON.toJSONString(params);// 将订单状态查询出来,如果是未支付就继续执行下面操作  仅仅只有未支付才进行下面操作// 如果已经支付就returnif (lock.tryLock()) {try {log.info("幂等性校验开始");
//                if (!"未支付".equals("调用数据库查询")) {
//                    return;
//                }// 更新订单状态// 记录支付日志log.info("幂等性校验结束");log.info("订单{}的支付日志已添加,状态已更改为已支付,支付宝记录编号为{}", out_trade_no, trade_no); //订单789454的支付记录添加成功,支付记录id为2023110122001436370501040721.} catch (Exception e) {} finally {lock.unlock();}}}

接口2:查询订单

前端传入商品id/编号,后端封装数据使用AlipayTradeQueryModel,用AlipayTradeQueryRequest发起请求。

实现代码如下:

 @Overridepublic String queryPay(String orderNo) {//请求AlipayTradeQueryRequest request=new AlipayTradeQueryRequest();//数据AlipayTradeQueryModel bizModel=new AlipayTradeQueryModel();bizModel.setOutTradeNo(orderNo);request.setBizModel(bizModel);try{//完成签名并执行请求AlipayTradeQueryResponse response=alipayClient.execute(request);if(response.isSuccess()){log.info("查询订单{}成功",orderNo);return response.getBody();}else{log.error("查询订单{}失败,响应数据是{}.",orderNo,response.getBody());return null;}}catch(AlipayApiException e){log.error("查询订单{}异常",orderNo);return null;}}

接口3:订单退款

传入两个参数,商品id/编号和退款原因

需要注意点是如果封装数据时传入了退款订单号(自己设置的),那么在后面查询订单退款信息时也需要传入这个退款订单号,如果这里没有设置,后面的退款订单号就是商品id/编号

实现代码如下:

 @Overridepublic void refund(String orderNo, String reason) {//请求AlipayTradeRefundRequest request=new AlipayTradeRefundRequest();//数据AlipayTradeRefundModel bizModel=new AlipayTradeRefundModel();//订单号bizModel.setOutTradeNo(orderNo);// 退款金额bizModel.setRefundAmount("0.01");//退款原因bizModel.setRefundReason(reason);request.setBizModel(bizModel);log.info("签名入参===>{}",JSON.toJSONString(request));try{//完成签名并执行请求AlipayTradeRefundResponse response=alipayClient.execute(request);//成功则说明退款成功了if(response.isSuccess()){log.info("订单{}退款成功",orderNo);}else{log.error("订单{}退款失败,错误原因===>{}",orderNo,response.getSubMsg());throw new RuntimeException("订单退款失败");}}catch(AlipayApiException e){log.error("订单{}退款异常",orderNo);throw new RuntimeException("订单退款异常");}}

接口4:查询退款结果

前端传入订单编号,后端进行查询,注意点就是刚才所说退款订单号问题,如果退款时没传退款订单号,这里就传订单号

实现代码如下:

 @Overridepublic String queryRefund(String orderNo) {AlipayTradeFastpayRefundQueryRequest request=new AlipayTradeFastpayRefundQueryRequest();AlipayTradeFastpayRefundQueryModel bizModel=new AlipayTradeFastpayRefundQueryModel();//订单号bizModel.setOutTradeNo(orderNo);// 退款订单号,如果退款时候没有传退款订单号,那么查询时就传订单号bizModel.setOutRequestNo(orderNo);//想要额外返回的数据(也就是文档中响应可选的数据)ArrayList<String> extraResponseDatas=new ArrayList<>();extraResponseDatas.add("refund_status");bizModel.setQueryOptions(extraResponseDatas);request.setBizModel(bizModel);try{//完成签名并执行请求AlipayTradeFastpayRefundQueryResponse response=alipayClient.execute(request);if(response.isSuccess()){log.info("退款{}查询成功",orderNo);return JSON.toJSONString(response.getBody());}else{log.debug("退款{}查询失败,原因是==>{}",orderNo,response.getSubMsg());return null;}}catch(AlipayApiException e){log.debug("退款{}查询异常",orderNo);return null;}}

接口5:获取总账单

根据账单类型和日期获取账单url地址,这里出参是url,放在浏览器直接下载

实现代码如下:

 @Overridepublic String queryBill(String billDate, String type) {//请求AlipayDataDataserviceBillDownloadurlQueryRequest request=new AlipayDataDataserviceBillDownloadurlQueryRequest();//数据AlipayDataDataserviceBillDownloadurlQueryModel bizModel=new AlipayDataDataserviceBillDownloadurlQueryModel();bizModel.setBillType(type);bizModel.setBillDate(billDate);request.setBizModel(bizModel);try{//完成签名并执行请求AlipayDataDataserviceBillDownloadurlQueryResponse response=alipayClient.execute(request);if(response.isSuccess()){log.info("获取账单下载url成功");return response.getBillDownloadUrl();}else{log.error("获取账单下载url失败,原因是===>{}",response.getSubMsg());return null;}}catch(AlipayApiException e){log.error("获取账单下载url异常");return null;}}

接口6:取消订单

传入商品id/编号,后端封装数据,完成签名后进行取消

实现代码如下:

 private void closePay(String orderNo) {log.info("关单接口的订单号,订单号===>{}",JSON.toJSONString(orderNo));//请求AlipayTradeCloseRequest request=new AlipayTradeCloseRequest();//数据AlipayTradeCloseModel bizModel=new AlipayTradeCloseModel();bizModel.setOutTradeNo(orderNo);request.setBizModel(bizModel);try{//完成签名并执行请求AlipayTradeCloseResponse response=alipayClient.execute(request);if(response.isSuccess()){log.info("订单{}取消成功",orderNo);}else{log.info("订单{}取消失败,原因==>{}",orderNo,response.getSubMsg());throw new RuntimeException("关单接口调用失败");}}catch(AlipayApiException e){log.error("订单{}取消异常",orderNo);throw new RuntimeException("关单接口异常");}}

接口7:回调接口

当发起支付后,支付宝会调该接口进行数据返回,需要验证签名和5个参数

  @PostMapping("/tradeNotify")public String tradeNotify(@RequestParam Map<String, String> params) {
//        支付通知正在执行
//        通知参数===>
//        {
//        "gmt_create":"2023-11-01 09:59:50",
//        "charset":"UTF-8",
//        "gmt_payment":"2023-11-01 10:00:15",
//        "notify_time":"2023-11-01 10:00:17",
//        "subject":"测试商品",
//        "sign":"f5/aoi4fNs+DZRuyqFr6uU1J6l6sImbZLZzJvYl76tDJFRW+gv3Ewk2DW6EemdD9zNt0QNpagfp3IS0CVDKnTrVly4aA/QehNQ9f6Ru9kNU9lqRhc/GRx2ikuQgYw7MUeoMLXNSL5xh9G09bVFBwl7iYa/I2fh8FgFQTyDgjUVjsFen7Kokt70DNi1KIWyuD7qLCMu7SRYP0NtNp6kA1AoRhx6zpu2MOCqRVlsMeQyYB5fbj0sWJcWogWBYcUuzTZrLE0X/lc7a8hMYw63IhBag47L9sbtxcZfOIq1Sd7/L20fmaPLl0PZllbILad+O6uIRXBRC5PvZa/t9IN2A2gw==",
//        "buyer_id":"2088722019936375",
//        "invoice_amount":"0.01",
//        "version":"1.0",
//        "notify_id":"2023110101222100016036370501117115",
//        "fund_bill_list":"[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
//        "notify_type":"trade_status_sync",
//        "out_trade_no":"486789",
//        "total_amount":"0.01","
//        trade_status":"TRADE_SUCCESS",
//        "trade_no":"2023110122001436370501040720",
//        "auth_app_id":"9021000131620971",
//        "receipt_amount":"0.01",
//        "point_amount":"0.00",
//        "buyer_pay_amount":"0.01",
//        "app_id":"9021000131620971",
//        "sign_type":"RSA2",
//        "seller_id":"2088721019958624"
//        }log.info("支付回调正在执行");log.info("支付宝回调参数为===>{}", JSON.toJSONString(params));//验签boolean signVerified = false;String result = "failure";try {// 入参signVerified = AlipaySignature.rsaCheckV1(params, aliPayPublicKey, AlipayConstants.CHARSET_UTF8, AlipayConstants.SIGN_TYPE_RSA2);//验签成功if (signVerified) {log.info("验签成功");// 1.商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号  数据库查询这条记录是否存在?在生成订单的时候创建订单String out_trade_no = params.get("out_trade_no");// 根据订单号查询这条记录,返回order,如果不存在返回result(failure)// 2.商户需要验证该通知数据中的total_amount是否为该订单的实际金额(即商户订单创建时的金额)String totalAmount = params.get("total_amount");int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue();// 将order中的价格拿出来跟这个作比较,若不同返回result(failure)// 3. 校验通知中的seller_id(或者sell_email)是否为out_trade_no 这笔单据的对应的操作方法  需要保持与商户pid一致String sellerId = params.get("seller_id");if (!sellerId.equals(aliPaySellerId)){log.error("商家pid校验失败");return result;}// 4. 验证app_id 是否为商户本身String appId = params.get("app_id");if (!appId.equals(aliPayAppId)){log.error("appId校验失败");return result;}// 5. 验证交易通知是否为TRADE_SUCCESS,只有为TRADE_SUCCESS支付宝才会认定买家付款成功String tradeStatus = params.get("trade_status");if (!"TRADE_SUCCESS".equals(tradeStatus)){log.error("支付未成功");return result;}// 处理订单后续log.info("5大校验验证通过,开始对回调函数进行处理");// 进行自己的业务操作aliPayService.processOrder(params);result = "success";return result;} else {log.error("验签失败");return result;}} catch (AlipayApiException e) {log.error("验签异常");return result;}}

定时任务:主动查询订单

除了回调这个被动查询外,我们也可以通过定时任务来进行定时查询表中未支付的订单和支付宝中的状态,来保证一致性。

定时把表中未支付的订单拿出来,进行查询

 /*** 从第0秒开始每隔30s执行一次,查询创建超过5分钟且未支付的订单*/@Scheduled(cron = "0/30 * * * * ?")public void orderConfirm(){log.info("orderConfirm被执行...");// 1.查询本地未支付的记录,这里写死了String orderNo = "9956851223";// 2.核实订单状态,调用支付宝查单接口aliPayService.checkPayStatus(orderNo);}
  /*** 查询支付宝订单状态* @param orderNo*/@Overridepublic void checkPayStatus(String orderNo) {log.info("根据订单号核实订单状态=====>{}",JSON.toJSONString(orderNo));// 查询支付宝这个订单的状态String result = this.queryPay(orderNo);// 1.如果未创建if (result == null){log.info("订单未创建===>{}",JSON.toJSONString(orderNo));// 更新订单状态return;}System.out.println("result"+result);// 获取订单状态String alipayTradeQueryResponse1 = JSON.parseObject(result).get("alipay_trade_query_response").toString();String tradeStatus = JSON.parseObject(alipayTradeQueryResponse1).get("trade_status").toString();// 2.订单状态如果是未支付if (AliPayTradeState.NOTYPE.getType().equals(tradeStatus)){log.info("订单未支付===>{}",JSON.toJSONString(orderNo));// 调用关单接口this.closePay(orderNo);// 更新订单状态}// 3.订单状态如果是已支付if (AliPayTradeState.SUCCESS.getType().equals(tradeStatus)){log.info("订单已支付===>{}",JSON.toJSONString(orderNo));// 更新商户订单状态// 记录支付日志}// 4. 订单状态如果是已关闭if (AliPayTradeState.CLOSED.getType().equals(tradeStatus)){log.info("订单已关闭===>{}",JSON.toJSONString(orderNo));// 更新商户订单状态// 记录支付日志}}
public enum AliPayTradeState {/*** 支付成功*/SUCCESS("TRADE_SUCCESS"),/*** 未支付*/NOTYPE("WAIT_BUYER_PAY"),/*** 已关闭*/CLOSED("TRADE_CLOSED");private String type;}

4.前端代码编写

<!doctype html>
<html><head><meta charset='utf-8'><title>Login</title><script src="js/jquery-1.8.3.min.js"></script></head><script>function zhifu(){$.ajax({	url:"http://localhost:8080/pay/createPay/995685122334",type:"post",success: function(data) {// console.log(data)document.write(data.body)}})}</script>
<script>function guanbi(){$.ajax({	url:"http://localhost:8080/pay/cancelPay/995685122334",type:"post",success: function(data) {alert(data.msg)}})}
</script><script>function tuikuan(){$.ajax({	url:"http://localhost:8080/pay/refunds/995685122334/不想要了",type:"post",success: function(data) {alert(data.msg)}})}
</script><script>function chaxuntuikuan(){$.ajax({	url:"http://localhost:8080/pay/queryRefund/995685122334",type:"post",success: function(data) {console.log(data)}})}
</script><script>function chaxun(){$.ajax({	url:"http://localhost:8080/pay/query/995685122334",type:"get",success: function(data) {console.log(data)}})}
</script><script>function duizhangliushui(){$.ajax({	url:"http://localhost:8080/pay/downloadurl/query/2023-10-31/trade",type:"get",success: function(data) {console.log(data.body)//    alert(data.body)}})}
</script><body><div style="margin: 0 auto; width: 600px; height: 600px; text-align: center; margin-top: 300px; display: flex;">
<div style="width:50px; height:50px;left: auto;"><button onclick="zhifu()">支付</button>
</div><div style="width:100px; height:50px;left: auto;"><button onclick="chaxun()">查询订单</button>
</div><div style="width:50px; height: 50px;left: auto;"><button onclick="tuikuan()">退款</button>
</div><div style="width:100px; height: 50px;left: auto;"><button onclick="guanbi()">取消订单</button>
</div>
<div style="width:100px; height: 50px;left: auto;"><button onclick="chaxuntuikuan()">查询退款</button>
</div><div style="width:100px; height: 50px;left: auto;"><button onclick="duizhangliushui()">对账流水</button>
</div></div></body></html>

5.验证 

支付订单

点击支付按钮

手机沙箱版支付宝扫码支付。

然后前端页面就跳转到百度了,因为设置回调跳转到百度

查询订单

订单退款

查询退款

取消订单

重新下一单,但是扫码后不付款

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

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

相关文章

P4345 [SHOI2015] 超能粒子炮·改 题解---------Lucas定理

题面&#xff1a; 题目 题意概括&#xff1a; T T T 次询问&#xff0c;每次给出 n , k n,k n,k&#xff0c;求 ∑ i 0 k C n i % 2333 \sum_{i 0}^{k} C_{n}^{i} \ \% \ 2333 ∑i0k​Cni​ % 2333。 1 ≤ T ≤ 1 0 5 &#xff0c; 1 ≤ n , k ≤ 1 0 18 1\leq T \leq10^5…

docker环境安装+maven依赖继承问题

1&#xff0c;docker环境安装 我们使用yum指令进行安装&#xff0c;分别cmd运行&#xff1a; yum install -y yum-utils device-mapper-persistent-data lvm2 yum-contig-manager --add-repo https://download.docker.com/linux/centos/docker-ce.rep具体解释如下&#xff1a;…

Android 事件分发面试题

序、慢慢来才是最快的方法。 Android 2020年面试系列&#xff08;02 — View事件分发&#xff09;_view事件分发 2020-CSDN博客 1. Touch事件如何从屏幕到我们的App。 硬件与内核部分 当我们触摸屏幕或者按键操作时&#xff0c;首先触发的是硬件驱动 驱动收到事件后&#xf…

如何创建 SpringBoot 多模块项目

1. 创建父模块 【添加依赖】 【删除父模块资源】 父模块只需要保留 pom.xml&#xff0c;其他文件的全部删除&#xff08;包括 src&#xff09; 2. 创建子模块 3. 修改父模块 3.1 删除不必要的依赖 3.2 添加打包类型 3.3 添加所有子模块 声明子模块有两个好处&#xff1a; …

Pytorch 注意力机制解析与代码实现

什么是注意力机制 注意力机制是深度学习常用的一个小技巧&#xff0c;它有多种多样的实现形式&#xff0c;尽管实现方式多样&#xff0c;但是每一种注意力机制的实现的核心都是类似的&#xff0c;就是注意力。 注意力机制的核心重点就是让网络关注到它更需要关注的地方。 当…

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

参考视频&#xff1a;https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7&#xff1a;CNN 的全局架构 卷积层除了做卷积操作外&#xff0c;还要加上 bias &#xff0c;再经过非线性的函数&#xff0c;这么做的原因是 “scaled p…

电压放大器在压电陶瓷致动器中的应用有哪些

电压放大器在压电陶瓷致动器中有多种应用。压电陶瓷致动器是一种能够将电能转化为机械能的装置&#xff0c;通过施加电压来使陶瓷材料发生形变或振动。它在许多领域中得到广泛应用&#xff0c;如精密定位、振动控制、压力控制等。下面安泰电子将详细介绍电压放大器在压电陶瓷致…

java修仙基石篇->instanceof子父类检查

instanceof检查子父类&#xff08;或者是否能被强转&#xff09; 作用1&#xff1a;检查某对象是否是某类的子类 如&#xff1a;儿子类继承了父亲类。 检查儿子类对象是否属于父亲类 作用2&#xff1a;检查两个对象是否可以强转 语法&#xff1a; 子类对象 instanceof 父…

物联网智慧种植农业大棚系统

物联网智慧种植农业大棚系统 项目背景 智慧农业是是将物联网技术和农业生产箱管理的新型农业&#xff0c;依托部署在农业生产现场的各种传感节点&#xff0c;以物联网网关为通道形成数据传输网络&#xff0c;可以实现控制柜、环境监测传感器、气象监测机器等设备的远程监控&a…

【开题报告】基于SpringBoot的医美在线预约系统的设计与实现

1.研究背景 医美行业是指结合医学和美容技术&#xff0c;为人们提供外貌改善和整容手术等服务的领域。随着社会经济的发展和人们审美观念的变化&#xff0c;医美行业得到了快速的发展&#xff0c;并受到越来越多人的关注和需求。 传统的医美预约方式主要依赖于电话预约或现场…

大数据之LibrA数据库系统告警处理(ALM-12006 节点故障)

告警解释 Controller按30秒周期检测NodeAgent状态。当Controller连续三次未接收到某个NodeAgent的状态报告时&#xff0c;产生该告警。 当Controller可以正常接收时&#xff0c;告警恢复。 告警属性 告警ID 告警级别 可自动清除 12006 严重 是 告警参数 参数名称 参…

【计算机网络】数据链路层——以太网

文章目录 前言什么是以太网以太网帧格式6位目的地址和源地址2位类型数据长度CRC 校验和 数据在数据链路层是如何转发的 前言 前面我们学习了关于应用层——自定义协议、传输层——UDP、TCP协议、网络层——IP协议&#xff0c;今天我将为大家分享关于数据链路层——以太网方面的…

C++ 如何快速确定新旧线程

在C中&#xff0c;您可以使用一些方法来快速区分是否当前代码正在主线程中执行还是在一个新线程中执行。以下是一些方法&#xff1a; std::this_thread::get_id()&#xff1a; 使用std::this_thread::get_id()可以获取当前线程的唯一标识符。您可以将主线程的ID与新线程的ID进行…

C语言 DAY08 指针01

1.概述 地址编号&#xff1a;地址编号:就是计算机为了存储数据,每一个程序在32机中占4G,以一个字节为最小单位进行操作,每一个字节都有其对应的地址,该地址就是地址编。 指针&#xff1a;地址编号的数据类型 指针变量&#xff1a;存储地址编号的变量,其数据类型为指针 在32位…

【Java-代码-A02】(00) 通过Java遍历文件夹,快速上手;

前言 【描述】 通过"Java"遍历文件夹下的所有文件&#xff0c;快速上手&#xff1b; 【环境】 系统"Windows"&#xff0c;软件"IntelliJ IDEA 2021.1.3(Ultimate Edition)"&#xff1b;“Java版本"1.8.0_202”&#xff1b; 实操 【第一步…

SQL练习(牛客网非技术快速入门)

SQL3 查询结果去重 题目&#xff1a;现在运营需要查看用户来自于哪些学校&#xff0c;请从用户信息表中取出学校的去重数据。 示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing4…

Python武器库开发-常用模块之OS模块(十一)

常用模块之OS模块(十一) Python中的 os 模块提供了非常丰富的方法用来处理文件和目录&#xff0c;可以执行一些操作系统的功能。常用的方法如下表所示&#xff1a; 序号方法描述1os.access(path, mode)检验权限模式2os.chdir(path)改变当前工作目录3os.chflags(path, flags)设…

B-5:网络安全事件响应

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 通过nmap扫描我们发现开启了22端口,…

JAVA学习笔记——接口

概念&#xff1a; 接口(Interface)是一种规范或协议(Protocal)&#xff0c;是由常量和抽象方法组成的特殊类&#xff0c;是对抽象类的进一步抽象&#xff0c;用于克服 Java 单继承的缺点。例如&#xff1a;每个厂商在生产鼠标的时候&#xff0c;鼠标的接口遵循了 USB 接口统一标…

C++特殊类的设计

文章目录 设计一个类不能被拷贝请设计一个类&#xff0c;只能在堆上创建对象设计一个类只能在栈上去创建对象设计一个类不能被继承设计一个类&#xff0c;只能创建一个对象(单例模式)饿汉模式懒汉模式 单例模式总结饿汉模式懒汉模式 设计一个类不能被拷贝 拷贝一个类对象可以有…