GO语言接入支付宝

news2024/11/16 3:43:03

GO语言接入支付宝

今天就go语言接入支付宝写一个教程

使用如下库,各种接口较为齐全

	"github.com/smartwalle/alipay/v3"

先简单介绍下加密:

试想,当用户向支付宝付款时,若不进行任何加密,那么黑客就可以任意篡改传输的信息,比如明明需要付款100,但修改为0.1元,支付宝只收到0.1元,后端老板却以为是100块。

最基础的加密:

image-20240221213421155

两者以123456进行加密通话,当商户或者支付宝的密码泄露时,就可能会被修改数据,不安全。

防篡改加密:

image-20240221213632201

其实就是对基础加密加了一个md5,多了一个验证的过程,

MD5是原文+密码生成的一段字符,当原文或者密码被修改时,两者能第一时间发现双方的MD5不统一了,就说明已经被修改了

非对称加密:

image-20240221213829134

非对称说的是什么呢,就是双方的密码不再是共用一个一样的了。

image-20240221213936013

概念:

  • 公钥(Public Key):公钥是一个用于加密信息的密钥,它可以公开给任何人使用。公钥可以将信息加密,但不能用来解密已加密的信息。任何人都可以使用公钥对信息进行加密,但只有持有与之配对的私钥的人才能解密这些加密后的信息。
  • 私钥(Private Key):私钥是与公钥配对的另一个密钥,是保密的,并且只有私钥的持有者才能访问。私钥用于解密由对应的公钥加密的信息。此外,私钥还用于数字签名,确保信息的真实性和完整性。

简单说公钥加密,私钥解密;还是私钥加密,公钥解密都可以存在,只是应用场景不同

公钥可以公开,甚至任何人知道都没问题,但私钥不行,千万不能公开;

公钥加密,私钥解密

场景:防篡改,即使能被人看到也无碍,因为无法修改

虽然公钥和私钥都可以用于加密和解密,但是实际上公钥加密、私钥解密还是私钥加密、公钥解密这实际上并不是一个问题。因为公钥是被公开的,使用私钥进行加密,公钥进行解密,在传输的过程中谁都可以获取到这个信息并对其使用公钥进行解密,所以这不是加密和解密的场景,因为这个过程注定无法保密,这个过程是用于验证发送者的身份的,因为在网络上的信息是可以被获取和篡改的,如果私钥只有一人拥有,使用私钥进行加密,获取到这个加密后的数据之后,拿着公钥进行解密,如果能够解开,说明了发送者的身份就是私钥的拥有者,而这种身份的证明和不可抵赖性则是这个使用中最为重要的关注点,而传输的内容则不是关注的内容。
所以私钥加密、公钥解密这种情况更多的则是这样一种表述:私钥的拥有者使用私钥进行签名,而公钥的拥有者使用公钥对此签名进行验证,从而确认发送者的身份。其实从数据的流向也很清楚,从私钥的拥有者流向众多公钥的拥有者,主要是向拥有者进行身份的证明,安全性相关的数据的传输使用这种方式注定是得不到保障的。

公钥加密、私钥解密

数据的流向相较于前面一种场景是相反的,公钥加密的数据,传输之后,收到数据的接收者使用私钥进行解密,由于私钥的持有人是严格管理的,所以正常情况下,一般人即使获取到使用公钥加密的数据也无法解开,所以数据的安全性是可以得到保障的。这也是非对称密钥算法最为常见的使用场景

示例代码:

package main

import (
	"fmt"
	"github.com/smartwalle/alipay/v3"
	"github.com/smartwalle/xid"
	"log"
	"net/http"
)

var client *alipay.Client

