交通银行网上支付接口调用测试实例

公司最近有一个网站商城项目要开始开发了,这几天老板和几个同事一起开着需求会议,

讨论了接下来的业务规划和需求策略,等技术需求一下来还要讨论技术需求,

确认后再慢慢的进入开发阶段,趁着闲暇时间新造的人想总结一下进入公司不久

接触过的一个关于银行支付API接口的调用,咱是第一次接触这类东西。

以后还是尽量养成写技术生活博客的习惯,工作了4年多,今年才开始想起来应该把自己的工作经历记录成

文,形成经验积累和技术共享,以前很多经历都淡忘了,希望以后能够每每有点思绪就记录下来,时间长了

也是一笔不小的积累和总结(好记性不如烂笔头),总不能工作这么多年一点技术经验积累记录都木有,实

为缺憾哉!(语言组织能力欠佳,还望海涵)

废话有点多,下面是正题:

一、API调用环境与相关配置详细说明;

要在网上支持客户(或商城会员)使用交通银行(BOCOM,交行国际)支付方式买东西,首先公司得与交行

合作,要求其提供支付接口API(一般程序员都知道),等公司拿到API之后需要按照银行API要求调用的环

境安装一些软件(一般是由银行提供API安装包)以及配置各种参数:

从银行拿到的API安装包:

图1(图中start.bat文件是后来加的,具体作用后面会做说明)

各文件夹简要说明(我直接从doc文件夹里的技术开发说明文档拷贝过来的):

  • cert 提供商户端测试环境的商户测试证书、银行端测试环境测试根证书及    银行端生产环境根证书;
  • demo 存放交易演示Asp页面文件,商户可参照demo中的页面进行编程开发;起始页面:Index.htm;
  • doc 存放开发编程说明文档;
  • icon 交通银行logo徽标
  • ini 商户端API配置文件,API初始化需指定该配置文件,配置文件内容包含地址的指定、证书的指定及日志存放目录
  • 指定等。
  • setup 存放API的安装文件。
  • lib     提供商户编程API所需全部 DLL 文件 ;

里面会有一个安装说明(如上图的简要说明.txt),打开后内有详细API安装及环境参数配置说明:

图2

相信以上图片中白纸黑字大家都能看懂,我为大家更详细介绍下

(上图所示文本中提到的 文档 是指由交行提供的另一个技术开发指导文档,放在doc文件夹里):

注:以下各种安装配置是配置的通用版的测试环境,网上有下载的,正式调用只需修改相关配置参数即可;

1.首先在网上下载最新版本jdk,安装java运行环境

图3

(根据自己电脑的情况选择合适版本的java运行环境,我电脑是64位系统);

2.C盘新建文件夹commjava

(可自定义,但要和后面相关参数的配置一致,不知道可不可以装在别的盘,待我后期测试再看看补起来),

将上图1中ini、cert文件夹复制进去;

3.将已经拷过去的文件夹cert中的证书文件(PFX文件)打开进行安装导入到浏览器

(支付的时候需要验证是否安装了交行提供的证书,否则无法支付,交行也会返回相关验证信息):

图4

一直点“下一步”直到填写密码处,默认密码是:12345678,再继续点“下一步”直到完成,

导入成功以后可以在浏览器中看到(Internet选项→内容→证书):

图5

4.将之前安装包里的lib文件夹下所有的文件都拷到之前安装的jdk目录 Java\jre7\lib\ext 下,

同时也要复制一份拷到之前commjava文件夹下(需先在commjava文件夹下新建lib目录),

或者干脆把整个lib文件夹拷进去,

并在commjava文件夹新建名为logsettlement的文件夹

(其中log用来存放下面提到的bat文件执行日志);

5.在任何一个文件夹新建一个.bat 批处理文件并执行

(图中我是新建在安装包目录下,其实只要内容编辑正确放哪里都可以,内容编辑按照你之前安装的目录自行修改),

编辑内容如下:

java -jar C:\bocommjava\lib\socket_c#.jar 8080 C:\bocommjava\ini\B2CMerchant.xml C:\bocommjava\log\socket.log

这里采用8080端口,命令大致意思是:执行该批处理命令会调用jar包,读取xml配置信息,

返回执行结果日志并在log目录下生成日志文件(与执行结果日志一致)。

注:该批处理文件打开后就不要关闭,以后测试接口调用就是以这个为基础,关掉后会无法调用;

