TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境

博客地址:TMDOG的博客

作者自述:
最近忙着整理自己的项目代码,终于有时间更新一下博客。这次的内容是关于如何在Gin框架下集成支付宝的支付沙箱环境,具体包括如何初始化支付宝的SDK、生成支付链接和处理回调请求。不同于NestJS笔记,Gin学习笔记更专注于业务逻辑,而支付宝支付集成是大多数电商项目中不可缺少的部分,所以这一篇笔记对我来说也非常重要。

学习目标

学习如何将支付宝支付集成到Gin框架下,实现在沙箱环境中进行支付流程的模拟。

预期使用的技术栈:
Gin、支付宝SDK、Go

支付宝支付沙箱环境配置

1. 创建支付宝开放平台应用

首先,你需要在支付宝开放平台上创建一个应用:

  • 访问支付宝开放平台。
    请添加图片描述

  • 使用支付宝扫码登陆并进入控制台。

  • 向下划,在页面下面进入沙箱环境。

请添加图片描述
请添加图片描述

  • 接口加签方式中选择系统默认的证书模式,启用并查看
    请添加图片描述

  • 然后下载所有证书并,复制好应用私钥
    请添加图片描述

  • 接口内容加密方式中获取密钥并保存
    请添加图片描述

请添加图片描述

2. 安装支付宝SDK

支付宝官方提供了Go语言SDK,使用以下命令进行安装:

go get github.com/smartwalle/alipay/v3

3. 完整代码示例

我们将下载的证书放在项目目录下
请添加图片描述

