作为测试,你了解第三方支付吗?

Hi,大家好,我是CoCo。

在很多平台都是调用第三方支付平台,比如支付宝,微信,银联电子支付等。你是否真的了解第三方支付呢?

大家每天在使用支付宝时,是不是感觉很蛮简单的?不外乎就是绑个卡,验一下支付密码,银行卡的资金就被扣掉了。

但是背后涉及的技术架构其实很复杂,比如从外部合作来说,涉及到银行,银联,网联,商户,用户,公安,电信运营商,安全防控公司,服务器运营商等等。

如果从具体业务来说,大致分成入金类业务,出金类业务,清算对账类业务,差错处理类业务。支付业务涉及的方方面面很多,技术架构其实较复杂。

今天,给大伙介绍第三方支付。

第三方支付介绍

1

第三方支付步简介

第三方支付,是一些具备实力和信誉保障的第三方独立机构提供的交易支付平台。买方选购了商品后,使用第三方平台进行付款,由第三方通知卖家货款到达。

目前市面上支持第三方支付的平台有很多,商家通过和第三方签署协议,并获得一个账号,协议生效后,支付平台为商家开通支付功能,通过程序将接口集成到网站中。

使用第三方支付可以统一资源,商家可以很容易的实现与几乎所有种类的银行实现交易服务。

alipay_config.php文件分析:我们需要将支付宝后台获取的PID与Key写入到配置文件中。

2345678 $partner    ="---"."86754233"  合作伙伴ID $security_code='u3e'guirpffcib7''安全验证码 $_input_charset="utf-8"  字符编码格式 $sign_type='MD5'  加密方式 $transport="http" 访问模式 $notify_url  支付通知地址 $return_url  返回地址 $show_url   商品展示地址

3

支付结果返回地址

支付结果页面是用户支付完成后,支付宝会请求该地址:$notify_url 这里是向支付宝服务器请求,这个url是以http开头的完整格式路径,然后根据数据库脚本创建一张表,根据数据的配置更改mysql_config.php 通过对支付宝提供的demo修改。

在后台会有一张订单表:id、goods_id、 goods_name、email、status这几个字段。

实际工作中应用第三方支付

1

工作流程

平台需要接入第三方,首先微信/支付宝等第三方支付平台会提供一个商户的技术接口文档,里面包括充值,查询,退款,对账各个接口的详细参数和返回值。并完成如下工作:

1.将订单信息(订单号,时间,金额,商户号等等)通过接口的形式传给第三方。

2.页面会跳转到第三方链接页面去进行支付。

3.支付完成后第三方会给到支付结果。

4.根据支付结果同步订单状态接入第三方支付具体是接口方面的一些开发,应双方约定好资金流向的话,在平台账务体系中,第三方应作为一个补款渠道方,补款成功后资金流向不变结算的话,是和第三方进行结算,一般是T+1日对账完成后进行结算退款的问题要看你的需求了,是自动退款(订单失败后自动退款)还是人工退款(用户或者工作人员发起退款)第三方给的接口文档中都有退款接口,详细看看就行了,一般也是将原订单信息给到第三方后发起退款,账务回滚,退款对账。

2

第三方支付测试点

(1) 正常场景验证

1.测试环境使用大金额、小金额( 0.01 元)测试,检查使用正确参数能否正确调用第三方接口,各个字段值是否正确;

2.上线前,可以向公司申请备用金,去做一笔大额支付,或者做完大额支付并且检查各项信息正确无误后,调用退款接口或者在系统上直接退款;

3.不论支付还是退款,都会有对应的查询接口,可以在数据库中核对各个字段,也可以通过后台直接在页面看订单信息;

4.对账差错处理;

5.支付成功后,检查第三方系统返给我们的值是否正确;

(2) 异常场景验证

1.使用错误的参数,修改每个需要上送的字段为错误的值看能否请求第三方接口下单;

2.退款时使用错误信息,能否请求到第三方接口进行退款;

3.超过单笔限额和单日限额;

4.支付失败订单补单等等

5.唤醒第三方页面后,能否做取消操作;

6.重复支付会第三方是否提示;