笔者注:这么一路配置下来总感觉网上银行支付接口的调用环境配置都是银行自己定义死了

(下面的页面调用很多配置也是定死的。。。),

只要有一个地方配置错误后面调用就会有问题。

二、页面调用详细说明;

以上的准备工作做好后,就可以在页面前后台代码中进行相关调用了。

1.前台配置:交行支付接口报文验证很严格,报文中不能有其他任何规定之外的参数存在,不然就会因验签失败而出错

所以页面提交的时候,一个form是不够的,一个form用来放除支付接口所需参数外的所有页面控件HTML代码,

另一个form用来专门提交支付接口所需参数:

(1)第一个form:

1 <form id="form1" runat="server">
2 <!--除支付接口所需参数外的所有页面控件HTML代码比如选择银行的控件,确认支付按钮等-->
3 </form>

(2)第二个form:

(注:以下各个参数安装包的开发文档中都有说明。每个参数具体注释请见后面的后台代码注释)

 1 <form id="form2" name="form2" method="post" action="<%=orderUrl %>">
 2     <input type="hidden" name="interfaceVersion" value="<%=interfaceVersion%>" />
 3     <input type="hidden" name="merID" value="<%=merID%>" />
 4     <input type="hidden" name="orderid" value="<%=orderid%>" />
 5     <input type="hidden" name="orderDate" value="<%=orderDate%>" />
 6     <input type="hidden" name="orderTime" value="<%=orderTime%>" />
 7     <input type="hidden" name="tranType" value="<%=tranType%>" />
 8     <input type="hidden" name="amount" value="<%=amount%>" />
 9     <input type="hidden" name="curType" value="<%=curType%>" />
10     <input type="hidden" name="orderContent" value="<%=orderContent%>" />
11     <input type="hidden" name="orderMono" value="<%=orderMono%>" />
12     <input type="hidden" name="phdFlag" value="<%=phdFlag%>" />
13     <input type="hidden" name="notifyType" value="<%=notifyType%>" />
14     <input type="hidden" name="merURL" value="<%=merURL%>" />
15     <input type="hidden" name="goodsURL" value="<%=goodsURL%>" />
16     <input type="hidden" name="jumpSeconds" value="<%=jumpSeconds%>" />
17     <input type="hidden" name="payBatchNo" value="<%=payBatchNo%>" />
18     <input type="hidden" name="proxyMerName" value="<%=proxyMerName%>" />
19     <input type="hidden" name="proxyMerType" value="<%=proxyMerType%>" />
20     <input type="hidden" name="proxyMerCredentials" value="<%=proxyMercredentials%>" />
21     <input type="hidden" name="netType" value="<%=netType%>" />
22     <input type="hidden" name="merSignMsg" value="<%=merSignMsg%>" />
23     <input type="hidden" name="issBankNo" value="<%=issBankNo%>" />
24     </form>

(3).表单提交的js:

    <script language="javascript" type="text/javascript">
        function submitForm(form) {
            setTimeout(function () {
                $(form).submit();
            }, 0);
        }
    </script>

2.后台代码

(1)网关传输参数初始化:

 1 #region 交行网关传输参数
 2 public string interfaceVersion = "1.0.0.0";                    /*消息版本号,固定为1.0.0.0*/
 3 public string orderid = DateTime.Now.ToString("yyyyMMddHHmmss");                          /*订单号,商户应保证3个月以上的唯一性*/
 4 public string orderDate = DateTime.Now.ToString("yyyyMMdd");   /*商户订单日期,格式:yyyyMMdd*/
 5 public string orderTime = DateTime.Now.ToString("HHmmss");     /*商户订单时间,格式:HHmmss*/
 6 public string tranType = "0";                                  /*交易类别 0  B2C*/
 7 public string amount = "1";                                 /*订单金额,单位:元并带两位小数15位整数+2位小数*/
 8 public string curType = "CNY";                                 /*订单币种, 人民币 CNY*/
 9 public string orderContent = string.Empty;                     /*商家填写的其他订单信息,在个人客户页面显示*/
