微信小程序支付Java工具类

准备工作

微信支付开发前,需要先获取商家信息,包括商户号AppId证书和密钥

  • 获取商户号:微信商户平台 申请成为商户 => 提交资料 => 签署协议 => 获取商户号
  • 获取AppID:微信公众平台 注册服务号 => 服务号认证 => 获取APPID => 绑定商户号
  • 申请商户证书:登录商户平台 => 选择 账户中心 => 安全中心 => API安全 => 申请API证书 包括商户证书和商户私钥
  • 获取微信的证书:获取APIv3秘钥 登录商户平台 => 选择 账户中心 => 安全中心 => API安全 => 设置APIv3密钥

工具类

添加依赖

引入微信支付开放平台的 API 依赖,以便能够使用 Java 调用相关 API 接口。

微信支付 Java SDK 地址:

https://github.com/wechatpay-apiv3/wechatpay-java

<dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-java</artifactId><version>0.2.12</version>
</dependency>

支付工具类

  • JSAPI支付下单:生成预支付订单并返回支付参数
  • 关闭订单
  • 微信支付订单号查询订单
  • 商户订单号查询订单
  • 申请退款:微信支付订单号和商家订单号二选一;
  • 退款查询
package com.tansci.utils;import com.alibaba.fastjson2.JSON;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.exception.HttpException;
import com.wechat.pay.java.core.exception.MalformedMessageException;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.payments.jsapi.model.*;
import com.wechat.pay.java.service.payments.model.Transaction;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.refund.model.AmountReq;
import com.wechat.pay.java.service.refund.model.CreateRequest;
import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest;
import com.wechat.pay.java.service.refund.model.Refund;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.system.ApplicationHome;import java.util.Objects;/*** @path:com.tansci.utils.WxPayUtil.java* @className:WxPayUtil.java* @description: 微信小程序支付工具类* @author:tanyp* @editNote:*/
@Slf4j
public class WxPayUtil {// appIDprivate static String appid = "wx1fdfgfh149c6353";// 商户号private static String merchantId = "124589286";// 商户证书序列号private static String merchantSerialNumber = "3D3D4ADM154FDG44DFG45GF1SDF4JFA8DF95";// 商户APIV3密钥private static String apiV3Key = "yyh1466255d14dggh524dg666983286";// 商户API私钥private static String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPH5wD/SO6+3jMUdUio0awAwR+Ni7s22Csqk8EQLoYbeOzCN+4+bKJ4/jAuJ8CuqaCCCXtCDRlriLW35C7uzeuOiL3tN";// 支付回调地址private static String payNotifyUrl = "https://tansci.top/api/pay/payCallback";// 支付回调地址private static String refunNotifyUrl = "https://tansci.top/api/pay/refunCallback";private static JsapiServiceExtension jsapiService;private static RefundService refundService;public static void initConfig() {// 初始化商户配置Config config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKey(privateKey).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3Key).build();// 初始化服务jsapiService = new JsapiServiceExtension.Builder().config(config).build();refundService = new RefundService.Builder().config(config).build();}/*** @methodName:jsapi* @description:JSAPI支付下单* @author:tanyp* @Params: [orderId, goodsName, openId, amount]* @Return: java.lang.String* @editNote:*/public static Object jsapi(String orderId, String goodsName, String openId, Integer amount) {try {if (Objects.isNull(jsapiService)) {initConfig();}PrepayRequest request = new PrepayRequest();request.setAppid(appid);request.setMchid(merchantId);request.setOutTradeNo(orderId);request.setDescription(goodsName);request.setNotifyUrl(payNotifyUrl);// 支付者Payer payer = new Payer();payer.setOpenid(openId);request.setPayer(payer);// 订单金额,单位为分(正数)Amount _amount = new Amount();_amount.setCurrency("CNY");_amount.setTotal(amount);request.setAmount(_amount);log.info("JSAPI 支付下单请求参数:{}", JSON.toJSON(request));PrepayWithRequestPaymentResponse response = jsapiService.prepayWithRequestPayment(request);log.info("JSAPI 支付下单返回参数:{}", JSON.toJSON(response));return response;} catch (HttpException e) {// 发送HTTP请求失败log.error("支付异常,发送HTTP请求失败:{}", e);return e.getMessage();} catch (ServiceException e) {log.error("支付异常,服务返回状态异常:{}", e);return e.getErrorMessage();} catch (MalformedMessageException e) {log.error("支付异常,服务返回成功,返回体类型不合法,或者解析返回体失败:{}", e);return e.getMessage();}}/*** @methodName:closeOrder* @description:关闭订单* @author:tanyp* @Params: [orderId]* @Return: java.lang.String* @editNote:*/public static String closeOrder(String orderId) {try {if (Objects.isNull(jsapiService)) {initConfig();}CloseOrderRequest request = new CloseOrderRequest();request.setMchid(merchantId);request.setOutTradeNo(orderId);jsapiService.closeOrder(request);return "ok";} catch (HttpException e) {// 发送HTTP请求失败log.error("支付异常,发送HTTP请求失败:{}", e);return e.getMessage();} catch (ServiceException e) {log.error("支付异常,服务返回状态异常:{}", e);return e.getErrorMessage();} catch (MalformedMessageException e) {log.error("支付异常,服务返回成功,返回体类型不合法,或者解析返回体失败:{}", e);return e.getMessage();}}/*** @methodName:queryOrderById* @description:微信支付订单号查询订单* @author:tanyp* @Params: [transactionId]* @Return: com.wechat.pay.java.service.payments.model.Transaction* @editNote:*/public static Transaction queryOrderById(String transactionId) {try {if (Objects.isNull(jsapiService)) {initConfig();}QueryOrderByIdRequest request = new QueryOrderByIdRequest();request.setMchid(merchantId);request.setTransactionId(transactionId);return jsapiService.queryOrderById(request);} catch (HttpException e) {// 发送HTTP请求失败log.error("支付异常,发送HTTP请求失败:{}", e);} catch (ServiceException e) {log.error("支付异常,服务返回状态异常:{}", e);} catch (MalformedMessageException e) {log.error("支付异常,服务返回成功,返回体类型不合法,或者解析返回体失败:{}", e);}return null;}/*** @methodName:queryOrderByOutTradeNo* @description:商户订单号查询订单* @author:tanyp* @Params: [orderId]* @Return: com.wechat.pay.java.service.payments.model.Transaction* @editNote:*/public static Transaction queryOrderByOutTradeNo(String orderId) {try {if (Objects.isNull(jsapiService)) {initConfig();}QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();request.setMchid(merchantId);request.setOutTradeNo(orderId);return jsapiService.queryOrderByOutTradeNo(request);} catch (HttpException e) {// 发送HTTP请求失败log.error("支付异常,发送HTTP请求失败:{}", e);} catch (ServiceException e) {log.error("支付异常,服务返回状态异常:{}", e);} catch (MalformedMessageException e) {log.error("支付异常,服务返回成功,返回体类型不合法,或者解析返回体失败:{}", e);}return null;}/*** @methodName:refund* @description:申请退款* @author:tanyp* @Params: [transactionId, orderId, refunId, reason, refunAmount, payAmount]* @Return: com.wechat.pay.java.service.refund.model.Refund* @editNote:*/public static Refund refund(String transactionId, String orderId, String refunId, String reason, Integer refunAmount, Integer payAmount) {try {if (Objects.isNull(refundService)) {initConfig();}CreateRequest request = new CreateRequest();if (Objects.isNull(transactionId)) {request.setTransactionId(transactionId);}request.setOutTradeNo(orderId);request.setOutRefundNo(refunId);request.setNotifyUrl(refunNotifyUrl);request.setReason(reason);// 订单金额,单位为分(正数)AmountReq _amount = new AmountReq();_amount.setCurrency("CNY");_amount.setRefund(refunAmount.longValue());_amount.setTotal(payAmount.longValue());request.setAmount(_amount);return refundService.create(request);} catch (HttpException e) {// 发送HTTP请求失败log.error("退款异常,发送HTTP请求失败:{}", e);} catch (ServiceException e) {log.error("退款异常,服务返回状态异常:{}", e);} catch (MalformedMessageException e) {log.error("退款异常,服务返回成功,返回体类型不合法,或者解析返回体失败:{}", e);}return null;}/*** @methodName:queryByOutRefundNo* @description:退款查询* @author:tanyp* @Params: [refunId]* @Return: com.wechat.pay.java.service.refund.model.Refund* @editNote:*/public static Refund queryByOutRefundNo(String refunId) {try {if (Objects.isNull(refundService)) {initConfig();}QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest();request.setOutRefundNo(refunId);return refundService.queryByOutRefundNo(request);} catch (HttpException e) {// 发送HTTP请求失败log.error("退款异常,发送HTTP请求失败:{}", e);} catch (ServiceException e) {log.error("退款异常,服务返回状态异常:{}", e);} catch (MalformedMessageException e) {log.error("退款异常,服务返回成功,返回体类型不合法,或者解析返回体失败:{}", e);}return null;}}

回调通知

创建一个公开的 HTTP 端点,接受来自微信支付的支付、退款回调通知。

PayController.java

package com.tansci.controller;import com.tansci.common.WrapMapper;
import com.tansci.common.Wrapper;
import com.tansci.service.PayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
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.util.Map;/*** @ClassName: PayController.java* @Description: 支付、退款回调通知* @Author: tanyp**/
@RestController
@RequestMapping("/api/pay")
public class PayController {@Autowiredprivate PayService payService;@PostMapping("/payCallback")public Wrapper payCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {return WrapMapper.ok(payService.payCallback(request, response));}@PostMapping("/refunCallback")public Wrapper refunCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {return WrapMapper.ok(payService.refunCallback(request, response));}}

PayService.java

package com.tansci.service;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;public interface PayService {Object payCallback(HttpServletRequest request, HttpServletResponse response) throws Exception;Object refunCallback(HttpServletRequest request, HttpServletResponse response) throws Exception;}

PayServiceImpl.java

package com.tansci.service.impl;import com.alibaba.fastjson2.JSON;
import com.tansci.service.PayService;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.payments.model.Transaction;
import com.wechat.pay.java.service.refund.model.RefundNotification;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Objects;import static com.wechat.pay.java.core.http.Constant.*;@Slf4j
@Service
public class PayServiceImpl implements PayService {// 商户号private static String merchantId = "124589286";// 商户证书序列号private static String merchantSerialNumber = "3D3D4ADM154FDG44DFG45GF1SDF4JFA8DF95";// 商户APIV3密钥private static String apiV3Key = "yyh1466255d14dggh524dg666983286";// 商户API私钥private static String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPH5wD/SO6+3jMUdUio0awAwR+Ni7s22Csqk8EQLoYbeOzCN+4+bKJ4/jAuJ8CuqaCCCXtCDRlriLW35C7uzeuOiL3tN";@Overridepublic Object payCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {//读取请求体的信息ServletInputStream inputStream = request.getInputStream();StringBuffer stringBuffer = new StringBuffer();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s;//读取回调请求体while ((s = bufferedReader.readLine()) != null) {stringBuffer.append(s);}String s1 = stringBuffer.toString();String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);String nonce = request.getHeader(WECHAT_PAY_NONCE);String signType = request.getHeader("Wechatpay-Signature-Type");String serialNo = request.getHeader(WECHAT_PAY_SERIAL);String signature = request.getHeader(WECHAT_PAY_SIGNATURE);// 如果已经初始化了 RSAAutoCertificateConfig,可直接使用// 没有的话,则构造一个NotificationConfig config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKey(privateKey).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3Key).build();// 初始化 NotificationParserNotificationParser parser = new NotificationParser(config);RequestParam requestParam = new RequestParam.Builder().serialNumber(serialNo).nonce(nonce).signature(signature).timestamp(timestamp)// 若未设置signType,默认值为 WECHATPAY2-SHA256-RSA2048.signType(signType).body(s1).build();Transaction parse = parser.parse(requestParam, Transaction.class);log.info("支付回调参数:{}", JSON.toJSON(parse));try {/*** trade_state:* SUCCESS:支付成功* REFUND:转入退款* NOTPAY:未支付* CLOSED:已关闭* REVOKED:已撤销(付款码支付)* USERPAYING:用户支付中(付款码支付)* PAYERROR:支付失败(其他原因,如银行返回失败)*/if ("SUCCESS".equals(parse.getTradeState().toString())) {// 成功log.info("==========支付回调【支付成功】=============");} else if ("USERPAYING".equals(parse.getTradeState().toString())|| "NOTPAY".equals(parse.getTradeState().toString())) {// 未支付log.info("==========支付回调【未支付】=============");} else if ("PAYERROR".equals(parse.getTradeState().toString())|| "REVOKED".equals(parse.getTradeState().toString())|| "REFUND".equals(parse.getTradeState().toString())|| "CLOSED".equals(parse.getTradeState().toString())) {// 支付失败log.info("==========支付回调【支付失败】=============");}} catch (Exception e) {log.error("支付回调处理异常:{}", e);return HttpStatus.INTERNAL_SERVER_ERROR;}log.info("-----------------------支付回调完成-----------------------");return HttpStatus.OK;}@Overridepublic Object refunCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {//读取请求体的信息ServletInputStream inputStream = request.getInputStream();StringBuffer stringBuffer = new StringBuffer();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s;//读取回调请求体while ((s = bufferedReader.readLine()) != null) {stringBuffer.append(s);}String s1 = stringBuffer.toString();String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);String nonce = request.getHeader(WECHAT_PAY_NONCE);String signType = request.getHeader("Wechatpay-Signature-Type");String serialNo = request.getHeader(WECHAT_PAY_SERIAL);String signature = request.getHeader(WECHAT_PAY_SIGNATURE);// 如果已经初始化了 RSAAutoCertificateConfig,可直接使用// 没有的话,则构造一个NotificationConfig config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKey(privateKey).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3Key).build();// 初始化 NotificationParserNotificationParser parser = new NotificationParser(config);RequestParam requestParam = new RequestParam.Builder().serialNumber(serialNo).nonce(nonce).signature(signature).timestamp(timestamp)// 若未设置signType,默认值为 WECHATPAY2-SHA256-RSA2048.signType(signType).body(s1).build();RefundNotification parse = parser.parse(requestParam, RefundNotification.class);log.info("退款回调参数:{}", JSON.toJSON(parse));try {/*** refund_status:* SUCCESS:退款成功* CLOSED:退款关闭* ABNORMAL:退款异常,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往【商户平台—>交易中心】,手动处理此笔退款*/if ("SUCCESS".equals(parse.getRefundStatus().toString())) {// 成功log.info("==========退款回调【退款失败】=============");} else if ("CLOSED".equals(parse.getRefundStatus().toString()) || "ABNORMAL".equals(parse.getRefundStatus().toString())) {// 失败log.info("==========退款回调【退款失败】=============");}} catch (Exception e) {log.error("退款回调处理异常:{}", e);return HttpStatus.INTERNAL_SERVER_ERROR;}log.info("-----------------------退款回调完成-----------------------");return HttpStatus.OK;}}

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

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

相关文章

使用SpeechRecognition和vosk处理ASR

SpeechRecognition可以支持多种模型语音转文字&#xff0c;感觉vosk还不错&#xff0c;使用起来也简单一些&#xff1b;百度也有PaddleSpeech&#xff0c;但是安装起来太麻烦&#xff0c;不是这个库版本不对就是那个库有问题&#xff0c;用起来不方便&#xff1b; 安装SpeechR…

【Git教程】(十)版本库之间的依赖 —— 项目与子模块之间的依赖、与子树之间的依赖 ~

Git教程 版本库之间的依赖 1️⃣ 与子模块之间的依赖2️⃣ 与子树之间的依赖&#x1f33e; 总结 在 Git 中&#xff0c;版本库是发行单位&#xff0c;代表的是一个版本&#xff0c;而分支或标签则只能被创建在版本库这个整体中。如果一个项目中包含了若干个子项目&#xff0c;…

12.文件浏览器

子程序参数的使用 1.可空的用法&#xff1b;表示这个参数不写也行。 2.如何使用递归 3.需要注意的事 递归的子程序必须有个退出的条件 注意区分递归和循环&#xff0c;不要混用 流程&#xff1a; 1.插入按钮&#xff0c;输入输出调试文本&#xff08;“按钮被单击”&…

2024年主流的java混淆工具有哪些

2024年&#xff0c;主流的Java混淆工具可能会包括&#xff1a; ProGuard&#xff1a;ProGuard 是一个免费的开源 Java 混淆工具&#xff0c;可用于压缩、优化和混淆 Java 字节码。它是Android开发者的首选混淆工具之一&#xff0c;并且在Java应用程序中也得到了广泛应用。 Dex…

Windows本地部署Ollama+qwen本地大语言模型Web交互界面并实现公网访问

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并安装Open WebUI结合cpolar内网穿透软…

OpenCV4.9图像金字塔

目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 pyrUp()和 pyrDown()对给定图像进行下采样或上采样。 理论 注意 下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。 通常&#xff0c;我们需要将图像转换为与原始图像不同的大小。为此…

Linux 1.文件编程(dup、dup2)

重定向 重定向是什么&#xff1f;dupdup2 重定向是什么&#xff1f; 进程在最开始运行的时候&#xff0c;首先打开了三个文件&#xff0c;分别是标准输入流、标准输出流、标准错误输出流。证明的时候我是把标准输出留给关闭了&#xff0c;然后紧接着创建的文件就会占用已关闭的…

JavaScript-2.对话框、函数、数组、Date、DOM

对话框 window对象封装了三个对话框用于与用户交互 提示框&#xff1a;alert(title);确认框&#xff1a;confirm(title);输入框&#xff1a;prompt(title); 确认框 包含两个按钮“确认”/“取消”&#xff0c;点击确定时&#xff0c;返回值为true // 确认框 var bool con…

Linux系统编程---文件系统

一、文件存储 一个文件主要由两部分组成&#xff0c;dentry(目录项)和inode inode本质是结构体&#xff0c;存储文件的属性信息&#xff0c;如&#xff1a;权限、类型、大小、时间、用户、盘块位置… 也叫做文件属性管理结构&#xff0c;大多数的inode都存储在磁盘上。 少量…

XWX-SX三箱社交箱

简单介绍&#xff1a; 动物行为学是一门研究动物行为的科学&#xff0c;它包括观察动物在自然环境中的行为&#xff0c;以及在控制环境中的实验行为。三箱社交实验是其中一种常见的实验方法&#xff0c;用于评估动物的社交行为和决策制定能力。这种实验在许多领域都有应用&…

bugku-web-需要管理员

页面源码 <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>404 Not Found</title> </head> <body> <div idmain><i> <h2>Something error:</h2…

Array.prototype.fill()

在 JavaScript 中&#xff0c;Array.prototype.fill() 是一个用于填充数组的方法。这个方法将指定的值填充到从起始索引到结束索引&#xff08;不包括结束索引&#xff09;的数组中的每个元素。如果省略结束索引&#xff0c;那么它将填充整个数组。 下面是 fill() 方法的基本语…

QT、ffmpeg视频监控分屏

1、支持分屏&#xff08;4&#xff0c;6&#xff0c;8&#xff0c;9&#xff0c;13&#xff0c;16&#xff0c;25&#xff0c;32&#xff0c;64&#xff09;切换 2、支持拖拽效果 3、支持播放mp4&#xff0c;rtmp等 4、本人亲测支持播放32路&#xff0c;64路没做测试 5、支持读…

C#面:如有50万个int类型的数字,现在需要判断⼀下⾥⾯是否存在重复的数字,请简要说⼀下思路

可以使用 List 集合的方法&#xff1a;Distinct() 或者 GroupBy() 。可以使用 Dictionary&#xff0c;Key值唯一性。可以使用 HashSet &#xff0c;它的元素具有唯一性&#xff1a;&#xff08;但是内存可能会爆&#xff09;新建一个HashSet&#xff0c;不断Add数字&#xff0c…

【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、类的6个默认成员函数 二、构造函数 1、概念 2、特性 三、析构函数 1、概念 2、特性 一、…

MYSQL索引优化方法

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的…

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution&#xff0c;主要出现在小样本统计推断中&#xff0c;特别是当样本量较小且总体标准差未知时&#xff0c;用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布&#xff08;卡方分布&#xff09;。如果随机变量X服…

冯诺依曼体系结构+操作系统

操作系统篇 文章目录 一、冯诺依曼体系结构(1) 硬件数据流动角度&#xff0c;在数据层面&#xff1a;(2)程序运行为什么要加载到内存&#xff1f; 二、操作系统(Operator System)(1) Why 要有操作系统&#xff1f;(2)如何理解 “管理” &#xff1f; 一、冯诺依曼体系结构 /*-…

springCloudAlibaba集成seata实战(分布式事物详解)

一、分布式事务 1. 事务介绍 1.1 基础概念 事务&#xff1a;保证我们多个数据库操作的原子性&#xff0c;多个操作要么都成功要么都不成功 事务ACID原则 A&#xff08;Atomic&#xff09;原子性&#xff1a;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部…

三次握手与四次挥手到底是怎么回事?

三次握手和四次挥手是TCP/IP协议中建立和断开连接的关键步骤&#xff0c;它们是保证可靠通信的重要机制。这里将探讨这两个概念&#xff0c;并解释它们背后的原理。 三次握手 三次握手用于建立TCP连接&#xff0c;它由客户端和服务器之间发送的三个报文组成&#xff1a; 第一次…