const (
	kAppId      = "9021000134669651"
	kPrivateKey = MIIEowIBAAKCAQEAhKKM9J97xsgyPsdR3apJ472ps0QXsof5yt1tv0FUQ5VnkfV56tX1QqqbnFN4C1lC7S0c9kXAFK4NlH/yPrpOSc6bB79Y5do7/bPzD1/s3hHuCl9dpLBcaA12mEMa1l3r6rnkxFCe4YYTfEjzAdPq4PFL7rcdGSk4ieEJrOkX1K7v6iHz44x/Nul/bXS4TOVe5bZPdS6CaKYCioUjIVtIMq4v/EiFLrdCDJAOk5tS3fvP84FOxp2Y/6AFDVXXb4VubVTQ1/14s7MJ8YXgOHKOW10mgwzUfgyp5/ZOW9X4CT4rEzxeK51ZADDOyzXYGC1k3mR3PsvDTJPiZf+KlOrF4QIDAQABAoIBAFlahOlb8/Aj+K2QbBeQXD0ADi5F5k0RC/heGkxpf5IUOfT70gmh4JvsAe9b0BidJthPtx42OUP1ShLL62/U5V8VwB2FDCe1UQsGyu2FqzakD6CPRK/pXCeBQm8rbg4Sshes6nBS++ZlBAWLw6JsmOS3ynbkh8bmnT9OCs2hLrvJseQnFI4yjmCtkK30MxtxVm2g9N1AbAyqraVGzJtSFECNS7sVy2kZsBMPJ0Enbp5rfshAiCUQmXEIPpMs9ZxsaVeFqlXZ91YcwPCfpTQip9/gORKebh3KYQKvgrLwMBgUfJ31dEvesQ4SzdNLXBS8LghrhWsScyCtj5y7jCCjIB0CgYEAxPxXRKPRULSByEYO0XvTpnhHtDQvMIXEE68b5N96QvT7TD9pqkkvHo7RPktiGC+PzEX1LSYBsgIxuQyNkP+HXu5rQWv1p9hfIynIRwjkESigj+B3knAQVQQq8uMK3HKOj3E6T3nAWXk/Fyt3P6em8u/AGHLHewp4ekBdyZBh2j8CgYEArF7hsZ/oGnsTkZV0ujxaLqwLpPEOBEsJ55MfD4XBaSRLF8fswCxFMM42bixjR5nL+YtCpEDhfYht2kpdgEF3hL5DrBR1EmH4Gk6xOFUf3o3YMzxtDGha1sbboAQ8qUGrDWAL3dqdGfxuCfKMeRH+h2Hism2NRvJzuX7GE0JuF98CgYBUh6B/QPkCc+M5aO7U8Bkb14OVjcsuPEiu1bbXmRqi/vOTfaa/PxZsO4cI/1pB3K8NTnvuet/BXnWt3fgl37FciF0YPta0xwHUWgqqiOMthcyY0Q8elN49TUOM5Ob1QGdyoHkQP8PN4Vy0eZ97flsC5uT82MxHPXADrflRFJcZCwKBgQCOOrhmdbjyaM4L2dP4fCY5zrLJBjL3reddUxNVHpwqIs1nsQsUwzLQg8d7/1poUWpy3cs+d17Y04M5lRUz6FEzkj+KtVKouXgcVQR8pBjo7ggQtvKQQ2d5Q5sjnXtkehAnuDHyfRoWwCkYQjBREl0A3u9NJYJmoVaGICpW6ACp5wKBgDI3HqpVBcOPA40pZA1DGhZ3ump9N1IbJ1DG915tUmAk7+cDf97YxF5t+/nl4eyWBwtKKo9QUFOlCmrghX2/BTVf2nB1Xr750aoupgOqMoOqkKk75MZl8A8UM+oxLWGRfOSzSJp32gPuxGJfkDVwi8bNAbH1MuNqu6auzZoEjIQ8"

	kServerPort = "9989"
	// TODO 设置回调地址域名
	kServerDomain = ""172.233.92.229:9989""
)