10 public string orderMono = "6222600110030037084";               /*不在个人客户页面显示的备注,但可在商户管理页面上显示*/
11 public string phdFlag = string.Empty;                          /*物流配送标志:0-非物流 ,1-物流配送*/
12 public string notifyType = "1";                                /*通知方式:0-不通知,1-通知,2-转页面*/
13 public string jumpSeconds = string.Empty;                      /*自动跳转时间,等待n秒后自动跳转取货URL;若不填写则表示不自动跳转*/
14 public string payBatchNo = string.Empty;                       /*商户批次号,商家可填入自己的批次号,对账使用*/
15 public string proxyMerName = string.Empty;                     /*代理商家名称,二级商户编号/或证件号码*/
16 public string proxyMerType = string.Empty;                     /*代理商家证件类型*/
17 public string proxyMercredentials = string.Empty;              /*代理商家证件号码*/
18 public string netType = "0";                                   /*渠道编号,固定填0:(html渠道)*/
19 public string issBankNo = "BOCOM";                            /*发行卡机构号*/
20 public string merURL = "";                                 /*主动通知URL,为空则不发通知*/
21 public string goodsURL = "../PayRuslut/COMMPayReslut.aspx";     /*取货URL,显示商户最终订单支付结果信息,为空则不显示按钮,不自动跳转*/
22 public string merSignMsg = string.Empty;              /*发行卡机构号*/
23 public string merID = "301310063009501";              /*网上支付授权码,也就是上面导入的那个证书编号*/
24 public string tranCode = "cb2200_sign";               /*交易编号*/
25 public string orderUrl = string.Empty;               /*订单最终的提交地址,需要从xml配置文件里获取*/
26 #endregion

(2).把安装包里的demo文件下:C#\netpay\App_Code 的 config.cs 文件拷贝到系统界面层,

修改其命名空间及其类名即可,或者在你自己的代码中添加也可以,只要能够供后面调用即可;

这个类的完整代码如下:

 1 using System;
 2 using System.Data;
 3 using System.Configuration;
 4 
 5 using System.Web;
 6 using System.Web.Security;
 7 using System.Web.UI;
 8 using System.Web.UI.HtmlControls;
 9 using System.Web.UI.WebControls;
10 using System.Web.UI.WebControls.WebParts;
11 
12 using System.Net.Sockets;
13 
14 /// <summary>
15 ///config 的摘要说明
16 ///配置的系统参数和通讯方法示例
17 ///
18 /// </summary>
19 public class config
20 {
21     //商户号,就是前面导入进去的那个证书编号
22     public static string merchantID = "301310063009501";
23     //socket bridge通讯ip,测试环境一般是本地,正式生产环境中需要修改
24     public static string ip = "127.0.0.1";
25     //socket bridge端口
26     public static int port = 8080; 
27 
28     public config()
29     {
30         
31     }
32 
33     //与socket bridge通讯的方法示例
34     public string sendAndReceive(string sendMsg)
35     {
36         TcpClient client = new TcpClient(config.ip, config.port);
37         NetworkStream stream = client.GetStream();
38 
39         Byte[] data = System.Text.Encoding.UTF8.GetBytes(sendMsg.ToString());
40         stream.Write(data, 0, data.Length);
41         data = new Byte[50 * 1024];
42         String responseData = String.Empty;
43         Int32 bytes = stream.Read(data, 0, data.Length);
44         responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes);
45         stream.Close();
46         client.Close();
47         return responseData;
48     }
49 }

