软件测试银行项目网上支付接口调用测试实例

news2024/10/5 13:02:30

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

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

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

接触过的一个关于银行支付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调用环境和调试支付接口的调用时遇到了一些问题,

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

我想以后每每有点东西都会记录成文,望坚持下去。。

分享就是快乐,大家一起学习进步,一天进步一点,日积月累。。。

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

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

相关文章

每日Leecode算法题:1337.矩阵中战斗力最弱的k行

方法1&#xff1a;暴力破解 class Solution:def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:return sorted([i for i in range(len(mat))], keylambda x:sum(mat[x]))[:k] 方法2&#xff1a;二分查找排序 class Solution:def kWeakestRows(self, ma…

Windows配置ADB工具

一、目的 在进行嵌入式开发时&#xff0c;我们经常使用ADB工具登录到开发板上进行命令操作&#xff0c;本篇我们介绍如何在windows平台配置ADB环境。 二、实战 1.下载adb工具包​​​​​​​https://developer.android.com/studio/releases/platform-tools?hlzh-cnhttps://d…

【Git】Git下载安装环境配置 下载速度慢的解决方案

这里写自定义目录标题 介绍一、下载官网下载镜像站 二、安装安装成功 三、Git三种界面介绍Git cmd界面展示git bash界面展示git GUI界面展示 四、环境配置配置流程1、打开环境变量界面2、添加环境变量 /删除环境变量3、在变量中找到Git\cmd的值就表示配置成功4、没有找到点击新…

在硅云上主机搭建wordpress并使用Astra主题和avada主题

目录 前言 准备 操作 DNS解析域名 云主机绑定域名 安装wordpress网站程序 网站内Astra主题设计操作 安装主题 网站内avada主题安装 上传插件 上传主题 选择网站主题 前言 一开始以为云虚拟主机和云服务器是一个东西&#xff0c;只不过前者是虚拟的后者是不是虚拟的…

编程每日一练(多语言实现)基础篇:阳阳买苹果

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 阳阳买苹果&#xff0c;每个苹果0.8元&#xff0c;阳阳第一天买2个苹果&#xff0c;第二天开始每天买前一天的2倍&am…

双端队列--二叉树 Z 字层序遍历

力扣103题----二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 代码&#xff1a; public L…

遥感数据与作物模型同化:遥感数据、PROSAIL模型、DSSAT模型、参数敏感性分析、数据同化算法、模型耦合

查看原文>>>遥感数据与作物模型同化实践技术应用 基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具&#xff0c;可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系&#xff0c;为不同条件下作物生长发育及…

中国34省区市三维地形图(直接保存)

吉林 ▼ 辽宁 ▼ 北京 ▼ 河北 ▼ 山东 ▼ 山西 ▼ 天津 ▼ 江苏 ▼ 福建 ▼ 上海 ▼ 台湾 ▼ 浙江 ▼ 广东 ▼ 广西 ▼ 海南 ▼ 香港和澳门 ▼ 安徽 ▼ 河南 ▼ 湖北 ▼ 湖南 ▼ 江西 ▼ 甘肃 ▼ 内蒙古 ▼ 宁夏 ▼ 青海 ▼ 陕西 ▼ 新疆 ▼ 贵州 …

基于人脸识别的课堂考勤手机APP

基于人脸识别的课堂考勤手机APP是一款基于虹软人脸识别技术的应用程序&#xff0c;旨在为学校、教育机构等提供快速、高效、准确的考勤服务。该APP需要教师和学生分别注册账号并登录&#xff0c;然后在考勤页面进行签到操作。教师通过APP摄像头对着学生进行采集&#xff0c;并进…

PCL 空间两条直线交点计算

空间两条直线交点计算 效果代码效果 图中绿色点为四条直线交点 代码 pcl::PointXYZget2linePoint(pcl::ModelCoefficients p1, pcl::ModelCoefficients p2) {pcl::PointXYZ result;double x1 =</

D1S板子烧录问题排查过程

1、问题描述 1、按照《03_搭建开发环境与体验第1个程序.md》文档烧录doc_and_source_for_mcu_mpu\D1S\source\02_uart\里的程序&#xff0c;复位后串口打印符号&#xff0c;没有按预期打印&#xff1b; 2、同样的程序&#xff0c;使用gdb进行调试&#xff0c;串口输出打印正常&…

ElasticSearch 学习7 集成ik分词器

网上找了一大堆&#xff0c;很多都介绍的不详细&#xff0c;开始安装完一直报错找不到plugin-descriptor.properties&#xff0c;有些懵这个东西不应该带在里面吗&#xff0c;参考了一篇博客说新建一个这个&#xff0c;新建完可以启动&#xff0c;但是插入索引数据会报错找不到…

【Navicat】win 10 / win 11:Navicat 15 安装完整教程(navicat 连接 mysql 出现 2059 报错问题解决)

目录 一、Navicat 连接 mysql 出现 2059 报错问题解决 二、Navicat 15 的下载 三、Navicat 15 的安装 四、Navicat 15 的使用 一、Navicat 连接 mysql 出现 2059 报错问题解决 之前使用的是完整版本 navicat 12&#xff0c;但是随着 MySQL 的升级&#xff0c;再连接 MySQL…

极智AI | Colossal-AI高效异构内存管理系统

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 Colossal-AI高效异构内存管理系统。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 首先需要了解一下异构内存中的…

新风机注意事项有哪些?

选择和使用新风机时&#xff0c;有几个关键注意事项需要牢记&#xff1a; 安装位置&#xff1a;新风机的安装位置很重要。通常情况下&#xff0c;应将其安装在室外以避免室内产生噪音和减少室内的体积占据。确保选择合适的安装位置&#xff0c;以便新风机能够顺利引入新鲜空气。…

Java——StringBuffer类常用操作示例

Java——StringBuffer类常用操作 package com.yushifu.javaAPI;import java.sql.SQLOutput;//StringBuffer类&#xff08;字符串缓冲区&#xff09; //StringBuffer类与String的区别————StringBuffer的内容和长度都是可以改的 //StringBuffer类似于一个字符容器&#xff0…

【版本控制工具二】Git 和 Gitee 建立联系

文章目录 前言一、Git 和 Gitee 建立联系1.1 任意目录下&#xff0c;打开 git bash 命令行&#xff0c;输入以下命令生成公钥1.2 配置SSH公钥1.3 进行全局配置 二、其它相关Git指令2.1 常用指令2.2 指令操作可能出现的问题 三、补充3.1 **为什么要先commit&#xff0c;然后pull…

【ORACLE】ORA-00972:标识符过长

问题 执行创建表结构sql&#xff0c;提示 ORA-00972&#xff1a;标识符过长&#xff1b; 如图所示&#xff0c;约束名称超过30个字符了 原因 一、11G and before 在使用11G数据库时&#xff0c;经常会遇到报错ORA-00972&#xff0c;原因是因为对象名称定义太长&#xff0c…

为啥Linux内核对驱动调用要绕这么多弯?

为啥Linux内核对驱动调用要绕这么多弯&#xff1f; 需要去写驱动的&#xff0c;基本是芯片原厂的人。其他的linux驱动从业者&#xff0c;只是调试、改设备树、封装库差不多了。需要“不满足照搬框架去写驱动”的人&#xff0c;应该都是通过芯片原厂面试的人&#xff0c;不会来问…

Harmony跨进程通信—IPC与RPC通信开发指导

一、IPC与RPC通信概述 基本概念 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&a…