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

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

公司最近有一个网站商城项目要开始开发了,这几天老板和几个同事一起开着需求会议,讨论了接下来的业务规划和需求策略,等技术需求一下来还要讨论技术需求,确认后再慢慢的进入开发阶段,趁着闲暇时间想总结一下进入公司不久接触过的一个关于银行支付API接口的调用,咱是第一次接触这类东西。

以后还是尽量养成写技术生活博客的习惯,工作了4年多,今年才开始想起来应该把自己的工作经历记录成文,形成经验积累和技术共享,以前很多经历都淡忘了,希望以后能够每每有点思绪就记录下来,时间长了也是一笔不小的积累和总结(好记性不如烂笔头),总不能工作这么多年一点技术经验积累记录都木有,实为缺憾哉!(语言组织能力欠佳,还望海涵)

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

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

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

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

从银行拿到的API安装包:

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

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

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

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

相信以上图片中白纸黑字大家都能看懂,我为大家更详细介绍下(上图所示文本中提到的 文档 是指由交行提供的另一个技术开发指导文档,放在doc文件夹里):

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

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

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

2.C盘新建文件夹commjava

(可自定义,但要和后面相关参数的配置一致,不知道可不可以装在别的盘,待我后期测试再看看补起来),将上图1中ini、cert文件夹复制进去;

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

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

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

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