package mainimport ("context""fmt""github.com/gin-contrib/cors""github.com/gin-gonic/gin""github.com/smartwalle/alipay/v3""github.com/smartwalle/xid""log""net/http""time"
)var client *alipay.Clientconst (kAppId        = "APPID"kPrivateKey   = "刚才保存的私钥"kServerPort   = "9989"                      //端口kServerDomain = "http://localhost:9989"//回调地址kSecretKey = "接口内容加密密钥"// 内容加密密钥
)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(kSecretKey); err != nil {log.Println("加载内容加密密钥发生错误", err)return}// 配置 CORS 中间件corsConfig := cors.DefaultConfig()corsConfig.AllowAllOrigins = true                                   // 允许所有域名corsConfig.AllowMethods = []string{"GET", "POST", "OPTIONS"}        // 允许的 HTTP 方法corsConfig.AllowHeaders = []string{"Content-Type", "Authorization"} // 允许的请求头// 使用 gin 框架设置路由r := gin.Default()// 因为需要支付宝返回回调请求,是跨域的,所以需要处理跨域请求// 将 CORS 中间件应用到所有路由r.Use(cors.New(corsConfig))// 配置路由r.GET("/alipay/pay", pay)r.GET("/alipay/callback", callback)r.POST("/alipay/notify", notify)// 启动 HTTP 服务r.Run(":" + kServerPort)
}func pay(c *gin.Context) {var tradeNo = fmt.Sprintf("%d", xid.Next())// 构造支付请求var p = alipay.TradePagePay{}p.NotifyURL = kServerDomain + "/alipay/notify"p.ReturnURL = kServerDomain + "/alipay/callback"p.Subject = "支付测试:" + tradeNop.OutTradeNo = tradeNop.TotalAmount = "100.00"p.ProductCode = "FAST_INSTANT_TRADE_PAY"// 打印支付请求数据log.Printf("支付请求数据: %+v", p)// 发起支付请求url, _ := client.TradePagePay(p)// 打印生成的支付链接log.Printf("支付链接: %s", url.String())// 重定向到支付链接c.Redirect(http.StatusTemporaryRedirect, url.String())
}func callback(c *gin.Context) {// 解析请求参数if err := c.Request.ParseForm(); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "解析表单数据失败",})return}// 打印回调的请求数据log.Printf("回调请求数据: %+v", c.Request.Form)// 获取支付宝回调数据中的签名字段sign := c.DefaultQuery("sign", "")if sign == "" {c.JSON(http.StatusBadRequest, gin.H{"error": "签名参数缺失",})return}// 验证签名if err := client.VerifySign(c.Request.Form); err != nil {log.Println("回调签名验证失败", err)c.JSON(http.StatusBadRequest, gin.H{"error": "签名验证失败",})return}log.Println("回调签名验证通过")// 获取回调中的订单信息outTradeNo := c.DefaultQuery("out_trade_no", "")totalAmount := c.DefaultQuery("total_amount", "")//tradeNo := c.DefaultPostForm("trade_no", "")// 验证支付金额if totalAmount != "100.00" { // 这里你可以根据自己的业务逻辑进行金额校验log.Printf("支付金额不匹配,expected: 100.00, received: %s", totalAmount)c.JSON(http.StatusBadRequest, gin.H{"error": "支付金额不匹配",})return}// 查询订单状态var p = alipay.TradeQuery{}p.OutTradeNo = outTradeNo// 调用支付宝查询接口rsp, err := client.TradeQuery(context.Background(), p)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("查询订单 %s 时发生错误: %s", outTradeNo, err.Error()),})return}// 打印查询结果log.Printf("支付宝查询响应: %+v", rsp)// 检查支付状态if rsp.IsFailure() {c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("支付查询失败: %s-%s", rsp.Msg, rsp.SubMsg),})return}// 如果支付成功,处理业务逻辑,如更新数据库、通知用户等if rsp.TradeStatus == "TRADE_SUCCESS" {log.Printf("订单 %s 支付成功", outTradeNo)// 这里可以写入支付成功后的业务逻辑,如更新订单状态、发货等} else {log.Printf("订单 %s 支付失败", outTradeNo)// 如果支付失败,可以进行相应的处理,如通知管理员等}// 返回成功响应c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("订单 %s 支付成功", outTradeNo),})
}func notify(c *gin.Context) {// 解析表单数据if err := c.Request.ParseForm(); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "解析表单数据失败",})return}// 打印接收到的异步通知数据log.Printf("异步通知请求数据: %+v", c.Request.Form)// 解析异步通知notification, err := client.DecodeNotification(c.Request.Form)if err != nil {log.Println("解析异步通知发生错误", err)c.JSON(http.StatusBadRequest, gin.H{"error": "解析异步通知发生错误",})return}// 打印解析后的异步通知数据log.Printf("解析后的异步通知数据: %+v", notification)// 使用自定义请求进行查询var p = alipay.NewPayload("alipay.trade.query")p.AddBizField("out_trade_no", notification.OutTradeNo)// 查询订单信息var rsp *alipay.TradeQueryRspif err = client.Request(context.Background(), p, &rsp); err != nil {log.Printf("异步通知验证订单 %s 信息发生错误: %s \n", notification.OutTradeNo, err.Error())c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("验证订单 %s 信息发生错误: %s", notification.OutTradeNo, err.Error()),})return}// 打印支付宝的查询响应数据log.Printf("支付宝查询响应: %+v", rsp)if rsp.IsFailure() {log.Printf("异步通知验证订单 %s 信息发生错误: %s-%s \n", notification.OutTradeNo, rsp.Msg, rsp.SubMsg)c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("异步通知验证订单 %s 信息发生错误: %s-%s", notification.OutTradeNo, rsp.Msg, rsp.SubMsg),})return}log.Printf("订单 %s 支付成功 \n", notification.OutTradeNo)// 确认通知成功client.ACKNotification(c.Writer)
}

涉及了三个主要的请求方法,分别是:

1. pay 请求方法
  • 作用: 这个方法是处理用户发起支付请求的地方。当用户请求 GET /alipay/pay 时,系统会生成一个支付链接,并将用户重定向到支付宝的支付页面。

  • 具体步骤:

    1. 创建一个唯一的订单号(tradeNo),这里通过 xid 包生成一个。
    2. 使用 alipay.TradePagePay 构建支付请求对象,设置支付相关的信息,如:通知地址(NotifyURL)、回调地址(ReturnURL)、商品描述(Subject)、订单号(OutTradeNo)和支付金额(TotalAmount)。
    3. 调用 client.TradePagePay(p) 向支付宝请求生成支付页面链接。
    4. 将生成的支付链接作为响应返回,并通过重定向将用户引导到支付宝的支付页面。

    该方法主要用于支付页面的生成和跳转,用户通过此链接进行支付操作。

