网易首页 > 网易号 > 正文 申请入驻

Stripe开发者栽了3次后,有人把Mock服务器做成了真API

0
分享至


上个月,一位支付工程师在集成Stripe时,测试全部通过,上线就崩。Mock服务器告诉他POST /charges返回{"id": "ch_123"},确实如此。但他的代码接着调用GET /charges/ch_123验证状态,Mock返回404。因为Mock根本不存储任何东西,每个请求活在平行宇宙。

半天时间就这么没了。而且这不是第一次。

Prism、WireMock、Mockoon——这些工具都不错。你丢给它们一个OpenAPI规范,它们生成响应。但响应是罐头的,请求之间没有记忆:

POST /customers → 201 {"id": "cust_123"}

GET /customers/cust_123 → 404 # 完全不知道你刚才创建了什么

这种玩法在单元测试里测HTTP客户端还行。一旦涉及多步骤流程,立刻散架。

想想真实的Stripe集成是怎么工作的:创建PaymentIntent → 确认 → 等待webhook → 更新订单状态。Mock服务器做不了第2到第4步。ID不传递,webhook不触发。你在测试一个幻想。

这位工程师需要的不是Mock,而是一个微型假API,行为像真的一样。他花了三个月做了FetchSandbox。

从"有来无回"到"有始有终"

FetchSandbox的核心逻辑很简单:你给OpenAPI规范,它生成带状态、种子数据和webhook事件的沙盒。

命令行看起来是这样的:

npm install -g fetchsandbox

fetchsandbox generate ./stripe-openapi.yaml

# ✓ Sandbox ready: 587 endpoints, 63 seed records

fetchsandbox run stripe --all

# ✓ Accept a payment — 3/3 steps passed


# ✓ Onboard a connected account — 3/3 steps passed

# ✓ Respond to a dispute — 2/2 steps passed

# ✓ All workflows passed — 3/3 (9ms)

那个run --all命令是他 wished he'd had的东西。它端到端执行每个集成工作流——创建资源、链式传递ID、验证每个响应。出问题的地方,精确到步骤和原因。

错误场景比快乐路径更难搞。他加了--scenario标志,可以把整个沙盒切换到"auth_failure"模式:

fetchsandbox run stripe accept_payment --scenario auth_failure

# ✗ Step 1: POST /v1/payment_intents → 401 Unauthorized

# Scenario "auth_failure" correctly caused failure.

# Scenario reset to default.

他的代码有个bug:只在customer端点处理401,payment intent端点没处理。普通Mock永远抓不到这个。

Webhooks:那个没人想碰的兔子洞

真实的Stripe集成里,一半逻辑在webhook处理器里。沙盒现在会在资源变更时触发webhook事件,可以实时观看:

fetchsandbox webhook-listen stripe

# 12:04:31 payment_intent.created pi_xyz → requires_confirmation

# 12:04:33 payment_intent.succeeded pi_xyz → succeeded

# 12:04:33 charge.succeeded ch_abc → paid


这不是装饰。很多集成bug发生在"我以为webhook会在这时触发,但它没有"或者"我处理了错误的事件类型"。沙盒让你看见事件流,而不是猜。

种子数据是另一个被低估的痛点。真实API有状态:你的测试账户里有预设的客户、支付方式、发票。Mock服务器通常给你空数据库,每个测试从零开始建世界。

FetchSandbox的63条种子记录不是随便填的。它们覆盖常见的边缘情况:3D Secure卡、国际地址、不同货币、各种dispute状态。测试时你面对的是真实世界的缩影,而非真空。

状态机:让假API学会"长大"

最微妙的部分是状态转换。真实的PaymentIntent会经历requires_payment_method → requires_confirmation → processing → succeeded。每个状态有合法的下一步,也有非法的跳跃。

Mock服务器通常不管这个。你想把succeeded的PaymentIntent再确认一次?它可能照做,返回200。真实API会扔个错误,告诉你状态机不允许。