(3).在支付提交的方法里加入如下代码:

  #region 交行支付网关
                    orderid = DateTime.Now.ToString("yyyyMMddHHmmss");                               /*订单号,商户应保证3个月以上的唯一性*/
                    amount = _CountPayMoney.ToString("F2");          /*订单金额,单位:元并带两位小数15位整数+2位小数*/
                    merID = config.merchantID;/*获取证书编号*/
                    string issuerId = IssUserID;/*银行代码,交行为bocom*/
                    Random ro = new Random();
                    string orderDatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    int orderAmount = Convert.ToInt32(Convert.ToDouble(_CountPayMoney.ToString("F2")) * 100);
                    string ext1 = OrderID + "&" + "0";
                    string ext2 = VIPID.ToString();//会员帐号

                    //拼接商户订单支付所需信息字符串
                    orderMono = _payType + "_" + issuerId + "_" + orderAmount + "_" + ext1 + "_" + ext2 + "_" + orderDatetime;
                    string sourceMsg = interfaceVersion + "|" + merID + "|" + orderid + "|" +

    orderDate + "|" + orderTime + "|" + tranType + "|" + amount + "|" + curType + "|" +

    orderContent + "|" + orderMono + "|" + phdFlag + "|" + notifyType + "|" + merURL + "|" +

    goodsURL + "|" + jumpSeconds + "|" + payBatchNo + "|" + proxyMerName + "|" + proxyMerType +

    "|" + proxyMercredentials + "|" + netType;

                    StringBuilder sendMsg = new StringBuilder("");

                    //组织申请报文
                    sendMsg.Append("<Message>")
                           .Append("<TranCode>").Append(tranCode).Append("</TranCode>")
                           .Append("<MsgContent>")
                           .Append(sourceMsg)
                           .Append("</MsgContent></Message>");

                    string responseData = new config().sendAndReceive(sendMsg.ToString());

                    //解析返回报文
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.LoadXml(responseData);
                    XmlNodeList list = xmlDoc.GetElementsByTagName("retCode");
                    string retCode = list.Item(0).InnerText.Trim();

                    list = xmlDoc.GetElementsByTagName("errMsg");
                    string errMsg = list.Item(0).InnerText.Trim();

                    list = xmlDoc.GetElementsByTagName("signMsg");
                    merSignMsg = list.Item(0).InnerText.Trim();

                    list = xmlDoc.GetElementsByTagName("orderUrl");
                    orderUrl = list.Item(0).InnerText.Trim();

                    if (!retCode.Equals("0"))
                    {
                        Response.Write("交易返回码:" + retCode + "<br>");
                        Response.Write("交易错误信息:" + errMsg + "<br>");
                    }
                    else
                    {
                        //提交
                        ClientScript.RegisterStartupScript("".GetType(), "", "<script language=\"javascript\" type=\"text/javascript\">submitForm('#form2');</script>");
                    }
                    #endregion            

(4)银行返回支付结果后系统进行处理的代码:

需新建一个支付结果接收页面,也就是上面配置的取货URL参数goodsURL里的aspx页面。

在页面加载的时候调用:

        protected void Page_Load(object sender, EventArgs e)
        {
            PayResult();
        }

  1         /// <summary>
  2         /// 支付返回结果
  3         /// </summary>
  4         private void PayReslut()
  5         {
  6             string tranCode = "cb2200_verify";
  7             string notifyMsg = Request.Params.Get("notifyMsg");
  8 
  9             StringBuilder sendMsg = new StringBuilder("");
 10             //sendMsg.Append("<?xml version='1.0' encoding='UTF-8'?>")
 11             //组织申请报文
 12             sendMsg.Append("<Message>")
 13                    .Append("<TranCode>").Append(tranCode).Append("</TranCode>")
 14                    .Append("<MsgContent>")
 15                    .Append(notifyMsg)
 16                    .Append("</MsgContent></Message>");
 17 
 18             TcpClient client = new TcpClient(config.ip, config.port);
 19             NetworkStream stream = client.GetStream();
 20 
 21             Byte[] data = System.Text.Encoding.UTF8.GetBytes(sendMsg.ToString());
 22             stream.Write(data, 0, data.Length);
 23             data = new Byte[50 * 1024];
 24             String responseData = String.Empty;
 25             Int32 bytes = stream.Read(data, 0, data.Length);
 26             responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes);
 27             stream.Close();
 28             client.Close();
 29 
 30             //解析返回报文
 31             XmlDocument xmlDoc = new XmlDocument();
 32             xmlDoc.LoadXml(responseData);
 33             XmlNodeList list = xmlDoc.GetElementsByTagName("retCode");
 34             string retCode = list.Item(0).InnerText.Trim();
 35             list = xmlDoc.GetElementsByTagName("errMsg");
 36             string errMsg = list.Item(0).InnerText.Trim();
 37 
 38             if (!retCode.Equals("0"))
 39             {
 40                 //支付失败
 41                 PayReslutShowH3.InnerHtml = "当前订单本次支付失败!";
 42                 PayReslutShowH3.Attributes.Add("class", "paySuccess_p1F");
 43             }
 44             else
 45             {
 46                 //支付成功
 47                 string[] strs = notifyMsg.Split('|');
 48                 string[] orderMono = Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(strs[16])).Split('_');
 49                 decimal PayMoney = Convert.ToDecimal(strs[2]);//获得支付的钱
 50                 decimal OrderMoney = (Convert.ToDecimal(orderMono[2]) / 100);//获得订单钱
 51                 orderIDSpan.InnerHtml = strs[1];//显示交行支付的订单号
 52                 PayMoneySpan.InnerHtml = PayMoney.ToString("F2");//显示本次支付的钱
 53                 string[] _ext1 = orderMono[3].Split('&');
 54                 string PayType = _ext1[1];//获得支付类型 0=订单,1=充值,2=还款 3=团购订单 4=续费
 55                 string OrderID = _ext1[0];//订单号:订单支付的时候才会有
 56                 int VipID = int.Parse(orderMono[4]);//会员ID号码
 57                 //BLL.HSSM_LinPayLog.Exists(paymentResult.getPaymentOrderId())
 58                 if (HSSM_Public_DB.IsRecord("HSSM_LinPayLog", "paymentOrderId='" + OrderID + "'"))/*判断是否重复支付,根据支付的订单号进行判断*/
 59                 {
 60                     PayReslutShowH3.InnerHtml = "当前订单已经支付成功!";
 61                     return;
 62                 }
 63                 if (PayMoney <= 0)
 64                 {
 65                     Response.Redirect("~/NullData.html");
 66                     return;
 67                 }
                    #region 系统接收支付结果返回成功结果进行扣款操作
            //相关代码略,依据系统需求而定,可能调用发送订单回执短信、邮件等
            #endregion