2. callback 请求方法
  • 作用: 这个方法用于处理支付宝支付完成后的同步回调请求。当用户完成支付,支付宝会根据配置的 ReturnURL 返回到这个接口,并携带支付结果。

  • 具体步骤:

    1. 从回调请求中解析支付宝返回的数据。
    2. 获取回调中的签名参数,进行签名验证,确保回调数据未被篡改。
    3. 验证支付金额是否与预期一致。
    4. 使用支付宝的查询接口(TradeQuery)查询支付订单状态。
    5. 如果支付成功,则执行相应的业务逻辑(如更新订单状态、发货等)。
    6. 最终返回处理结果,如支付成功或失败的消息。

    这个方法的目的是处理支付完成后的验证和后续操作,确保支付数据的安全性与一致性。

3. notify 请求方法
  • 作用: 这个方法是处理支付宝支付后的异步通知请求。当用户支付完成后,支付宝会向 NotifyURL 发送异步通知,通知支付结果。支付宝会通过 POST 请求将支付结果发送到该接口。

  • 具体步骤:

    1. 解析支付宝发送的异步通知数据。
    2. 解码通知数据,得到支付结果。
    3. 查询支付订单的最新状态,验证订单是否支付成功。
    4. 确认支付成功后,可以进行进一步的处理,比如更新订单状态或进行其他业务逻辑。
    5. 最后返回一个确认响应(client.ACKNotification),告诉支付宝已经收到并处理完通知。

    这个方法用于处理支付完成后的异步通知,它可以确保系统及时接收到支付宝的支付通知并执行相应的后续处理。

这三个请求方法分别用于:

  • pay:生成支付链接并跳转到支付宝支付页面。
  • callback:同步回调,处理支付完成后的回调请求。
  • notify:异步通知,处理支付宝发送的支付成功通知。

4. 测试

直接在浏览器中测试,我们输入http://localhost:9989/alipay/pay,将会重定向到支付宝支付页面

请添加图片描述

在沙箱控制台右边栏当中点击沙箱账号可以填入买家邮箱和支付密码模拟支付
请添加图片描述

也可以下载手机支付宝沙箱版,用沙箱账号登录后扫码支付

我是使用手机扫码
请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

我们发现经过两次重定向后最后进入http://localhost:9989/alipay/callback显示支付成功

第一次重定向后支付宝服务方会异步发送alipay/notify到自己的服务器

第二次重定向会直接同步发送回调请求alipay/callback显示在用户界面通知支付成功

5. 查看gin控制台