func main() {
	var err error

	if client, err = alipay.New(kAppId, kPrivateKey, false); err != nil {
		log.Println("初始化支付宝失败", err)
		return
	}

	// 加载证书
	if err = client.LoadAppCertPublicKeyFromFile("appPublicCert.crt"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	if err = client.LoadAliPayRootCertFromFile("alipayRootCert.crt"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	if err = client.LoadAlipayCertPublicKeyFromFile("alipayPublicCert.crt"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}

	if err = client.SetEncryptKey("iotxR/d99T9Awom/UaSqiQ=="); err != nil {
		log.Println("加载内容加密密钥发生错误", err)
		return
	}

	http.HandleFunc("/alipay/pay", pay)
	http.HandleFunc("/alipay/callback", callback)
	http.HandleFunc("/alipay/notify", notify)

	http.ListenAndServe(":"+kServerPort, nil)
}

func pay(writer http.ResponseWriter, request *http.Request) {
	var tradeNo = fmt.Sprintf("%d", xid.Next())

	var p = alipay.TradePagePay{}
	p.NotifyURL = kServerDomain + "/alipay/notify"
	p.ReturnURL = kServerDomain + "/alipay/callback"
	p.Subject = "支付测试:" + tradeNo
	p.OutTradeNo = tradeNo
	p.TotalAmount = "10.00"
	p.ProductCode = "FAST_INSTANT_TRADE_PAY"

	url, _ := client.TradePagePay(p)
	http.Redirect(writer, request, url.String(), http.StatusTemporaryRedirect)
}

func callback(writer http.ResponseWriter, request *http.Request) {
	request.ParseForm()

	if err := client.VerifySign(request.Form); err != nil {
		log.Println("回调验证签名发生错误", err)
		writer.WriteHeader(http.StatusBadRequest)
		writer.Write([]byte("回调验证签名发生错误"))
		return
	}

	log.Println("回调验证签名通过")

	// 示例一:使用已有接口进行查询
	var outTradeNo = request.Form.Get("out_trade_no")
	var p = alipay.TradeQuery{}
	p.OutTradeNo = outTradeNo

	rsp, err := client.TradeQuery(p)
	if err != nil {
		writer.WriteHeader(http.StatusBadRequest)
		writer.Write([]byte(fmt.Sprintf("验证订单 %s 信息发生错误: %s", outTradeNo, err.Error())))
		return
	}

	if rsp.IsFailure() {
		writer.WriteHeader(http.StatusBadRequest)
		writer.Write([]byte(fmt.Sprintf("验证订单 %s 信息发生错误: %s-%s", outTradeNo, rsp.Msg, rsp.SubMsg)))
		return
	}
	writer.WriteHeader(http.StatusOK)
	writer.Write([]byte(fmt.Sprintf("订单 %s 支付成功", outTradeNo)))
}

func notify(writer http.ResponseWriter, request *http.Request) {
	request.ParseForm()

	var notification, err = client.DecodeNotification(request.Form)
	if err != nil {
		log.Println("解析异步通知发生错误", err)
		return
	}

	log.Println("解析异步通知成功:", notification.NotifyId)

	// 示例一:使用自定义请求进行查询
	var p = alipay.NewPayload("alipay.trade.query")
	p.AddBizField("out_trade_no", notification.OutTradeNo)

	var rsp *alipay.TradeQueryRsp
	if err = client.Request(p, &rsp); err != nil {
		log.Printf("异步通知验证订单 %s 信息发生错误: %s \n", notification.OutTradeNo, err.Error())
		return
	}
	if rsp.IsFailure() {
		log.Printf("异步通知验证订单 %s 信息发生错误: %s-%s \n", notification.OutTradeNo, rsp.Msg, rsp.SubMsg)
		return
	}

	log.Printf("订单 %s 支付成功 \n", notification.OutTradeNo)

	client.ACKNotification(writer)
}

需要在同级目录下放入三个证书文件供代码识别;

为了能够让大家更了解这个过程,我先引入支付宝支付的全流程;

1. 商户创建订单:

  1. 商户系统生成订单: 用户在商户网站或应用中选择商品,提交订单并选择支付宝作为支付方式。
  2. 生成订单信息: 商户系统生成包含订单号、商品信息、价格等支付信息的订单数据。
  3. 向支付宝发起支付请求: 商户将订单信息发送到支付宝网关,请求生成支付二维码或跳转支付页面。

2. 用户支付:

  1. 支付宝处理支付请求: 支付宝接收到商户的支付请求后,生成用于支付的二维码或跳转支付页面。
  2. 用户扫码或点击支付: 用户使用支付宝扫描二维码或点击支付页面上的支付按钮。
  3. 登录支付宝账户: 如果用户未登录,支付宝要求用户登录账户以完成支付。
  4. 选择支付方式: 用户选择支付方式,可以是支付宝余额、绑定的银行卡、信用卡等。
  5. 确认支付: 用户确认支付并输入支付密码(如果需要)。

3. 支付宝处理支付:

  1. 支付验证: 用户确认支付后,支付宝进行支付验证,验证用户身份和支付信息。
  2. 扣款和通知商户: 支付宝从用户账户中扣款,并通过支付回调通知商户支付结果。商户服务器接收到支付回调后进行验证,确保通知的合法性。

4. 商户处理支付结果:

  1. 验证支付通知: 商户接收到支付宝的支付回调通知,验证通知的真实性和合法性,以防止伪造通知。
  2. 更新订单状态: 商户更新订单状态,标记订单为支付成功,并进行相应的业务处理。

5. 用户返回商户:

  1. 支付成功页面: 支付宝页面显示支付成功,用户可选择返回商户页面。
  2. 商户页面更新: 商户页面根据支付结果进行相应展示,可能展示订单详情、发货信息等。

6. 异常处理:

  1. 支付失败: 如果支付失败,支付宝将向用户展示支付失败页面,用户可选择重新支付。
  2. 用户取消支付: 如果用户取消支付,支付宝将返回给商户支付取消的通知。

第一步在上述代码表现是直接指定订单格式,此订单是先存放在本地数据库的;

当用户执行第二步开始付款时,会将该订单发送给支付宝进行处理,成功后会返回给商户回调通知,本地同时将数据库中订单信息数据进行更新,并相应的在前端更新数据;

详细讲解一下顺序,支付宝回调可以直接返回给后端,待后端记录到数据库中后,更改订单状态,后端发现没有问题再给前端并给支付宝发送没问题,然后再渲染,这一步使用了消息队列、WebSocket 等方式实现发给前端, 前端通过轮询、WebSocket 等方式获取到支付状态的更新消息。可以实时的看到支付结果;

异步通知:异步通知是指在某个事件触发后,系统不立即处理结果,而是通过触发通知或事件来异步处理。在支付领域,异步通知通常用于处理支付结果的通知,例如支付成功或失败的通知。

在支付过程中是指的,支付宝给商户返回支付成功或失败的状态,商户不会直接返回响应,而是对数据进行验证,更新数据库状态等等,最后再发送响应200;这个过程中,支付宝就是异步的,并没有一直等待商户的回复;

内网穿透

为什么要引入内网穿透呢?

我们已经分析了整个支付过程,其中回调通知需要发送到商户的回调地址上,如果该地址是私网,恐怕永远也收不到支付宝的确认支付成功的通知了;

所以该地址是需要内网穿透的;

概念与操作:

内网穿透是一种通过公共网络(比如互联网)将本地网络中的服务暴露给外部访问的技术。它通常用于解决内网环境下无法直接被外部访问的问题,比如开发、测试环境中的服务器。

  1. 以下是内网穿透的一般实现原理:

    1. 服务端和客户端: 内网穿透通常涉及两个主要组件,即服务端和客户端。服务端位于公共网络上,而客户端位于内网。
    2. 隧道通信: 服务端和客户端通过一个安全的通道进行通信,这个通道可以是TCP或UDP连接。这个通道可以是直接的连接,也可以通过一些中继服务器(比如内网穿透服务提供商的服务器)来传递。
    3. 穿透协议: 内网穿透涉及一些协议来确保数据的安全传输。通常使用加密协议,比如TLS/SSL,以保护数据的隐私和完整性。
    4. 映射本地服务: 在客户端和服务端建立通信后,客户端可以将本地的服务端口映射到服务端的对应端口上。这样,外部用户就可以通过访问服务端的对应端口来访问内网中的服务。
    5. 心跳保持连接: 为了保持连接的稳定性,客户端和服务端通常会通过周期性的心跳信号来维持连接,以确保隧道保持打开状态。
    6. 反向代理: 有些内网穿透服务还使用反向代理来加强安全性和性能。反向代理可以缓存和加速请求,并提供额外的安全层。

    内网穿透的实现原理涉及建立一个安全的通道,通过这个通道映射内网服务的端口,使得外部用户可以通过公共网络访问内网中的服务。这有助于方便开发、测试等环境中的服务的外部访问。

内网穿透技术在许多场景中都有应用,比如:

  • 远程访问:允许远程用户从任何地方访问公司内部的网络资源。
  • 本地开发:允许开发人员在本地开发环境中进行调试和测试,同时外部用户也可以访问并提供反馈。
  • 物联网设备管理:允许管理人员从远程访问和控制物联网设备,如智能家居设备、传感器等。

怎么暴露

今天我们不讲那些概念,只讲具体操作

首先下载ngrok:

Setup - ngrok

在官网侧边栏生成自己的令牌;

进入后可以使用以下直接将端口暴露

ngrok authtoken   令牌

ngrok http 端口

image-20240221193528841

之后可以开一个在此端口运行的代码,然后进入浏览器输入对应的网址就能看到我们的端口开放到公网了;

此时我们的项目所有人都可以搜索到了;

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

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

相关文章

【牛客】VL76 任意奇数倍时钟分频

描述 编写一个模块,对输入的时钟信号clk_in,实现任意奇数分频,要求分频之后的时钟信号占空比为50%。模块应包含一个参数,用于指定分频的倍数。 模块的接口信号图如下: 要求:使用Verilog HDL语言实现&#…

2024最新版CleanMyMac X 4.15.1 Crack+激活码下载

CleanMyMac X 为您喜爱的事物腾出空间。 CleanMyMac 具有一系列巧妙的新功能,可让您安全、智能地扫描和清理整个系统、删除大型未使用的文件、减小 iPhoto 图库的大小、卸载不需要的应用程序或修复开始工作不正常的应用程序、管理所有应用程序您可以从一个地方进行扩…

html css 导航栏 2

鼠标划过会向上移动改变颜色 html文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>导航栏</title><link rel"stylesheet" href"css/dhl1.css" /></head><body><div …

分销商城微信小程序:用户粘性增强,促进复购率提升

在数字化浪潮的推动下&#xff0c;微信小程序作为一种轻便、高效的移动应用形式&#xff0c;正成为越来越多企业开展电商业务的重要平台。而分销商城微信小程序的出现&#xff0c;更是为企业带来了前所未有的机遇。通过分销商城微信小程序&#xff0c;企业不仅能够拓宽销售渠道…

揭秘税务信息接口:解读企业税务登记与纳税情况

导语&#xff1a; 随着社会经济的发展&#xff0c;税收对于国家财政收入的重要性不言而喻。税务登记信息和纳税情况对于企业和个人来说至关重要。在这个背景下&#xff0c;税务信息接口应运而生&#xff0c;为我们提供了便捷的查询途径。本文将以挖数据平台提供的税务信息接口…

【IPC】管道通信【命名管道】

文章目录 1.管道小总结2.命名管道2.1认识命名管道2.2命名管道的应用小场景2.3模拟命名管道1.Lod.hpp2.common.hpp3.server.cxx4.client.cxx 3.管道代码总结 1.管道小总结 linux-manualshouce 在Linux中&#xff0c;manual手册的编号用于区分手册的不同部分。这些编号通常用于ma…

个人商城系统开源(发送手机验证码!)

原文地址&#xff1a;个人商城系统开源&#xff08;发送手机验证码&#xff01;&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源…

3 模型评估

3 模型评估 在测试AI系统中的模型训练和评估阶段,需要使用准备好的数据集对AI模型进行训练和评估。在训练过程中,应该对模型进行监控和调整,以确保模型的准确性和效果。在评估过程中,需要使用测试数据集对模型进行测试,以验证模型的准确性和效果。模型的评估也分为离线评…

通过一篇文章带你玩转git和GitHub

Git和Github的基本用法 前言一、Git和Github的基本用法背景下载安装安装 git for windows安装 tortoise gitgit安装过程中的一些选项 tortoise git汉化教程下载tortoise git汉化安装包安装tortoise git汉化安装包 三、使用 Github 创建项目注册账号创建项目下载项目到本地 四、…

视频批量混剪剪辑,批量剪辑批量剪视频,探店带货系统,精细化顺序混剪,故事影视解说,视频处理大全,精细化顺序混剪,多场景裂变,多视频混剪

前言 工具的产生源于dy出的火山引擎的云视频混剪制作是按分钟数收费的&#xff0c;这个软件既能实现正常混剪也能避免二次收费。属于FFMPEG合成的。 欢迎大家给一些好的建议和功能&#xff0c;回复可见&#xff0c;附加了一些天卡&#xff0c;周卡&#xff0c;请大家不要一人占…

【C++】函数模板和类模板

目录 1.泛型编程 2.函数模板 2.1函数模板的定义格式 2.2函数模板的实例化 2.3函数模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 3.3模板的分离编译 1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段…

新一代 Git 工具,AI 赋能!深度集成、简化操作 | 开源日报 No.194

gitbutlerapp/gitbutler Stars: 7.2k License: NOASSERTION gitbutler 是一个基于 Git 的版本控制客户端。旨在为现代工作流程构建一个全新的 Git 分支管理工具。 虚拟分支&#xff1a;可以同时在多个分支上工作&#xff0c;而无需不断切换分支简化提交管理&#xff1a;通过拖…

如何转行成为产品经理?

转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器&#xff0c;细分 方法思路&#xff1a;用通用定时器TIM2&#xff0c;1ms产生一次中断&#xff1b;在中断里做IO反转&#xff1b; 发送10个脉冲信号

Docker部署SimpleMindMap结合内网穿透实现公网访问本地思维导图

文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&…

【漏洞复现】大华ICC智能物联综合管理平台token弱口令漏洞

Nx01 产品简介 大华智能物联综合管理平台 iConnection Center&#xff08;以下简称&#xff1a;ICC平台&#xff09;&#xff0c;是一套基于智能物联的综合业务管理平台软件&#xff0c;具备强大的后台服务能力&#xff0c;配套了B/S管理员端、C/S客户端、移动APP终端、小程序等…

Java的Writer类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Tomcat容器经常重启问题排查

报错代码: INFO [Catalina-utility-2] org.apache.catalina.core.StandardContext.reload Reloading Context with name [] has started1.查看内存占用情况:top 可以发现java线程正常情况下占用高达24%的内存资源 2.继续排查:top -Hp 29580 可以发现主要有子线程Catalina-ut…

汉服|高校汉服租赁网站|基于Springboot的高校汉服租赁网站设计与实现(源码+数据库+文档)

高校汉服租赁网站目录 目录 基于Springboot的高校汉服租赁网站设计与实现 一、前言 二、系统设计 三、系统功能设计 1、汉服信息管理 2、汉服租赁管理 3、公告管理 4、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…

Elasticsearch 通过索引阻塞实现数据保护深入解析

Elasticsearch 是一种强大的搜索和分析引擎&#xff0c;被广泛用于各种应用中&#xff0c;以其强大的全文搜索能力而著称。 不过&#xff0c;在日常管理 Elasticsearch 时&#xff0c;我们经常需要对索引进行保护&#xff0c;以防止数据被意外修改或删除&#xff0c;特别是在进…