256             }
257         }

好了,至此,所有的相关配置以及代码就介绍完了。

以上所有的过程都是按照成功运行之后回头总结的,其实在配置API调用环境和调试支付接口的调用时遇到了一些问题,

通过技术主管跟银行方面沟通以及主管和自己的不断调试运行,最终支付接口的调用才成功,银行那边也返回了各种消息。

2024最新Jmeter接口测试从入门到精通(全套项目实战教程)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)

C语言中常用的字符串函数 文章目录 C语言中常用的字符串函数1 strlen函数2 sizeof函数2.1 sizeof介绍2.2 sizeof用法 3 sscanf函数3.1 sscanf介绍3.2 sscanf用法3.3 sscanf高级用法 4 sprintf函数4.1 背景4.2 sprintf用法 5 strcpy函数5.1 strcpy介绍5.1 strcpy用法 1 strlen函…

算法第十四天-删除有序数组中的重复项

删除有序数组中的重复项 题目要求 解题思路 双指针 左指针确定不重复值&#xff0c;右指针遍历数组 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:left0for right in range(1,len(nums)):if nums[left] ! nums[right]:left 1nums[left] nu…

【问题】SpringBoot项目中log4j与logback的Jar包冲突问题

这篇文章主要给大家介绍了解决SpringBoot项目中log4j与logback的Jar包冲突问题,文中有详细的解决方法和冲突的原因。 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/lx/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/sl…

【工具】推荐一个好用的代码画图工具

PlantUML 官网地址&#xff1a;https://plantuml.com/zh/ 跳转 支持各种结构化数据画图支持代码调用jar包生成图片 提供在线画图能力 https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 有兴趣可以尝试下 over~~

20.Activity跳转时的参数传递

(1).如何传递数据 (2).如何接收数据 (3).如何回传数据

消息队列-RockMQ-批量收发实践

批量收发实战 发送消息是需要网络连接的如果我们单条发送吞吐量可能没有批量发送好。剖来那个发送可以减少网络IO开销&#xff0c;但是也不能一批次发送太多的数据&#xff0c;需要根据每条消息的大小和网络带宽来确定量的数目。 比如网络带宽为可以支持一次性发送8M的数据包&…

工业异常检测AnomalyGPT-Demo试跑

写在前面&#xff1a;如果你有大的cpu和gpu可以使用&#xff0c;直接根据官方的安装说明就可以&#xff0c;如果没有&#xff0c;可以点进来试着看一下我个人的安装经验。 一、试跑环境 NVIDIA4090显卡24g,cpu内存33G&#xff0c;交换空间8g,操作系统ubuntu22.04(试跑过程cpu…

OCP NVME SSD规范解读-5.命令超时限制

在"4.7 Command Timeout"章节中&#xff0c;详细定义了NVMe命令的超时要求和限制。 CTO-1&#xff1a;NVMe管理命令和TCG&#xff08;可信计算组&#xff09;命令从提交到完成不应超过10秒&#xff0c;且没有其他命令未完成&#xff08;QD1&#xff09;。CTO-1不适用…

九州金榜|家庭教育小技巧如何培养优秀孩子