2024/11/08 19:33:33 
支付请求数据: 
{Trade:{AuxParam:{} NotifyURL:http://localhost:9989/alipay/notify ReturnURL:http://localhost:9989/alipay/callback AppAuthToken: Subject:支付测试:3717435097532596224 Ou
tTradeNo:3717435097532596224 TotalAmount:100.00 ProductCode:FAST_INSTANT_TRADE_PAY Body: GoodsDetail:[] BusinessParams:[] DisablePayChannels: EnablePayChannels: SpecifiedChannel: ExtendParams:<nil> Agr
eementSignParams:<nil> GoodsType: InvoiceInfo: PassbackParams: PromoParams: RoyaltyInfo: SellerId: SettleInfo: StoreId: SubMerchant: TimeoutExpress: TimeExpire: MerchantOrderNo: ExtUserInfo:<nil> QueryOptions:[]} AuthToken: QRPayMode: QRCodeWidth:}
2024/11/08 19:33:33 支付链接: https://openapi-sandbox.dl.alipaydev.com/gateway.do?alipay_root_cert_sn=687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6&app_cert_sn=17811ce5cb5cf99a255aa
c61c6a11ae8&app_id=9021000141668546&biz_content=pYwkNjCG66efEQCRHGGZCO%2B46LHmZe15cel6apDQiiKhmB%2Bt%2B79id%2Fli5No%2B4PC%2F0CckV20dSx%2Fr0mL5JDwysgCtvijdgWWyiPffxrfv0iLsSXMqC7VAOY0Mr9cA32uL01mEH39nE9I
zTrcCjdJ9x1GN2tXhU57IFCy%2FbnSd3OfJcrLqJyKxxFlTtrjpdCCL1SBM1VxSo%2B9C8zL%2FlzfKDw%3D%3D&charset=utf-8&encrypt_type=AES&format=JSON&method=alipay.trade.page.pay&notify_url=http%3A%2F%2Flocalhost%3A9989%
2Falipay%2Fnotify&return_url=http%3A%2F%2Flocalhost%3A9989%2Falipay%2Fcallback&sign=buxn%2Fiwm3kBnCJbpIDi8Bz%2BYyJ1PFpYUR%2B%2Frh54aSzyDlyuMKlVHNO0AbSeAP5eyXXIK%2FbKJ8MMSETkfWEpDO%2Fuk4O4yzlBn0VMyZnoIT
vRDIvUJYuCpKXgBXplfuVI6YEzA6S2S0l6%2BQuzIRpqHlK0VJoDahiWisr95YOxb8ld8oH37UO%2F%2BvbrHMYWT7BLTWz%2FVqh0ELMKX%2BhsAeGBM1HlNAe1gpk3CB4%2FTIH%2BGUbicv9TcTOV2nLLKCLkqmnqOlmhK%2FB%2BnbP52j7%2FbuGaV5hx%2FSnKeARdMZJW1tr3A7cWKyBpGOGf%2BylvBGvySg046aeRDo5l6OEnX3J10zdflUg%3D%3D&sign_type=RSA2&timestamp=2024-11-08+19%3A33%3A33&version=1.0[GIN] 2024/11/08 - 19:33:33 | 307 |     31.9174ms |             ::1 | GET      "/alipay/pay"2024/11/08 19:34:09 
回调请求数据: 
map[app_id:[9021000141668546] auth_app_id:[9021000141668546] charset:[utf-8] method:[alipay.trade.page.pay.return] out_trade_no:[3717435097532596224] seller_id:[208872
1048676520] sign:[R2vAtE5H22B5Z+rVvlvQBiokQWl84bH2E9peZDON1LEg82SXVS4F1FWIPDtifhI+CvUQ0Kj+oLHDuaoWMeAZhjRpwWQ+Q1htfDuFLcHPYN9ZSFWglw0dCmZ8cjPBy5Y0A5NcH2qAJQcCpKqtr6t9nFsk/U4PT4WW0i614AoLod7J94bqJwm0IhC
pGxGCFyhlL8MnNXDRAg28Ne139n4O7GDNiw6PQtcmybGCmNW8YxEh1oP+tDj6+cATbxlwzeCmB4veowSS66JuAec3GqxLMFyXGOuLKUtrHAo6Uhth9pRKtVHVK8E5JLi97sB6N+hSX4h1qOBjybuvbRXao/RqjQ==] sign_type:[RSA2] timestamp:[2024-11-08 19:34:06] total_amount:[100.00] trade_no:[2024110822001476540504411933] version:[1.0]]2024/11/08 19:34:09 
回调签名验证通过
HYBAmount: BKAgentRespInfo:<nil> ChargeInfoList:[] DiscountGoodsDetail: VoucherDetailList:[]} rminalId: FundBillList:[] StoreName: BuyerUserId:2088722048676545 B
2024/11/08 19:34:10 订单 3717435097532596224 支付成功[GIN] 2024/11/08 - 19:34:10 | 200 |    805.5153ms |             ::1 | GET      "/alipay/callback?charset=utf-8&out_trade_no=3717435097532596224&method=alipay.trade.page.pay.return&total_amount=100.00&sign=R2vAtE5H22B5Z%2BrVvlvQBiokQWl84bH2E9peZDON1LEg82SXVS4F1FWIPDtifhI%2BCvUQ0Kj%2BoLHDuaoWMeAZhjRpwWQ%2BQ1htfDuFLcHPYN9ZSFWglw0dCmZ8cjPBy5Y0A5NcH2qAJQcCpKqtr6t9nFsk%2FU4PT4WW0i614AoLod7J94bqJwm0IhCpGxGCFyhlL8MnNXDRAg28Ne139n4O7GDNiw6PQtcmybGCmNW8YxEh1oP%2BtDj6%2BcATbxlwzeCmB4veowSS66JuAec3GqxLMFyXGOuLKUtrHAo6Uhth9pRKtVHVK8E5JLi97sB6N%2BhSX4h1qOBjybuvbRXao%2FRqjQ%3D%3D&trade_no=2024110822001476540504411933&auth_app_id=9021000141668546&version=1.0&app_id=9021000141668546&sign_type=RSA2&seller_id=2088721048676520&timestamp=2024-11-08+19%3A34%3A06" 19%3A34%3A06"

