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;

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

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

相关文章

渗透测试方法论

文章目录 渗透测试方法论1. 渗透测试种类黑盒测试白盒测试脆弱性评估 2. 安全测试方法论2.1 OWASP TOP 102.3 CWE2.4 CVE 3. 渗透测试流程3.1 通用渗透测试框架3.1.1 范围界定3.1.2 信息搜集3.1.3 目标识别3.1.4 服务枚举3.1.5 漏洞映射3.1.6 社会工程学3.1.7 漏洞利用3.1.8 权…

根据源码,模拟实现 RabbitMQ - 虚拟主机 + Consume设计 (7)

目录 一、虚拟主机 Consume设计 1.1、承接问题 1.2、具体实现 1.2.1、消费者订阅消息实现思路 1.2.2、消费者描述自己执行任务方式实现思路 1.2.3、消息推送给消费者实现思路 1.2.4、消息确认 一、虚拟主机 Consume设计 1.1、承接问题 前面已经实现了虚拟主机大部分功…

【linux】2 Linux编译器-gcc/g++和Linux调试器-gdb

文章目录 一、Linux编译器-gcc/g使用1.1 背景知识1.2 gcc如何完成1.3 函数库1.4 gcc选项 二、linux调试器-gdb使用2.1 背景2.2 开始使用 总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一、Linux编译器-gcc/g使用 1.1 背景…

JS加密的域名锁定功能,JShaman支持泛域名

JShaman的域名锁定功能&#xff0c;支持泛域名 JShaman的JS代码混淆加密中&#xff0c;有一项“域名锁定”功能。使用此功能后&#xff0c;代码运行时会检测浏览器地址中的域名信息&#xff0c;如是非指定域名&#xff0c;则不运行&#xff0c;以此防止自己网站的JS代码被复制…

python的文件操作

前言 打印内容到屏幕 最简单的输出方式是调用print函数&#xff0c;此函数会将你传递的表达式转化成字符串表达式&#xff0c;并将结果写道标准输出中。 读取键盘输入 python提供了两个raw_input和input内置函数从标准输入中读取一行文本&#xff0c;默认的标准输入是键盘。 …

Android NDK JNI与Java的相互调用

一、Jni调用Java代码 jni可以调用java中的方法和java中的成员变量,因此JNIEnv定义了一系列的方法来帮助我们调用java的方法和成员变量。 以上就是jni调用java类的大部分方法,如果是静态的成员变量和静态方法,可以使用***GetStaticMethodID、CallStaticObjectMethod等***。就…

docker安装fastDFS

一、docker安装 1、搜索镜像 2、拉取镜像 最新版本&#xff1a; docker pull delron/fastdfs3、使用镜像构建容器 3.1 创建tracker容器 docker run -dti --networkhost --name my-tracker -v /opt/zdxf/soft/fastdfs/tracker:/var/fdfs -v /etc/localtime:/etc/localtime d…

Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”

1.问题描述 基于之前的开发程序 Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块_free-xx的博客-CSDN博客 通过Jetson Xavier NX 硬编码的H265发出后, 上位机断点播放发出来的H265码流, 会报“PPS id out of range” 错误 …

【C语言】喝汽水问题

大家好&#xff01;今天我们来学习C语言中的喝汽水问题&#xff01; 目录 1. 题目内容&#xff1a; 2. 思路分析 2.1 方法一 2.2 方法二 2.3 方法三 3. 代码实现 3.1 方法一 3.2 方法二 3.3 方法三 1. 题目内容 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以…

算法题面试实战收集

回文数字 2023-08-18 美团 一面 在不使用额外的内存空间的条件下判断一个整数是否是回文。 回文指逆序和正序完全相同。 数据范围&#xff1a; 进阶&#xff1a; 空间复杂度O(1) &#xff0c;时间复杂度 O(n) 提示&#xff1a; 负整数可以是回文吗&#xff1f;&#xff08;比如…

vue项目配置git提交规范

vue项目配置git提交规范 一、背景介绍二、husky、lint-staged、commitlint/cli1.husky2.lint-staged3.commitlint/cli 三、具体使用1.安装依赖2.运行初始化脚本3.在package.json中配置lint-staged4.根目录新增 commitlint.config.js 4.提交测试1.提示信息格式错误时2.eslint校验…

深度学习3:激活函数

一、激活函数的简介与由来 激活函数&#xff1a;是用来加入非线性因素的&#xff0c;解决线性模型所不能解决的问题。 线性函数的组合解决的问题太有限了&#xff0c;碰到非线性问题就束手无策了。如下图。 通过激活函数映射之后&#xff0c;可以输出非线性函数。 最后再通过…

【2023深圳杯数学建模A题思路模型与代码分享】

2023深圳杯数学建模A题 A题 影响城市居民身体健康的因素分析解题思路第一问第二问第三问第四问 技术文档第一问完整代码写在最后 A题 影响城市居民身体健康的因素分析 以心脑血管疾病、糖尿病、恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病&#xff08;以下简称慢性病…

【Terraform学习】使用 Terraform 托管 S3 静态网站(Terraform-AWS最佳实战学习)

使用 Terraform 托管 S3 静态网站 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_s3 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secret_key和区域变量…

ubuntu 22.04 LTS 在 llvm release/17.x 分支上编译 cookbook llvm example Chapter 02

不错的资料&#xff1a; LLVMClang编译器链接器--保值【进阶之路二】 - 掘金 —————————————————————————————————————— 下载 llvm-cookbook example: $ git clone https://github.com/elongbug/llvm-cookbook.git 也可以参照llvm-pr…

【BASH】回顾与知识点梳理(三十九)

【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…

【vue3+ts项目】配置eslint校验代码工具,eslint+prettier+stylelint

1、运行好后自动打开浏览器 package.json中 vite后面加上 --open 2、安装eslint npm i eslint -D3、运行 eslint --init 之后&#xff0c;回答一些问题&#xff0c; 自动创建 .eslintrc 配置文件。 npx eslint --init回答问题如下&#xff1a; 使用eslint仅检查语法&…

6-模板初步使用

官网: 中文版: 介绍-Jinja2中文文档 英文版: Template Designer Documentation — Jinja Documentation (2.11.x) 模板语法 1. 模板渲染 (1) app.py 准备数据 import jsonfrom flask import Flask,render_templateimport settingsapp Flask(__name__) app.config.from_obj…

VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库

前面说的Delphi通过Activex DLL同时调用PowerBasic和FreeBasic写的DLL&#xff0c;是在WINDOWS基础平台上完成的。 而 .NET平台是架在WINDOWS基础平台之上的&#xff0c;它的上面VB.NET或C#等开发的APP程序&#xff0c;下面写一下用VB.NET&#xff0c;通过VB6注册的Activex DLL…

SOA通信中间件常用的通信协议

摘要&#xff1a; SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。 前言 SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。模块化可以提高软件系统的可维护性和代码重用性&#xff0c;并且能够隔离故障。举例来说&#xff0c;…