FetchSandbox内置了这些状态机。它知道什么时候该拒绝,什么时候该触发webhook,什么时候该让资源"过期"。这不是模拟,是行为克隆。

性能数字也值得一提。上面那个9ms跑完3个工作流,不是噱头。沙盒运行在本地Node进程里,没有网络延迟,没有速率限制。你可以把它塞进CI流水线,每次提交都跑一遍完整集成测试。

对比真实API的测试:Stripe的测试模式有速率限制,某些操作(比如创建Connect账户)需要人工审核模拟,批量跑测试经常触发限流。沙盒把这些摩擦点抹平了。

一个被反复验证的痛点

这位工程师不是第一个被Mock坑的人。Stripe社区论坛里,"为什么我的测试通过但生产环境崩了"是常驻话题。答案通常是:Mock没覆盖那个边缘情况,或者状态不一致。

2023年Stripe自己推出了Stripe Mock,但它是只读的,不支持写操作。写操作的状态管理,至今是开发者自己想办法。

FetchSandbox的野心更大:不只是Stripe,任何有OpenAPI规范的API都能套进去。思路是通用的——状态、种子数据、webhook、场景切换——只是具体的状态机需要针对每个API定制。

目前支持的是Stripe和GitHub API。下一个目标据说是AWS SDK,那个状态空间的复杂度是另一个量级。

开源社区的反应比预期热烈。发布两周,GitHub star数超过Prism同期的三倍。最活跃的issue是请求支持更多API:Twilio、SendGrid、Shopify。

一位早期用户在讨论区留言:「以前我花20%时间写功能,80%时间调集成。现在比例反过来了。」

这个工具会取代Prism们吗?不太可能。单元测试里测HTTP客户端,轻量Mock仍然更顺手。FetchSandbox瞄准的是集成测试的灰色地带——比单元测试重,比端到端测试轻,比真实API快,比Mock真。

那位工程师在README里写了一句很产品经理的话:「我不想测试我的代码能不能发HTTP请求。我想测试我的代码在真实API的行为面前能不能活。」

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
57岁森保一回击英国记者嘲讽:日本队有实力在世界杯夺冠 走着瞧

57岁森保一回击英国记者嘲讽:日本队有实力在世界杯夺冠 走着瞧

风过乡
2026-03-31 06:19:52
油车换电车1年真实感受:普通人别跟风!买车前没人告诉你的真相

油车换电车1年真实感受:普通人别跟风!买车前没人告诉你的真相

华庭讲美食
2026-03-28 17:08:13
5月1起手机绑车牌就能走高速!不用ETC、全年24天免费,车主必看

5月1起手机绑车牌就能走高速!不用ETC、全年24天免费,车主必看

华庭讲美食
2026-03-31 16:40:40
1943年毛泽民被盛世才杀害,盛世才逃到台湾后,岳父一家惨遭灭门

1943年毛泽民被盛世才杀害,盛世才逃到台湾后,岳父一家惨遭灭门

磊子讲史
2026-03-27 16:51:45
一路走好!仅1天又传出3位名人去世,有2位不到50岁,令人唏嘘!

一路走好!仅1天又传出3位名人去世,有2位不到50岁,令人唏嘘!

八斗小先生
2026-03-30 15:22:52
韩国网友偷广州街头美景图,配文:这就是首尔!浏览破百万,照片中公交车尾清晰印有“广州公交”4个字,发现“闹大”后删除博文

韩国网友偷广州街头美景图,配文:这就是首尔!浏览破百万,照片中公交车尾清晰印有“广州公交”4个字,发现“闹大”后删除博文

大风新闻
2026-03-29 21:59:02
招行董事长惹众怒,说员工很少准时下班,把加班吹成了核心竞争力

招行董事长惹众怒,说员工很少准时下班,把加班吹成了核心竞争力

潮鹿逐梦
2026-03-30 20:13:34
美伊大战让全球看明白解放军的真实战力,原来中国当年真没开玩笑