我们可以看到所有的参数、以及请求

但是,我们发现并没有接收到notify请求、因为我们没有在控制台设置回调地址,并且也是处于本地网络环境,设置了也接收不到。
要想正确收取notify请求就需要在公网环境中部署。

支付宝的沙箱环境支持模拟支付过程,因此可以避免涉及真实交易的风险。你可以在支付宝开放平台的沙箱环境中获取测试用的账户和支付信息。测试时,使用支付宝提供的沙箱账号来模拟支付。

总结

通过本篇学习笔记,我们成功地将支付宝支付集成到了Gin框架中,并在沙箱环境中模拟了支付流程。我们介绍了如何使用支付宝SDK创建支付订单,如何配置回调处理支付结果。集成支付宝支付是电商系统中重要的一部分,本篇笔记为后续功能扩展和真实支付接入打下了基础。接下来,我将继续深入研究其他支付方式的集成与优化,敬请期待。

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

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

相关文章

Docker网络概述

1. Docker 网络概述 1.1 网络组件 Docker网络的核心组件包括网络驱动程序、网络、容器以及IP地址管理&#xff08;IPAM&#xff09;。这些组件共同工作&#xff0c;为容器提供网络连接和通信能力。 网络驱动程序&#xff1a;Docker支持多种网络驱动程序&#xff0c;每种驱动程…

OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示

当打开蓝牙后没有反应时&#xff0c;需要排查蓝牙节点是否对应、固件是否加载成功&#xff0c;本文介绍开源鸿蒙OpenHarmony4.1系统下适配蓝牙的方法&#xff0c;触觉智能SBC3568主板演示 修改对应节点 开发板蓝牙硬件连接为UART1&#xff0c;修改对应的节点&#xff0c;路径为…

QT 如何使QLabel的文字垂直显示

想要实现QLabel文字的垂直显示&#xff0c;可以通过使用“文字分割填充换行符”的方式来实现QLabel文字垂直显示的效果&#xff0c;下面是效果图&#xff1a; 具体实现代码&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow:…

数据结构选择题及答案

一、选择题 1、下列查找方法中&#xff0c;&#xff08; &#xff09;适用于查找有序单链表。 A&#xff0e;分块查找; B&#xff0e;哈希查找; C&#xff0e;顺序查找; D&#xff0e;二分查找; 2、在有n个结点的二叉树的二叉链表表示中&#xff0c;空指针数为( )。 A&#xf…

2024上半年上午30

CPU没有减法器的说法

php实现excel表格数据快速入库

项目场景&#xff1a;大概有一百来份excel表格数据需要整理入库&#xff0c;基础字段一样&#xff0c;如果按照传统的处理方法&#xff0c;需要先整理好数据&#xff08;数据清洗、合并等&#xff09;&#xff0c;并且按照系统导入模板整理出来&#xff0c;费时费力。 需要解决…

【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者

