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

SpringBoot项目(支付宝整合)——springboot整合支付宝沙箱支付 从极简实现到IOC改进

目录

  • 引出
  • git代码仓库
  • 准备工作
    • 支付宝沙箱api
    • 内网穿透 [natapp.cn](https://natapp.cn/#download)
  • springboot整合—极简实现版
    • 1.导包+配置文件
    • 2.controller层代码
    • 3.进行支付流程
    • 4.支付成功回调
  • 依赖注入的改进
    • 1.整体结构
    • 2.pom.xml文件依赖
    • 3.配置文件
    • 4.配置类,依赖注入
    • 5.支付商品id,价格,名称
    • 6.controller层进行支付和回调
    • 7.主启动类
  • 总结

引出


1.springboot整合支付宝沙箱支付;
2.准备工作:沙箱api,内网穿透;
3.极简实现理解支付,异步回调等;
4.按照spring依赖注入的思想改造基础demo;

git代码仓库

https://gitee.com/pet365/springboot-alipay

准备工作

支付宝沙箱api

支付宝开放平台 (alipay.com)

在这里插入图片描述

支付参数

在这里插入图片描述

内网穿透 natapp.cn

natapp.cn官网

在这里插入图片描述

启动和配置

在这里插入图片描述

springboot整合—极简实现版

在这里插入图片描述

1.导包+配置文件

<!--        支付宝相关--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.34.0.ALL</version></dependency>
server:port: 9090# 日志需要配置一下 @Slf4j
logging:level:com.tianju.alipay: debug

2.controller层代码

订单ID,需要唯一;价格;物品名称(支付主题)

http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone

用户名:flrnht7304@sandbox.com

密码:111111

AliPayController.java文件

package com.tianju.alipay.controller;import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** 支付宝的支付接口* 用户名:flrnht7304@sandbox.com* 密码:111111*/// http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
@RestController
@RequestMapping("/api/ali")
@Slf4j // tips:如果用debug记得在application.yml文件中配置一下日志级别
public class AliPayController {String alipayPublicKey = "";@GetMapping("/pay")public void payOrder(String orderId, String price, String subject, HttpServletResponse httpResponse) throws AlipayApiException, IOException {// 1.准备需要的参数,私匙,支付公匙,appid,沙箱支付平台的urlString privateKey = "";String alipayPublicKey = "";String appId = "9021000123613164";String serverUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";// 2.把需要配置的参数set进AlipayConfig类中com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();alipayConfig.setServerUrl(serverUrl);alipayConfig.setAppId(appId);alipayConfig.setPrivateKey(privateKey);alipayConfig.setFormat("json");alipayConfig.setAlipayPublicKey(alipayPublicKey);alipayConfig.setCharset("UTF8");alipayConfig.setSignType("RSA2");// 3.创建支付宝的默认的客户端AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);// 4.准备支付的参数,包括需要支付的订单的id,价格,物品名称,AlipayTradePagePayModel model = new AlipayTradePagePayModel();
//        model.setOutTradeNo("2023073022083620");model.setOutTradeNo(orderId); // 需要支付的订单id,自定义的订单id,不能重复,唯一,已经支付的无法继续支付model.setTotalAmount(price); // 需要支付的钱 model.setTotalAmount("88.88");model.setSubject(subject); // 要支付的物品,比如 model.setSubject("Iphone6 16G");model.setProductCode("FAST_INSTANT_TRADE_PAY");// 5.创建支付的请求,把上面的准备支付的参数进行setAlipayTradePagePayRequest request = new AlipayTradePagePayRequest();request.setBizModel(model);/*** 设置支付宝异步回调,这个需要用内网穿透*/request.setNotifyUrl("http://uw7ayu.natappfree.cc/api/ali/notify");/*** 设置支付宝支付成功返回的页面* 这里让支付成功直接回到static下的一个静态页面中*/request.setReturnUrl("http://localhost:9090/aliPayReturn.html");// 6.调用ali客户端alipayClient,用客户端执行请求,获取响应,获取.getBody(),拿到form表单// 执行请求,拿到响应的结果,返回给浏览器String form = "";try {form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单log.debug(">>>>>>getAliPayFrom");System.out.println("getAliPayFrom");System.out.println(form);} catch (AlipayApiException e) {e.printStackTrace();}// 表单数据作为响应返回给前端,显示前端页面/*** <form name="punchout_form" method="post" action="https://openapi-sandbox.dl.alipaydev.com/gateway.do?charset=UTF8&method=alipay.trade.page.pay&sign=ZSYIysQXMlJK6q%2B%2BQVJVhKi3qtHBaXTMmh4%2Fi7Wcj1OuSr5Qs6X%2Fhq0jgDbR%2BFw6da3fO5Hov8iV8%2BPo07CVnIQDSL1X2WDZzSN3Srqid%2BLKP%2BnoME2Jv9AfhaPwYkbElg0x40pLspkCv7%2FeRs93ROkrvLUL0aTA%2B7wXrIe5FKkvptqfqjReMayVR1lKmiGw8SWToNJ0OQoDp4g6191vJIy9ld%2BQfRU6PLq9dUH3XIifNvCwOceMCqpOXNlJIAb8MC2FkXK%2FCwEij5mj%2BpqNEevMf0DRczuUklJe20FeXrx6bSsjEIly8Swt1j4UYZZJY817TRQp%2FG3XEOjnLfAH5g%3D%3D&version=1.0&app_id=9021000123613164&sign_type=RSA2&timestamp=2023-07-30+23%3A11%3A17&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">* <input type="hidden" name="biz_content" value="{&quot;out_trade_no&quot;:&quot;202307302206&quot;,&quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;,&quot;subject&quot;:&quot;iPhone&quot;,&quot;total_amount&quot;:&quot;12.56&quot;}">* <input type="submit" value="立即支付" style="display:none" >* </form>* <script>document.forms[0].submit();</script>*/httpResponse.setContentType("text/html;charset=UTF-8"); // 设置头部httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面httpResponse.getWriter().flush();httpResponse.getWriter().close();}/*** 支付宝异步回调* request.setNotifyUrl("");* http://localhost:9090/api/ali/notify* 上面这个网址用内网穿透代理一下* http://jqdxgm.natappfree.cc/api/ali/notify* 此时支付宝就能回调到这个页面*/@PostMapping("/notify")public void aliPayNotify(HttpServletRequest request) throws AlipayApiException {log.debug(">>>>>>>支付宝异步回调");Map<String, String[]> parameterMap = request.getParameterMap();// [gmt_create, charset, gmt_payment, notify_time, subject, sign, buyer_id, invoice_amount, version, notify_id,// fund_bill_list, notify_type, out_trade_no, total_amount, trade_status, trade_no, auth_app_id, receipt_amount,// point_amount, buyer_pay_amount, app_id, sign_type, seller_id]Set<String> keySet = parameterMap.keySet(); // 获取http请求里面的所有键/*** paramsMap如下:* {gmt_create=2023-07-31 15:54:11, charset=UTF8,* gmt_payment=2023-07-31 15:54:26,* notify_time=2023-07-31 15:54:27,* sign=fsCABNzc5hax4mwwMULluDiEAT70Kqj77uTMcCgSi82AU6tP5LGbXucEvP7CbvjXrYo5g3hrz5xRQAwddE7qU9Qyrg0v3EnearJBcW4It6N+VNBQ7yfY/W79eKRSKspLBKHRa21RILjyRrmQYG4Cw8R7twP7y0lDCOE8j3rV6ZyGfhiQ7EXp49d6HpgcIT1NjgJjQYSyJFdgyqkzFljKRfbhwPFAtubsmd8IcJCU7XI3YosSKnDhQaCA6ec4dmQiWtvcTbOLNR/r2Sou7rCnI7s1lc8pKeEsuacWTZW2FVR7hdHoLZ/expaRQIt+dNzA86lwQxu3SRCQ9wNTPICv1A==,* buyer_id=2088722005286475, invoice_amount=12.56, version=1.0, notify_id=2023073101222155427086470500776505,* fund_bill_list=[{"amount":"12.56","fundChannel":"ALIPAYACCOUNT"}],* notify_type=trade_status_sync,* subject=iPhone, // 物品名称* out_trade_no=202307311553, // 进行支付的订单id,唯一,商家自定义,即支付时传入的 String orderId* total_amount=12.56, // 总价格* trade_status=TRADE_SUCCESS, // 支付状态* trade_no=2023073122001486470500697216, auth_app_id=9021000123613164,* receipt_amount=12.56, point_amount=0.00,* buyer_pay_amount=12.56, app_id=9021000123613164, sign_type=RSA2, seller_id=2088721005318559}*/Map<String,String> paramsMap = new HashMap<>(); // 专门用来放置请求里面的参数for(String key : keySet){paramsMap.put(key, request.getParameter(key));}System.out.println("*************");System.out.println(paramsMap);// 验证签名String sign = paramsMap.get("sign");String contentV1 = AlipaySignature.getSignCheckContentV1(paramsMap);boolean rsa256CheckSignature = AlipaySignature.rsa256CheckContent(contentV1, sign, alipayPublicKey, "UTF-8");if (rsa256CheckSignature && "TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){// 签名验证成功 并且 支付宝回调的状态是成功状态 TRADE_SUCCESSlog.info("在{},买家{}进行订单{}的付款,交易名称{},付款金额{}",paramsMap.get("gmt_payment"),paramsMap.get("buyer_id"),paramsMap.get("out_trade_no"),paramsMap.get("subject"),paramsMap.get("total_amount"));// 支付成功,修改数据库中该订单的状态// 比如:流程,根据订单ID查询出一条数据,修改该条订单的数据,或者只有支付成功,才给数据库里面新增一条数据}}
}

3.进行支付流程

在这里插入图片描述

支付密码输入

在这里插入图片描述

支付成功

在这里插入图片描述

4.支付成功回调

设置异步回调

在这里插入图片描述

启动内网穿透

在这里插入图片描述

设置地址

在这里插入图片描述

异步回调流程解析

在这里插入图片描述

支付宝支付成功跳转

在这里插入图片描述

跳转成功

在这里插入图片描述

依赖注入的改进

在这里插入图片描述

1.整体结构

在这里插入图片描述

2.pom.xml文件依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tianju.alipay</groupId><artifactId>springboot-alipay</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--json工具--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><!--        支付宝相关--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.34.0.ALL</version></dependency></dependencies>
</project>

3.配置文件

applicaiton.yml

server:port: 9090# 日志需要配置一下 @Slf4j
logging:level:com.tianju.alipay: debug

alipay.properties

ali.privateKey = 
ali.alipayPublicKey = 
ali.appId = 9021000123613164
ali.serverUrl = https://openapi-sandbox.dl.alipaydev.com/gateway.doali.returnUrl = http://localhost:9090/aliPayReturn.html
ali.notifyUrl = http://uw7ayu.natappfree.cc/api/ali/notify

4.配置类,依赖注入

package com.tianju.alipay.config;import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration
@PropertySource("classpath:config/alipay.properties")
@Getter
public class AlipayConfig {@Value("${ali.serverUrl}")private String serverUrl;@Value("${ali.appId}")private String appId;@Value("${ali.alipayPublicKey}")private String alipayPublicKey;@Value("${ali.privateKey}")private String privateKey;@Beanpublic AlipayClient alipayClient() throws AlipayApiException {// 2.把需要配置的参数set进AlipayConfig类中com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();alipayConfig.setServerUrl(serverUrl);alipayConfig.setAppId(appId);alipayConfig.setPrivateKey(privateKey);alipayConfig.setFormat("json");alipayConfig.setAlipayPublicKey(alipayPublicKey);alipayConfig.setCharset("UTF8");alipayConfig.setSignType("RSA2");return new DefaultAlipayClient(alipayConfig);}
}

5.支付商品id,价格,名称

package com.tianju.alipay.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Alipay {private String orderId; // 商家自定义的订单编号,唯一private String price; // 商品价格private String subject; // 支付主题
}

6.controller层进行支付和回调

package com.tianju.alipay.controller;import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.tianju.alipay.entity.Alipay;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** 支付宝的支付接口* 用户名:flrnht7304@sandbox.com* 密码:111111*/// http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
@RestController
@RequestMapping("/api/ali")
@Slf4j
public class AliPayController {@Autowiredprivate AlipayClient alipayClient;@Value("${ali.alipayPublicKey}")private String alipayPublicKey;@Value("${ali.returnUrl}")private String returnUrl; // 支付成功返回的页面@Value("${ali.notifyUrl}")private String notifyUrl; // 支付宝支付成功异步回调的页面,需要内网穿透@GetMapping("/pay")public void payOrder(Alipay alipay, HttpServletResponse httpResponse) throws IOException {// 4.准备支付的参数,包括需要支付的订单的id,价格,物品名称,AlipayTradePagePayModel model = new AlipayTradePagePayModel();model.setOutTradeNo(alipay.getOrderId()); // 需要支付的订单id,自定义的订单id,不能重复,唯一,已经支付的无法继续支付model.setTotalAmount(alipay.getPrice()); // 需要支付的钱 model.setTotalAmount("88.88");model.setSubject(alipay.getSubject()); // 要支付的物品,比如 model.setSubject("Iphone6 16G");model.setProductCode("FAST_INSTANT_TRADE_PAY");// 5.创建支付的请求,把上面的准备支付的参数进行setAlipayTradePagePayRequest request = new AlipayTradePagePayRequest();request.setBizModel(model);/*** 设置支付宝异步回调,这个需要用内网穿透*/request.setNotifyUrl(notifyUrl);/*** 设置支付宝支付成功返回的页面* 这里让支付成功直接回到static下的一个静态页面中*/request.setReturnUrl(returnUrl);// 6.调用ali客户端alipayClient,用客户端执行请求,获取响应,获取.getBody(),拿到form表单// 执行请求,拿到响应的结果,返回给浏览器String form = "";try {form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单log.debug(">>>>>>getAliPayFrom");System.out.println("getAliPayFrom");System.out.println(form);} catch (AlipayApiException e) {e.printStackTrace();}// 表单数据作为响应返回给前端,显示前端页面httpResponse.setContentType("text/html;charset=UTF-8"); // 设置头部httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面httpResponse.getWriter().flush();httpResponse.getWriter().close();}/*** 支付宝异步回调* request.setNotifyUrl("");* http://localhost:9090/api/ali/notify* 上面这个网址用内网穿透代理一下* http://jqdxgm.natappfree.cc/api/ali/notify* 此时支付宝就能回调到这个页面*/@PostMapping("/notify")public void aliPayNotify(HttpServletRequest request) throws AlipayApiException {log.debug(">>>>>>>支付宝异步回调");Map<String, String[]> parameterMap = request.getParameterMap();Set<String> keySet = parameterMap.keySet(); // 获取http请求里面的所有键/*** paramsMap如下:* {gmt_create=2023-07-31 15:54:11, charset=UTF8,* gmt_payment=2023-07-31 15:54:26,* notify_time=2023-07-31 15:54:27,* sign=fsCABNzc5hax4mwwMULluDiEAT70Kqj77uTMcCgSi82AU6tP5LGbXucEvP7CbvjXrYo5g3hrz5xRQAwddE7qU9Qyrg0v3EnearJBcW4It6N+VNBQ7yfY/W79eKRSKspLBKHRa21RILjyRrmQYG4Cw8R7twP7y0lDCOE8j3rV6ZyGfhiQ7EXp49d6HpgcIT1NjgJjQYSyJFdgyqkzFljKRfbhwPFAtubsmd8IcJCU7XI3YosSKnDhQaCA6ec4dmQiWtvcTbOLNR/r2Sou7rCnI7s1lc8pKeEsuacWTZW2FVR7hdHoLZ/expaRQIt+dNzA86lwQxu3SRCQ9wNTPICv1A==,* buyer_id=2088722005286475, invoice_amount=12.56, version=1.0, notify_id=2023073101222155427086470500776505,* fund_bill_list=[{"amount":"12.56","fundChannel":"ALIPAYACCOUNT"}],* notify_type=trade_status_sync,* subject=iPhone, // 物品名称* out_trade_no=202307311553, // 进行支付的订单id,唯一,商家自定义,即支付时传入的 String orderId* total_amount=12.56, // 总价格* trade_status=TRADE_SUCCESS, // 支付状态* trade_no=2023073122001486470500697216, auth_app_id=9021000123613164,* receipt_amount=12.56, point_amount=0.00,* buyer_pay_amount=12.56, app_id=9021000123613164, sign_type=RSA2, seller_id=2088721005318559}*/Map<String,String> paramsMap = new HashMap<>(); // 专门用来放置请求里面的参数for(String key : keySet){paramsMap.put(key, request.getParameter(key));}System.out.println("*************");System.out.println(paramsMap);// 验证签名String sign = paramsMap.get("sign");String contentV1 = AlipaySignature.getSignCheckContentV1(paramsMap);boolean rsa256CheckSignature = AlipaySignature.rsa256CheckContent(contentV1, sign, alipayPublicKey, "UTF-8");if (rsa256CheckSignature && "TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){// 签名验证成功 并且 支付宝回调的状态是成功状态 TRADE_SUCCESSlog.info("在{},买家{}进行订单{}的付款,交易名称{},付款金额{}",paramsMap.get("gmt_payment"),paramsMap.get("buyer_id"),paramsMap.get("out_trade_no"),paramsMap.get("subject"),paramsMap.get("total_amount"));// 支付成功,修改数据库中该订单的状态// 比如:流程,根据订单ID查询出一条数据,修改该条订单的数据,或者只有支付成功,才给数据库里面新增一条数据}}
}

7.主启动类

package com.tianju.alipay;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class AliPayApp {public static void main(String[] args) {SpringApplication.run(AliPayApp.class, args);}
}

总结

1.springboot整合支付宝沙箱支付;
2.准备工作:沙箱api,内网穿透;
3.极简实现理解支付,异步回调等;
4.按照spring依赖注入的思想改造基础demo;

相关文章:

SpringBoot项目(支付宝整合)——springboot整合支付宝沙箱支付 从极简实现到IOC改进

目录 引出git代码仓库准备工作支付宝沙箱api内网穿透 [natapp.cn](https://natapp.cn/#download) springboot整合—极简实现版1.导包配置文件2.controller层代码3.进行支付流程4.支付成功回调 依赖注入的改进1.整体结构2.pom.xml文件依赖3.配置文件4.配置类&#xff0c;依赖注入…...

【AIGC】一款离线版的AI智能换脸工具V2.0分享(支持图片、视频、直播)

随着人工智能技术的爆发&#xff0c;AI不再局限于大语言模型&#xff0c;在图片处理方面也有非常大的进步&#xff0c;其中AI换脸也是大家一直比较感兴趣的&#xff0c;但这个技术的应用一直有很大的争议。 今天给大家分享一个开源你的AI换脸工具2.0&#xff0c;只需要一张所需…...

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——选言——相容选言——或

文章目录 第五章 选言命题:相容选言-或;不相容选言-要么要么第一节 选言-相容选言-或-推结论-A或B为真,则非A→B,非B→A(否一则肯一)真题(2010-28)-选言-相容选言-或-推结论-(1)A或B为真,A为假:得B为真(否一则肯一);真题(2012-29)-选言-相容选言-或-推结论-(1)…...

Git如何操作本地分支仓库?

基本使用TortoiseGit 操作本地仓库(分支) 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;避免影响开发主线。多线程开发,可以同时开启多个任务的开发&#xff0c;多个任务之间互不影响。 为何要…...

WPS右键新建没有docx pptx xlsx 修复

解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…...

【巧学C++之西游篇】No.2 --- C++闹天宫,带着“重载“和“引用“

文章目录 前言&#x1f31f;一、函数重载&#x1f30f;1.1.函数重载概念&#x1f30f;1.2.C支持函数重载的原理 -- 名字修饰 &#x1f31f;二、引用&#x1f30f;2.1.引用的概念&#x1f30f;2.2.引用特性&#x1f30f;2.3.常引用&#x1f30f;2.4.使用场景&#x1f30f;2.5.传…...

【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)

【关键字】 音频编码、管道模式、createEncoder 【写在前面】 在使用API6开发HarmonyOS应用时&#xff0c;如何将pcm源文件进行编码并写入文件&#xff0c;最后生成aac文件&#xff0c;本文直接附上主要代码开发步骤供大家参考。 【主要功能代码】 import ohos.media.codec.…...

KaiwuDB CTO 魏可伟:回归用户本位,打造“小而全”的数据库

8月16日&#xff0c;KaiwuDB 受邀亮相第十四届中国数据库技术大会 DTCC 2023。KaiwuDB CTO 魏可伟接受大会主办方的采访&#xff0c;双方共同围绕“数据库架构演进、内核引擎设计以及不同技术路线”展开深度探讨。 以下是采访的部分实录 ↓↓↓ 40 多年前&#xff0c;企业的数…...

行业追踪,2023-08-22

自动复盘 2023-08-22 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

浏览器安装selenium驱动,以Microsoft Edge安装驱动为例

Selenium是一个用于Web应用程序测试的自动化工具。它可以直接在浏览器中运行&#xff0c;模拟真实用户对浏览器进行操作。利用selenium&#xff0c;可以驱动浏览器执行特定的动作&#xff0c;比如&#xff1a;点击、下拉等等&#xff0c;还可以获取浏览器当前呈现的页面的源代码…...

边缘计算网关是如何提高物联网的效率的?

随着物联网的持续发展&#xff0c;物联网应用的丰富和规模的扩大&#xff0c;带来了海量的数据处理、传输和计算需求。 传统的“数据中央处理”模式越来越难以适应物联网的扩展速度&#xff0c;在这一趋势下&#xff0c;边缘计算在物联网系统的部署运营中就发挥出了显著的增效…...

AWVS安装~Windows~激活

目录 1.下载安装包 2.双击acunetix_15.1.221109177.exe进行安装 3.配置C:\Windows\System32\drivers\etc\hosts 4.复制wvsc.exe到C:\Program Files (x86)\Acunetix\15.1.221109177下 5.复制license_info.json与wa_data.dat到C:\ProgramData\Acunetix\shared\license下&…...

ATFX汇市:杰克逊霍尔年会降至,鲍威尔或再发鹰派言论

环球汇市行情摘要—— 昨日&#xff0c;美元指数下跌0.11%&#xff0c;收盘在103.33点&#xff0c; 欧元升值0.22%&#xff0c;收盘价1.0898点&#xff1b; 日元贬值0.58%&#xff0c;收盘价146.23点&#xff1b; 英镑升值0.18%&#xff0c;收盘价1.2757点&#xff1b; 瑞…...

Zipkin开源的分布式链路追踪系统

Zipkin是一款开源的分布式链路追踪系统,主要功能包括: 1. 采集跟踪数据 - Zipkin client库负责收集并上报各服务的请求信息。 2. 存储跟踪数据 - 存储层默认采用Zipkin自带的基于内存的快速存储,也支持整合MySQL、Cassandra等外部存储。 3. 查询接口 - 提供RESTful API进行跟…...

java 项目运行时,后端控制台出现空指针异常---java.lang.NullPointerException

项目场景&#xff1a; 提示&#xff1a;这里简述项目背景&#xff1a; 场景如下&#xff1a; java 项目运行时&#xff0c;后端控制台出现如下图所示报错信息&#xff1a;— 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; java 项目运行时&#xff0c;后…...

模型数据处理-数据放入 session和@ModelAttribute 实现 prepare 方法详细讲解

&#x1f600;前言 本文详细讲解了模型数据处理-数据放入 session和ModelAttribute 实现 prepare 方法详细讲解 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c…...

关于android studio 几个简单的问题说明

自信是成功的第一步。——爱迪生 1. android studio 如何运行不同项目是否要更换不同的sdk 和 gradle 2.编译Gradle总是错误为什么 3.如何清理android studio 的缓存 4. 关于android Studio中的build 下面的rebuild project...

angular常用命令

文章目录 1. 创建新项目&#xff1a;2. 生成组件&#xff1a;3. 生成模块&#xff1a;4. 生成服务&#xff1a;5. 运行项目&#xff1a;6. 构建项目&#xff1a;其他 在 Angular 开发中&#xff0c;以下是一些常用的 Angular CLI 命令&#xff1a; 1. 创建新项目&#xff1a; …...

uni-app打包后安卓不显示地图及相关操作详解

新公司最近用uni-app写app&#xff0c;之前的代码有很多问题&#xff0c;正好趁着改bug的时间学习下uni-app。 问题现象&#xff1a; 使用uni-app在浏览器调试的时候&#xff0c;地图是展示的&#xff0c;但是打包完成后&#xff0c;在app端是空白的。咱第一次写app&#xff…...

elelementui组件

一、按钮 1、按钮样式 使用type、plain、round和circle属性来定义 Button 的样式。 2、主要代码 <el-row><el-button>默认按钮</el-button><el-button type"primary">主要按钮</el-button><el-button type"success">…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...