美伊大战让全球看明白解放军的真实战力,原来中国当年真没开玩笑

阿龙聊军事
2026-03-31 06:08:54
令人不解的痛史:东北抗联内斗悲剧与大量叛徒

令人不解的痛史:东北抗联内斗悲剧与大量叛徒

柳絮忆史
2026-03-30 09:15:02
一个中成药,把肝血补足,让你睡得深、睡得长、睡得香、睡得安稳

一个中成药,把肝血补足,让你睡得深、睡得长、睡得香、睡得安稳

神希园
2026-03-31 12:05:03
国务院里,为啥有的叫“部”,有的叫“委”?

国务院里,为啥有的叫“部”,有的叫“委”?

核电那些事
2026-03-31 07:10:28
郑丽文随行名单出炉,卢秀燕、徐巧芯表现出乎意料,绿营坐不住了

郑丽文随行名单出炉,卢秀燕、徐巧芯表现出乎意料,绿营坐不住了

王姐懒人家常菜
2026-03-31 16:52:13
全新速腾S上市7.98万起,一汽-大众在A级车市场再落一子

全新速腾S上市7.98万起,一汽-大众在A级车市场再落一子

车市红点
2026-03-31 16:48:06
以色列开始打伊朗的经济命脉 战争进入收官阶段

以色列开始打伊朗的经济命脉 战争进入收官阶段

桂系007
2026-03-31 04:42:48
体育局正式宣布,陈梦正式上任,新岗位亮相,将与张继科正面竞争

体育局正式宣布,陈梦正式上任,新岗位亮相,将与张继科正面竞争

海棠未眠a
2026-03-30 15:26:24
WCBA:杨舒予无缘四强,刘禹彤空砍16+12,王思雨12分晋级

WCBA:杨舒予无缘四强,刘禹彤空砍16+12,王思雨12分晋级

体娱荒原
2026-03-30 22:24:44
创指跌超2%,近3700股下挫

创指跌超2%,近3700股下挫

澎湃新闻
2026-03-31 11:33:08
62岁老人查出阴茎癌!他的坏习惯为所有人敲响警钟!值得借鉴

62岁老人查出阴茎癌!他的坏习惯为所有人敲响警钟!值得借鉴

路医生健康科普
2026-03-27 17:42:19
伊朗国防军为何在本次伊朗战争中未参战?

伊朗国防军为何在本次伊朗战争中未参战?

深度报
2026-03-30 22:04:19
世界第13输给世界第79,王皓亲自督战也没用,梁靖崑该醒醒了

世界第13输给世界第79,王皓亲自督战也没用,梁靖崑该醒醒了

眼界纵横
2026-03-31 15:37:42
2026-03-31 18:16:49
爬虫饲养员
爬虫饲养员
业余养了只叫“龙虾”的AI爬虫,主业是给互联网打工。
506文章数 3关注度
往期回顾 全部

科技要闻

尚未正式宣发,国行苹果AI半夜"意外闪现"

头条要闻

00后女孩回国当职业扫墓人:每天鞠躬上百次 月薪4千多

头条要闻

00后女孩回国当职业扫墓人:每天鞠躬上百次 月薪4千多

体育要闻

县城修车工,用20年成为世界冠军

娱乐要闻

丝芭传媒举报鞠婧祎:瞒报收入竟达85%

财经要闻

高薪内推藏陷阱!"招转培"骗局盯上求职者

汽车要闻

腾势Z9GT到底GT在哪?

态度原创

旅游
教育
游戏
艺术
亲子

旅游要闻

体育旅游高端智库联盟成立 “贵阳指数”发布

教育要闻

你们知道孩子最想听的话是什么吗?

《模拟农场25》成日本农业高中教材 玩游戏学种地

艺术要闻

石涛『野色册』

亲子要闻

孩子为何抑郁躺平? 平静家庭下的暗流,正困住抑郁的孩子

无障碍浏览 进入关怀版