在工业领域&#xff0c;工业风扇的稳定高效运行对于维持良好的生产环境至关重要。而驱动芯片作为工业风扇控制系统的核心元件&#xff0c;其性能直接影响风扇的工作状态。芯麦 GC5931 作为一款新型驱动芯片&#xff0c;在替代 A5931/Allegro 应用于工业风扇中展现出了非凡的优势…

CST案例分析:TLM算法仿真5G毫米波手机天线和整机

5G时代&#xff0c;产品复杂&#xff0c;更新换代快&#xff0c;如何快速仿真不同的设计版本是影响研发效率的关键问题。本期我们用达索系统SIMULIA自己的手机模型来演示5G毫米波的仿真。 &#xff08;图片仅为概念演示&#xff0c;未经达索系统授权不得使用&#xff09; 完整的…

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

【debug】QT 相关问题error汇总

总结一下碰到过的所有问题error以及解决方案 qt的UI更新之后构建后发现没有变化 取消项目中的Shadow build的勾选&#xff0c;作用是取消影子构建&#xff0c;此后构建目录与源码处于同一目录&#xff0c;每次编译更新程序使用的UI文件error: ‘class QWidget’ has no member…

滑动窗口最大值

239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 …

GEE 案例——利用哨兵-2 图像时间序列和谷歌地球引擎云计算自动绘制和监测香港海洋水质参数

目录 简介 结论 代码 结果 APP链接 引用 简介 对沿海水质的持续监测对于水资源管理和海洋生态系统的可持续性至关重要。 遥感数据&#xff08;如哨兵-2 卫星图像&#xff09;可提供用于时间序列分析的高分辨率观测数据&#xff0c;而基于云的谷歌地球引擎&#xff08;GE…

Redis4:Redis的Java客户端

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

基于Java Web的传智播客crm企业管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【Eclipse系列】eclipse安装与常规配置(含插件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、下载与安装 二、常规设置 1.1.设置工作空间(workspace) 1.2.设置字体和字体大小 ​编辑 1.3.设置编码 1.4.去除验证(validation) 1.5.去除单词验证(spelli…

抗辐照MCU芯片工艺解析:如何保障芯片的可靠性

行星探索、轨道飞行器任务和空间研究在内的太空项目需要创新的航天器系统技术提供通信与处理功能。随着商业航天的发展&#xff0c;对于航天电子系统需要考虑高可靠与高性能的同时&#xff0c;还需要考虑降低开发成本和缩短上市时间。 以MCU芯片AS32A401为例&#xff0c;该芯片…

qt QKeySequence详解

1、概述 QKeySequence 是 Qt 框架中的一个类&#xff0c;用于表示和处理键盘快捷键序列。它提供了一种方便的方式来解析、存储和比较键盘快捷键&#xff0c;这些快捷键通常用于触发应用程序中的特定操作或命令。QKeySequence 支持多种格式的快捷键表示&#xff0c;包括单个按键…

【RMA】基于知识注入和模糊学习的多模态歧义分析

abstract 多模态情感分析&#xff08;MSA&#xff09;利用互补的多模态特征来预测情感极性&#xff0c;主要涉及语言、视觉和音频三种模态。现有的多模态融合方法主要考虑不同模态的互补性&#xff0c;而忽略了模态之间的冲突所导致的歧义&#xff08;即文本模态预测积极情绪&…

移动取证和 Android 安全

当今的数字时代已经产生了许多技术进步&#xff0c;无论是智能手机还是虚拟现实、人工智能和物联网 (IoT) 等下一代基础技术。 智能手机已不再只是奢侈品&#xff0c;而是我们生存所必需的东西。根据各种统计数据&#xff0c;如今全球有超过 50% 的人使用手机。 由于数据存储…

【Linux】简易版shell

文章目录 shell的基本框架PrintCommandLineGetCommandLineParseCommandLineExecuteCommandInitEnvCheckAndExecBuildCommand代码总览运行效果总结 shell的基本框架 要写一个命令行我们首先要写出基本框架。 打印命令行获取用户输入的命令分析命令执行命令 基本框架的代码&am…