4.将之前安装包里的lib文件夹下所有的文件都拷到之前安装的jdk目录 Java\jre7\lib\ext 下,同时也要复制一份拷到之前commjava文件夹下(需先在commjava文件夹下新建lib目录),或者干脆把整个lib文件夹拷进去,并在commjava文件夹新建名为log和settlement的文件夹(其中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             else45             {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.rhkb.cn/news/486352.html

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

相关文章

软体机器人动态手内笔旋转研究

人工智能咨询培训老师叶梓 转载标明出处 软体机器人因其在安全互动方面的优势而备受关注&#xff0c;但在高速动态任务中却面临挑战。最近&#xff0c;卡内基梅隆大学机器人研究所的研究团队提出了一种名为SWIFT的系统&#xff0c;旨在通过学习和试错来实现软体机器人手的动态…

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…

二叉树的深搜(不定期更新。。。。。)

二叉树的深搜 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉…

# 深入浅出 快速认识JAVA常用数据结构【栈, 队列, 链表, 数组】

快速认识JAVA常用数据结构【栈, 队列, 链表】 前言 什么是数据结构 一种用来存储和组织数据的方法&#xff0c;描述了数据之间的关系和操作方式。通过合理选择和使用数据结构&#xff0c;可以大幅提高程序的运行效率、存储效率以及代码可维护性。 数据结构的重要性 数据结构…

负载均衡OJ项目中遇到的问题

1、续行符问题 关于换行符 &#xff0c;代码在使用了换行符后无法编译文件&#xff0c;也没有爆出任何错误&#xff0c;更没有按照我们的代码打印出如下类似内容 &#xff1a;[ERROR][compiler.hpp][66][1732635247]编译失败,没有形成可执行程序 随机排查才发现。 代码中的 \ …

android编译assets集成某文件太大更新导致git仓库变大

不知道大家有没有类似的困扰&#xff0c;你的工程assets文件过大&#xff0c;我曾经在某度车机地图团队工作过一段时间时候&#xff0c;每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后&#xff0c;你会发现你如果重新git clone这个仓库会非常大…

关闭windows11的“热门搜索”

win10搜索栏热门搜索怎么关闭&#xff1f;win10搜索栏热门搜索关闭方法分享_搜索_onecdll-GitCode 开源社区 注册表地址是&#xff1a;计算机\HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\ 最后效果如下&#xff1a;

【数字电路与逻辑设计】实验五 4人表决器

文章总览&#xff1a;YuanDaiMa2048博客文章总览 【数字电路与逻辑设计】实验五 4人表决器 一、实验内容二、设计过程&#xff08;一&#xff09;设置变量&#xff08;二&#xff09;真值表&#xff08;三&#xff09;表达式 三、源代码&#xff08;一&#xff09;代码说明&…

Yeeco成长型一体化数智赋能平台:科技矩阵重塑企业数字生态

随着科技的飞速发展&#xff0c;我们正在步入一个被称为“数智化时代”的新时代。在这个时代中&#xff0c;数据处理和分析的能力被提升到一个前所未有的高度&#xff0c;而这种变化背后的重要推动力量就是各种新兴的技术趋势。 为了在激烈的市场竞争中脱颖而出&#xff0c;Yee…

PlantUML——类图

背景 类图是UML模型中的静态视图&#xff0c;其主要作用包括&#xff1a; 描述系统的结构化设计&#xff0c;显示出类、接口以及它们之间的静态结构和关系。简化对系统的理解&#xff0c;是系统分析与设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据。 在U…

LabVIEW热阻炉温度控制

在工业自动化和控制系统领域&#xff0c;温度的精确控制对于保障生产过程的稳定性和产品质量非常重要。热阻炉作为一个典型的受控对象&#xff0c;其温度控制系统的设计和实现涉及多个技术层面&#xff0c;包括硬件选择、控制策略的设计以及软件的实现。项目使用LabVIEW软件开发…

MongoDB在自动化设备上的应用示例

发现MongoDB特别适合自动化检测数据的存储。。。 例如一个晶圆检测项目&#xff0c;定义其数据结构如下 #pragma once #include <vector> #include <QString> #include <QRectF> #include <string> #include <memory>class tpoWafer; class tp…

day04-产品原型-学习计划

1. 分析整体业务流程 2. 提交学习记录-接口 2.1 需求 在课程学习页面播放视频时或考试后&#xff0c;需要提交学习记录到服务器保存&#xff0c;如用户播放视频的进度、学过的章节等。 2.1 接口详情 请求方式&#xff1a;POST 请求路径&#xff1a;/learning-record 请求…

基于Matlab的卷积神经网络(CNN)苹果分级检测系统

本研究提出了一种基于卷积神经网络&#xff08;CNN&#xff09;的自动化苹果分级系统&#xff0c;该系统根据苹果的视觉特征进行分类。系统采用了预训练的深度学习模型&#xff0c;使用包含不同等级苹果的图像数据集进行训练。研究方法包括图像预处理、特征提取和苹果等级分类。…

MySQL内置函数学习

引言 MySQL内置函数是MySQL数据库系统提供的预定义函数&#xff0c;用于执行特定的操作&#xff0c;如数学计算、字符串处理、日期和时间操作等。这些函数极大地简化了SQL语句的编写&#xff0c;提高了数据库操作的效率。 MySQL内置函数分类 MySQL内置函数可以大致分为以下几…

小程序入门学习(四)之全局配置

一、 全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; pages&#xff1a;记录当前小程序所有页面的存放路径 window&#xff1a;全局设置小程序窗口的外观 tabBar&#xff1a;设置小程序底部的 tabBar 效…

【Web】AlpacaHack Round 7 (Web) 题解

Treasure Hunt flag在md5值拼接flagtxt的文件里&#xff0c;如 d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t 访问已经存在的目录状态码是301 访问不存在的目录状态码是404 基于此差异可以写爆破脚本 这段waf可以用url编码绕过 做个lab …

android studio 读写文件操作(应用场景三)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;filesaveandread 其实我写这个都是我记录我要做后个数独小游戏&#xff0c;每一个都是为了解决一个问题。即是分享也是备忘&#xff0c;反正我什么都不会&#xff0c;就是一顿瞎改&#xff0c;不行就研究。这…

c++:timer

1.设置休眠时间sleep_for 添加头文件 #include <thread> #include <iostream> #include <chrono> #include <thread>int main(int argc, char const *argv[]) {// 休眠2秒std::this_thread::sleep_for(std::chrono::seconds(2));// 休眠500毫秒std:…