信任和期望可以激发孩子的智商和能力&#xff0c;孩子是否出色&#xff0c;取决于家长们如何去“套路”去“培养”。 优秀的孩子不是逼出来的&#xff0c;而是被父母套路出来的&#xff0c;引导孩子找到自我价值感&#xff0c;才是家庭教育中最重要的一课&#xff01; 曾经看…

Python自动化办公之PDF拆分

今天我们继续分享真实的自动化办公案例&#xff0c;希望各位 Python 爱好者能够从中得到些许启发&#xff0c;在自己的工作生活中更多的应用 Python&#xff0c;使得工作事半功倍&#xff01; 需求 需要从 PDF 中取出几页并将其保存为新的 PDF&#xff0c;为了后期使用方便&a…

21. Mysql 事件或定时任务,解放双手,轻松实现自动化

文章目录 概念常见操作事件调度器操作查看事件创建事件删除事件启动与关闭事件 精选示例构造实时数据定时统计数据 总结参考资料 概念 Mysql 事件是一种在特定时间点自动执行的数据库操作&#xff0c;也可以称呼为定时任务&#xff0c;它可以自动执行更新数据、插入数据、删除…

FileStream文件管理

文件管理 FileStream&#xff1a;是一个用于读写文件的一个类。它提供了基于流的方式操作文件&#xff0c;可以进行读取、写入、查找和关闭等操作。 第一个参数&#xff1a;path&#xff08;路径&#xff09; 相对路径&#xff1a;相对于当前项目的bin目录下的Debug和Realse来…

金蝶EAS pdfviewlocal 任意文件读取漏洞复现

0x01 产品简介 金蝶EAS 为集团型企业提供功能全面、性能稳定、扩展性强的数字化平台&#xff0c;帮助企业链接外部产业链上下游&#xff0c;实现信息共享、风险共担&#xff0c;优化生态圈资源配置&#xff0c;构筑产业生态的护城河&#xff0c;同时打通企业内部价值链的数据链…

Android Matrix (三)矩阵组合和应用变换

在 Android 开发中&#xff0c;Matrix 类不仅提供了 mapPoints 方法来变换点坐标&#xff0c;还提供了多种其他用法&#xff0c;使其成为处理图像和视图变换的强大工具。以下是 Matrix 类的一些关键用法&#xff1a; 1. 变换方法 setTranslate(float dx, float dy): 设置矩阵…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下&#xff0c;打开音乐播放器&#xff0c;然后打开一个.mp3文件&#xff0c;就可以实现播放了&#xff0c;那么在Qt/QML中如何实现呢&#xff1f;首先所有的设计都是基于音乐播放器的&#xff0c;嵌入式linux下同样也有音乐播放器&#xff0c;比如mplayer。其调用方法…

用通俗易懂的方式讲解:2024 检索增强生成技术(RAG)研究进展

本篇内容1w字左右&#xff0c;稍微有点长&#xff0c;相对不容易理解&#xff0c;喜欢可以收藏、关注、点赞。 一、前言 在过去的一两年里&#xff0c;人工智能领域目睹了检索增强生成技术&#xff08;RAG&#xff09;的迅猛发展&#xff0c;这种技术结合了强大的语言模型与信…

Tracert 与 Ping 程序设计与实现(2024)

1.题目描述 了解 Tracert 程序的实现原理&#xff0c;并调试通过。然后参考 Tracert 程序和计算机网络教材 4.4.2 节&#xff0c; 计算机网络 课程设计指导书 2 编写一个 Ping 程序&#xff0c;并能测试本局域网的所有机器是否在线&#xff0c;运行界面如下图所示的 QuickPing …

基于深度学习的PCB板缺陷检测系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5 yolov5主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM、CA等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主…

linux执行.sh文件出现问题--排查以及解决

阿丹问题描述&#xff1a; 今天在运行.sh文件的时候出现 现象1&#xff1a; 现象2&#xff1a; 现象3&#xff1a; 出现这三种问题 问题解释以及问题排查&#xff1a; 现象1&#xff1a; 排查&#xff1a; 1、判断文件是否存在 2、判断权限是否足够 解决&#xff1…

【AI视野·今日Sound 声学论文速览 第四十二期】Fri, 5 Jan 2024

AI视野今日CS.Sound 声学论文速览 Fri, 5 Jan 2024 Totally 10 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers PosCUDA: Position based Convolution for Unlearnable Audio Datasets Authors Vignesh Gokul, Shlomo Dubnov深度学习模型需要大量干净的…