同步接口和异步接口【多测师_王sir】
1、定义
同步调用:当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用
异步调用:同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用
2、支付异步接口
当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。很多新手会拿这个结果当作支付成功了,那就会被坑死,结果就是支付成功率特别高,伴随着一堆无法解释的坏账率,测试人员尤其要注意测试数据的篡改:金额,同步返回结果,订单号等。
同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用。一般同步接口仅检查参数是否正确,签名是否无误等。异步接口才告诉你扣款结果。一般异步接口有5秒以内的延迟。调用不成功会重试。有时候是这边成功了,但支付渠道侧没收到返回,于是会继续调。当天的支付到第二天还在被异步调用也都是正常的。这也是开发人员需要特别注意的地方,不要当做重复支付。测试人员也要对重复回调进行测试,应只有一次有效。这还不是最坑的,一般支付渠道侧,只有支付成功了才通知你。要是支付失败了,压根儿都不告诉你。 另一方面,如何老收不到异步结果呢?那就得查查了。同步结果不可靠,异步调用不可靠,那怎么确定支付结果?最终的杀招就是查单了,反查,一般支付渠道侧都会提供反查接口,定时获取DB中待支付的订单调用支付渠道侧的反查接口,最终把支付渠道侧扣款成功的订单完成掉。
3、理解
"同步" 就好比:你去外地上学(人生地不熟),突然生活费不够了;此时你决定打电话回家,通知家里转生活费过来,可是当你拨出电话时,对方一直处于待接听状态(即:打不通,联系不上),为了拿到生活费,你就不停的 oncall 、等待,最终可能不能及时要到生活费,导致你今天要做的事都没有完成,而白白花掉了时间。
"异步" 就是:在你打完电话发现没人接听时,猜想:对方可能在忙,暂时无法接听电话,所以你发了一条短信(或者语音留言,亦或是其他的方式)通知对方后便忙其他要紧的事了;这时你就不需要持续不断的拨打电话,还可以做其他事情;待一定时间后,对方看到你的留言便回复响应你,当然对方可能转钱也可能不转钱。但是整个一天下来,你还做了很多事情。 或者说你找室友临时借了一笔钱,又开始 happy 的上学时光了。
简而言之,言而总之: 同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以,或者说中间哪一步出错都不可以,类似于编程中程序被解释器顺序执行一样;同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。
4、Python 模拟测试异步接口
# order 下单接口:url = localhost:1234/order/createmethod = postbody = {"goodsId":"102030","userId":"6666", "num":10, "amount":100}response = {"code":"0000", "msg":"sucess", "data":{ "order":"dcs123456789", "locator":"/order/get_result/"}}
# getOrder 查询订单接口:url = localhost:1234/order/get_result?orderId=dcs123456789method = getresponse = {"code":"0000", "msg":"sucess", "data":{ "order":"dcs123456789", "status": 1, "desc": "下单成功", "goodsId":"102030", "userId":"6666", "num":10, "amount":100}}
import time
import requestsdef create_order():url = "http://localhost:1234/order/create" # 异步接口data = {"goodsId":"102030", "userId":"6666", "num":10, "amount":100}res = requests.post(url=url, json=data) return res.json().get("data").get("order") # 返回order_id用于追踪def get_order_result(interval=1, time_out=10): # 设置了默认时间间隔和超时时间,可以修改order_id = create_order() # 查询结果接口url = "http://localhost:1234/order/get_result?orderId={}".format("2423432")start_time = time.time() # 启动时间end_time = start_time + time_out #启动时间 + 超时时间 = 结束时间count = 1 # 计数器, 此处是为了显示更直观, 可以去掉while time.time() < end_time: # 当未到结束时间时, 循环请求res = requests.get(url) # 请求查询结果接口print(count)count += 1time.sleep(interval) # 休眠指定时间if res: # 如果有数据则退出循环breakelse: return None # 正常退出(达到end_time, 非break退出) 返回Nonereturn res.json() # break退出,返回接口数据if __name__ == '__main__': # print(create_order())print(get_order_result())
同步接口和异步接口【多测师_王sir】相关推荐
- Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...
1.本地方法栈和程序计数器 ==>偏底层一般不会接触到 2.方法区 ==>对应为永久代 3.虚拟机栈(stack) ==>对应为栈 4.堆(heap) ==>对应里面有新生代+ ...
- 三种常见加密算法MD5、对称加密,非对称加密【多测师_王sir】
一.MD5加密 MD5加密的特点: 不可逆运算(不能破解.不能解密) 对不同的数据加密的结果是定长的32位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制) 抗修改性 : ...
- java当中怎么测试异步接口【杭州多测师_王sir】【杭州多测师】
测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4.因为单元测试能够在软件模块组合之前尽快发现问题,所 ...
- 第三方支付接口怎么测试【杭州多测师】【杭州多测师_王sir】
现在有不少测试朋友做的项目中,可能也会涉及到支付相关的功能.比如:做商城的,做游戏的以及其他在线交易的网站.APP等.如果支付出了问题,或者用户拿少的钱通过篡改请求数据购买大金额的商品,如果是实物的话 ...
- 史上最全软件测试工程师常见的面试题总结(四)【多测师_王sir】
面试:神州数码 1.介绍你下你项目中一个自动化实现的流程 ==>看这篇http://duoceshi.cn/duoceshi/Tech_article/73.html 2.你觉得做自动化的意 ...
- 微信选择图片发朋友圈测试点【杭州多测师】【杭州多测师_王sir】
一.功能测试 1.进入到朋友圈,点击右上角相机图标是否会显示:拍摄和从相册选择按钮 2.点击拍摄是否会进入到拍摄照片和拍摄视频界面 3.是否会显示:轻触拍照,长按摄像按钮 4.点击拍照按钮是否会自动聚 ...
- 史上最全软件测试工程师常见的面试题总结【杭州多测师】【面试题】【杭州多测师_王sir】...
2021.3.8号早上 1.是否接触过自动化测试?若做过,使用什么工具,写过多少自动化测试用例: robotframework+selenium2library selenium 2.是否接触过数据库 ...
- 微信朋友圈点赞测试点【杭州多测师】【杭州多测师_王sir】
一.功能测试 1.进入到朋友圈界面找到某条说说,点击右下角2个点是否会出现点赞功能 2.双击2个点的图标点赞按钮是否被隐藏 3.点击点赞按钮是否可以点赞成功 4.点赞成功后是否会显示自己的微信昵称 5 ...
- 微信提现功能测试点【杭州多测师】【杭州多测师_王sir】
一.功能测试 1.点击提现按钮是否可以进入到提现界面 2.未登录的情况下是否可以点击提现 3.token失效或者登录态失效的情况下点击提现是否会跳到登录界面进行登录再提现 4.假设提现的额度最低为0. ...
最新文章
- Java项目:平行志愿管理系统(java+Springboot+Maven+mybatis+Vue+Mysql)
- 难以置信!小冰数字孪生虚拟人直播70天,没人发现不是真人
- 小米 Play 发布:CPU+GPU 双 Turbo,每个月送 10 GB 流量
- centos7在分区上建立文件系统和挂载
- 【主席树】更为厉害(P3899)
- plsqlnbsp;分页
- jsp value设置为函数的返回值_python中的生成器函数是如何工作的?
- gcc oracle mysql_[转]Windows下用GCC连接MySQL数据库
- allergo 导出光辉配置_请教Allegro导出光绘文件的层要选择哪些层?
- 很多人在网络上创业看不到本质
- Java面试题:final和Object类常见的方法
- 女士品茶 - 简单摘录
- android半透明引导页
- 属于计算机网络硬件系统有哪些,下列不属于计算机硬件系统的是()
- catia批量转stp文件格式_CATIA,UG,PROE等等格式批量转成stp,step,igs,iges
- 完整的iOS直播app
- C语言程序设计(二)基础内容
- Python 切片
- mysql中my.cnf不生效解决
- qq 游戏计算机内存不足,腾讯手游助手内存不足如何处理?内存不足处理方法介绍...
热门文章
- matlab产生波形数据文件,用Matlab生成txt格式波形数据
- MBR和GPT分区的比较
- 配置 wx.config 参数
- 【Unity3D】实现太阳系
- Python爬虫实战,requests+parsel模块,爬取二手房房源信息数据
- SpringCloud(3.1)Jenkins安装+GitLab拉取项目
- android superuser,superuser.apk-superuser授权管理 安卓版v1.0.3.0-PC6安卓网
- VCU整车控制器开发 VCU开发设计策略 整车控制器设计方案
- 818专业课【考经】—《信号系统》之章节概要:第七章 傅里叶变换的应用
- [转]我们需要什么样的游戏