7.通过篡改第三方响应数据,我方能否接到正常处理;

8.例如遇到订单超时、第三方渠道故障,我司是否有监控报警机制;

9.非功能验证(弱网、安全、兼容测试);

以上就是今天的全部内容,希望对大家有所帮助,欢迎补充。希望大家多多留言、点赞、在看、转发四连爱❤️ 支持。 咱们下篇文章见,Bye~?

以上

That‘s all

本文转载于网络 如有侵权请联系删除

相关文章

  • Ontrack EasyRecovery数据恢复软件有那些功能?

    电脑上的数据不小心删除了或者是电脑坏掉数据遗失想要找回就得使用数据恢复工具,易恢复OntrackEasyRecovery15绿色版下载后打开即用,轻松操作,快速恢复电脑上的各项数据。我们用的最多的就是这个数据恢复,其他的功能有兴趣的朋友自己可以看一下。数据恢复点一下进来之后有好几个选项,各项功能基本上都差不多,这个原始恢复是最彻底的恢复,如果其他恢复选项效果不佳的话,就要用这个原始恢复。格式化恢复就是操作电脑的时候把硬盘格式化了,用这个恢复删除恢复就是说如果把硬盘数据右键删除清空回收站,可以用这个如果要恢复数据就用原始恢复,这个效果比较好好点一下。点一下原始恢复,点完之后他会根据自己的电脑硬盘分区进行扫描,扫描的原始文件会归类在一起,硬盘分区很大的话他要扫描很长的时间。软件优势1.在任何操作系统环境环境下的所有Windows或MacOSX文件系统。2.使用系统API标准,将损坏磁盘的可能性降至最低。3.与DOS程序相关的文件和驱动器没有尺寸限制。4.可完全访问USB.闪存驱动器等安装的外围设备,以及外部硬盘。5.RAID的带区集与镜像驱动器兼容。6.简单易用且完全自动化的导游,将引导用

  • 彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!

    原创@大前端技术沙龙 这段时间我试着通过思维导图来总结知识点,主要关注的是一些相对重要或理解难度较高的内容。下面是同系列文章:「思维导图学前端」6k字一文搞懂Javascript对象,原型,继承「思维导图学前端」初中级前端值得收藏的正则表达式知识点扫盲如果您需要换个角度看闭包,请直接打开解读闭包,这次从ECMAScript词法环境,执行上下文说起。本文总结了javascript中函数的常见知识点,包含了基础概念,闭包,this指向问题,高阶函数,柯里化等,手写代码那部分也是满满的干货,无论您是想复习准备面试,还是想深入了解原理,本文都应该有你想看的点,总之还是值得一看的。老规矩,先上思维导图。什么是函数一般来说,一个函数是可以通过外部代码调用的一个“子程序”(或在递归的情况下由内部函数调用)。像程序本身一样,一个函数由称为函数体的一系列语句组成。值可以传递给一个函数,函数将返回一个值。函数首先是一个对象,并且在javascript中,函数是一等对象(first-classobject)。函数可以被执行(callable,拥有内部属性[[Call]]),这是函数的本质特性。除此之外,函数

  • 微信小程序 计算器

    文章轉載的 1、calc.wxss /**/.content{height:100%;display:flex;flex-direction:column;align-items:center;box-sizing:border-box;background:#555;padding:30rpx020rpx0;}.scr{background:#fff;width:700rpx;height:175rpx;line-height:175rpx;text-align:right;margin:0010rpx0;padding:010rpx00;font-size:50px;}.btnGroup{display:flex;flex-direction:row;}.item{width:175rpx;min-height:175rpx;margin:1rpx;text-shadow:01px1pxrgba(255,255,255,.3);text-align:center;line-height:175rpx;}.gray{background:#eee;}.orange{color:#ff

  • 为 React 预览版的未来做准备

    为了与React生态系统的合作伙伴分享即将到来的变化,我们正在建立正式的预览通道,我们希望这个过程能帮助我们对React的变化更有自信,并让开发者有机会尝试实验性的功能。 这篇文章将与框架、库或者开发者工具的开发者相关。主要使用React来构建面向用户的应用程序的开发人员不需要担心我们的预览通道。React依赖于蓬勃发展的开源社区来提交bug报告,pull请求和 提交 RFC。为了鼓励反馈,我们有时会分享包含未发布特性的React的特殊版本。由于React的真实来源是我们的 公共 GitHub 库,你可以构建一个包含最新变化的React副本。但是,对于开发人员来说,从npm安装React非常容易,因此我们有时会将预览版发布到npm注册表。最近的一个例子是16.7alpha版本,其中包括了早期版本的HookAPI。我们想让开发人员更容易地测试React的预览版,因此我们使用了三个独立的发布通道来正式确定我们的流程。发布通道 这篇文章中的信息也可以在我们的发布通道文档页面找到。每当发布过程发生变化时,我们都会更新该文档。React的每个发布通道都是针对不同的用例设计的:- Latest是稳

  • 代码审计之PHPWIND

    0x01后台getshell漏洞分析漏洞位置出现在插件模板上传安装位置对应的源码位置为applications/appcenter/admin/AppController.php图1跟踪代码执行当本地上传时会进入uploadAction函数,先进行了用户验证然后新建一个文件上传的PwApplicationUpload类开始执行上传图2跟进PwApplicationUpload此类的主要作用为队上传文件先进行文件类型(后缀)校验上传的文件是否为zip,并根据时间戳生死临时目录和hash后生成一个临时文件名返回保存图3上传后执行本地应该安装时进入doinstallAction图4根据时间戳获取到刚刚上传的文件信息进行解压,跟进extractPackage图5图6phpwind_9.0.2_utf8/upload/src/applications/appcenter/admin//PwApplicationHelper.php图7解压后进行初始化安装包信息校验manifest图8getConfig解析manifest的配置信息图9图10图11最后执行安装,若安装过程出现错误进行回滚。具体代码

  • Java I/O 常用的实现类

    FileInputStream与FileoutputStreamFileInputStream类可以将一个文件的内容作为字节流读取,我们看一下源码:FileDescriptor文件描述符FileChannelJavaNioFileChannel是一个连接文件的通道,通过这个文件通道可以从文件读数据,向文件里写数据,是Javanio的替代方法,可以使用JavaIOAPI进行读取文件native操作initIDsopen0打开available剩余可用字节数;如遇结尾返回0;read0读取字节close0关闭构造:以文件路径构建以文件对象构建以文件描述符构建FileoutputStream是使用字节流方式将数据写入文件,实现与FileinputStream一样,一个是字节流方式读文件,一个是字节流方式写文件。需要注意的是,FileInputStream和FileoutputStream是直接从文件中读取数据到应用程序内存中,或直接从程序中写到文件上,没有缓冲区的概念(注:FileoutputStream的flush方法没有实现内容)。FilterInputStream、FilterOutp

  • LintCode 寻找旋转排序数组中的最小值 II题目分析代码

    题目假设一个旋转排序的数组其起始位置是未知的(比如0124567可能变成是4567012)。你需要找到其中最小的元素。数组中可能存在重复的元素。样例 给出[4,4,5,6,7,0,1,2]返回0分析这次可以出现重复元素,很简单,只要判断的时候加等于的判断即可,如果mid等于end,那么end--最小值肯定还在其中。代码publicclassSolution{ /** *@paramnum:arotatedsortedarray *@return:theminimumnumberinthearray */ publicintfindMin(int[]nums){ //writeyourcodehere if(nums==null||nums.length==0){ return-1; } intstart=0,end=nums.length-1; while(start+1<end){ intmid=start+(end-start)/2; if(nums[mid]>nums[start]&&nums[mid]<nums[end]) returnnum

  • ring3层恶意代码实例汇总

    本文作者:x-encounter之前一期我们学习了IAT的基本结构,相信大家对C++有了一个基本的认识,这一期放点干货,我把ring3层恶意代码常用的编程技术给大家整理了一下,所有代码都经过我亲手调试并打上了非常详细的注释供大家学习,如下图:我会在其中挑出几个,采用反汇编的方式,给大家展示恶意代码的执行流程以及原理,由于ring3层的技术过于古老,希望大家秉着学习和巩固的心态来看待该文章。一共九种技术,十套源代码,分两期向大家介绍编程相关思路,希望大家与我一起学习,共同进步。源码下载地址(稍后会把源码上传到github上):https://pan.baidu.com/s/1KpKdh4EWCGT828ONeB1HzA APC注入APC即Asynchronousprocedurecall,异步程序调用。在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断,当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数,利用QueueUserAPC()这个API,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的。

  • requests + bs4 写一个超级简单的检测友链存活的脚本

    如果友链变得多了,不知道那个网站已经挂掉了,是不是很麻烦?虽然我的友链并不多。。。(此脚本只适用我的网站,用python3写的,或者和我一个主题没有修改过友链结构的网站,当然,如果你想用的话可以修改,都是很简单的,暂时先这样用着吧。。跑起来有点慢后面再说=-=)#-*-coding:utf-8-*- importrequests frombs4importBeautifulSoupasbs defstart_urls(): url='https://www.soo9s.com/friends.py' res=requests.get(url) Soup=bs(res.text,'lxml') urls=Soup.find('div',class_='link-box').find_all('a') forfriends_urlinurls: f_url=friends_url['href'] try: requests.get(f_url) print("

  • Android,开源还是封闭?

    满大街都在谈论Android。 它是当红炸子鸡。许多人觉得,iPhone将受到它的强力挑战。 我也曾经对它充满了期待,但是后来的事态发展,令我改变了看法。前几天,我就在网志上写了自己的担忧: "首先,Android应用程序只能用java语言开发,莫非所有的应用程序都运行在一个巨大的虚拟机上?(【更正】网友留言指出,2009年6月Android发布NDK工具包,支持C/C++语言编程,不过性能不如SKD工具包中的Java语言。)其次,Google对Android采用了一种全面霸权式的管理,完全不是其他开源软件的开发方式,一切都由Google说了算,很多地方是黑箱,外界不得而知。" 没有想到,仅仅过了两天,担忧就变成了现实。LinuxKernel的维护者GregKroah-Hartman宣布,将Android代码从Linuxkernel代码库中删除。这意味着,LinuxKernel的开发小组不认可Android的贡献,两者产生了冲突。 消息公布以后,外界普遍觉得惊讶和可惜。好不容易,才有了一个这么受欢迎的开源手机系统,应该齐心协力、共同开发才对,为什么要"窝里

  • lib文件和dll文件的区别_dll2lib

    一.简介1.1C++两种库文件lib包含了函数所在的dll文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的dll提供,称为动态链接库dynamiclinklibrary。(这种方式更灵活,写的程序体积小,但是需要.exe和dll同时发布)lib包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库staticlinklibrary。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll文件)1.2C++两种链接方式动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位dll函数的可执行代码所需的信息。静态链接使用静态链接库,链接器从静态链接库lib获取所有被引用函数,并将库同代码一起放到可执行文件中。1.3lib与dll的区别1.功能区别lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只

  • linux系统中的时间

    1.编程显示系统时间: 1#include<stdio.h> 2#include<time.h> 3/* 4gcc-ofixfixedFormatTime.c 5./fix 6*/ 7intmain() 8{ 9time_ttime_raw_format; 10time(&time_raw_format);//Getthecurrenttime 11printf("Timeis[%ld].\n",(long)time_raw_format);///显示从1970年1月1日0时到现在的秒数-64位整数 12//Converttheintegertimetothefixed-formatstring 13printf("Thecurrentlocaltimeis:%s\n",ctime(&time_raw_format));//显示字符串形式的时间,具体到秒 14return0; 15}复制 2.linux的时间测量: 1#include<stdio.h> 2#include<math.h> 3#include<s

  • Java解析文件内容

      本文主要实现对.chk文件的解析,将其内容读出来,存入到一个Map中,文件内容实例为: A0500220140828.CHK A05002|34622511|373532879|3 复制    识别分隔符|,代码如下所示: 1packagecom.src.factory; 2 3importjava.io.BufferedReader; 4importjava.io.File; 5importjava.io.FileReader; 6importjava.io.IOException; 7importjava.util.LinkedHashMap; 8importjava.util.Map; 9 10importorg.apache.log4j.Logger; 11 12publicclassChkFileParseFactroy{ 13 14staticLoggerlogger=Logger.getLogger(ChkFileParseFactroy.class); 15 16/** 17*@Title:fileParsing 18*@Description:TO

  • 【深度学习】常用的模型评估指标

    “没有测量,就没有科学。”这是科学家门捷列夫的名言。在计算机科学中,特别是在机器学习的领域,对模型的测量和评估同样至关重要。只有选择与问题相匹配的评估方法,我们才能够快速的发现在模型选择和训练过程中可能出现的问题,迭代地对模型进行优化。本文将总结机器学习最常见的模型评估指标,其中包括: precision recall F1-score PRC ROC和AUC IOU 从混淆矩阵谈起 看一看下面这个例子:假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然我们可以使用错误率来衡量有多少比例的瓜被判别错误。但如果我们关心的是“挑出的西瓜中有多少比例是好瓜”,或者“所有好瓜中有多少比例被挑出来了”,那么错误率显然就不够用了,这时我们需要引入新的评估指标,比如“查准率”和查全率更适合此类需求的性能度量。 在引入查全率和查准率之前我们必须先理解到什么是混淆矩阵(Confusionmatrix)。这个名字起得是真的好,初学者很容易被这个矩阵搞得晕头转向。下图a就是有名的混淆矩阵,而下图b则是由混淆矩阵推出的一些有名的评估指标。 我们首先好好解读一下混淆矩阵里的一些名词和其意思。

  • 百度,淘宝,腾讯三大巨头HTML页面规范分解

      【兼容html5方案】 百度贴吧,百度图片的实现 <!--[ifltIE9]> <script> (function(){ vartags=['header','footer','figure','figcaption','details','summary','hgroup','nav','aside','article','section','mark','abbr','meter','output','progress','time','video','audio','canvas','dialog']; for(vari=tags.length-1;i>-1;i--){document.createElement(tags[i]);} })(); </script> <![endif]--> <style> header,footer,section,article,aside,nav,figure{display:block;margin:0;padding:0;border:0;} <

  • 对于阶梯博弈的理解。

    前提是建立在理解Nim博弈的情况下。   对于阶梯博弈。我只想描述清楚为什么对偶数列的操作是没有意义的。 我们明显地可以发现这样的现象。 当只剩下偶数列有数值的时候。先手必输。后者必赢。 因为先手只能做将偶数列的物品移动到奇数列上。此时后手只要把同样数量的奇数列的值移动到下一个偶数列上。 最后胜利的操作一定是将奇数列上的物品移动到0上。所以一定是后手胜。   对于这个特点。可以推出为什么对偶数列的操作是没有意义的。 既然只剩下偶数列的情况是必输的情况。那么我们博弈的时候。一定会想方设法让只有偶数列的情况留给别人。 也就是说。必胜的情况是。操作最后一次奇数列。(这里的最后是指操作了之后就只有偶数列的时候。)   对于目标。操作最后一次奇数列就是赢的。以及Nim增加操作是没有意义的。(回想一下Nim中如果加入增加一堆上物品的操作。也是不影响结果的。因为先手如果增加了。后手可以删除同样的数量的在同样的堆上。) 而操作偶数列就相当于给奇数列增加数量。 而且我们的目标是争夺最后一次奇数列的操作。 这已经是明显的Nim博弈了。

  • CF1702G2 Passable Paths (hard version)

    PassablePaths(hardversion) 给出一棵大小为\(n\)的树,\(q\)次询问,每次给出一大小为\(m\)的点集,判断是否存在一条链覆盖这些点,注意这条链可以经过其他点。\(n,\summ\leq2\times10^5\),\(q\leq10^5\)。 SOLUTION1:虚树 由于\(q\)次询问的\(\summ\le2\times10^5\),那么我们可以考虑对于每次询问使用虚树来解决,将树浓缩为所有关键点以及这些点的\(LCA\),然后通过\(DFS\)来判断每个点的儿子个数来判断是否是一条链即可。 具体的判断方法为: 首先虚树中是一定含有根节点的 然后我们判断是否关键点中不含根节点并且根节点只连了一个点 如果满足上面的条件,那么我们就判断虚树中的非根节点是否有多于两个的非根节点出边,如果有,则不满足题目中的条件 如果不满足上面的条件,那么就看虚树中每个点是否有多于两个点的出边 #include<bits/stdc++.h> usingnamespacestd; #definerep(i,b,s)for(inti=(b);i<=(

  • 设计模式中几个工厂模式的比较——餐馆的故事

    初读LearningHard大神的作品(C#设计模式总结-Learninghard-博客园),略有感触。对创建型模式中的简单工厂模式、工厂方法模式和抽象工厂模式这三个既有共性又有区别的模式加以比较,想出了一则生动有趣的故事以比喻之。在此与大家分享。   最初,在小城里还没有餐馆,人们只能自己动手做饭吃。而自己做饭不专业,也没有效率,也麻烦。正如没有任何工厂类的时候,客户端只能自己去创建类,每个不同的客户端都这么创建类,自然就有很多重复的代码,而且容易出错。   之后小城里有了餐馆,人们只要进去点菜,就可以吃到自己想要的菜。这个餐馆就是一个简单工厂类,客户端只要传进去一个参数表示自己想要的类,简单工厂就会返回这个类,这样客户端就轻松很多。   随着餐馆的生意越来越好,来小城的食客也越来越多,食客要求的菜品也越来越多有要川菜、粤菜、鲁菜等等,餐馆不得不去招聘各种各样的厨师来满足这些需求。然而,样样精,就是样样都不精。正如餐馆出现之前,人们自己做饭,不专业、没效率、麻烦,一个包罗杂七杂八厨师的餐馆也必然是不专业、没效率、混乱。正如一个简单工厂类,当其需要产出的产品类过多时,其内部结构也会复杂

  • crontab定时任务不执行,单独运行sh生效

    虽然已经从事运维两三年了。但是今天写的计划任务没有执行,排除了下,这里整理下,方便后期查看。 排除思路 1.确保crond服务是开机自启和当前是启动的。 #centos7 systemctlstatuscrond systemctlstartcrond #centos5,6 servicecrondstatus chkconfigcrondon复制 2.检查mail邮件里面关于该计划任务的错误信息。 mail复制 这里借用下网络上面的图过来下, 这个情况,一般这些环境配置在profile文件中的,可以在脚本中source下这个文件,让其生效,或者把对应的配置写到脚本里面来。 source/etc/profile复制 3.脚本里面的命令程序没有在PATH里面。  脚本里面执行的命令,没有在计划任务执行的环境变量里面有,需要添加进path或者命令写全路径。 #在可以执行的终端内获取所有PATH,写入脚本中 echo$PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/php/bin:

  • git 删除远程分支和本地分支

    删除远程分支 gitpushorigin--delete<branch> 复制 删除本地分支 gitbranch-d<branch>#deletefullymnergedbranch gitbranch-D<branch>#deletebranch(evenifnotmerged) 复制

  • 如何将java.util.Date转为java.sql.Date

    以下的信息将会帮到你 1、将java.util.Date转换为 java.sql.Date java.util.DateutilDate=newjava.util.Date(); java.sql.DatesqlDate=newjava.sql.Date(utilDate.getTime()); 2、若要插入到数据库并且相应的字段为Date类型 可使用PreparedStatement.setDate(int,java.sql.Date)方法 其中的java.sql.Date可以用上面的方法得到 也可以用数据库提供TO_DATE函数 比如现有ud TO_DATE(newSimpleDateFormat().format(ud,"yyyy-MM-ddHH:mm:ss"), "YYYY-MM-DDHH24:MI:SS") 注意java中表示格式和数据库提供的格式的不同 sql="updatetablenamesettimer=to_date('"+x+"','yyyymmddhh24miss')where....." 这里的x为变量为类似:20080522131223 3、如何将

相关推荐

推荐阅读