Stripe 的 OA 在 2026 春招新一轮发放,仍然是「给你一个真实业务场景,写出可读、可扩展、可测试的代码」。和 Optiver / HRT 这种纯算法 OA 不同,Stripe 偏「工程师 OA」:题面长、抽象、要求你做合理的接口设计与边界处理。本文按真题密度排序拆解三大题型并给出 7 天冲刺。
Stripe OA 概览(2026)
| 维度 | 详情 |
|---|---|
| 平台 | 自研在线 IDE(HackerRank 简化版) |
| 时长 | 2 小时 |
| 题量 | 1–2 道(多 part 形式) |
| 难度 | LC Medium 节奏 + 业务封装 |
| 评分 | 自动测试 + 代码质量 review |
题型一:支付状态机
题目
实现一个 Charge 状态机:pending → authorized → captured;任何阶段可 void;captured 后可 refunded。给定一段事件流,输出每笔订单的最终状态。
class ChargeStateMachine:
TRANSITIONS = {
'pending': {'authorize', 'void'},
'authorized': {'capture', 'void'},
'captured': {'refund'},
'voided': set(),
'refunded': set(),
}
NEXT = {
('pending', 'authorize'): 'authorized',
('pending', 'void'): 'voided',
('authorized', 'capture'): 'captured',
('authorized', 'void'): 'voided',
('captured', 'refund'): 'refunded',
}
def __init__(self):
self.state = {}
def apply(self, charge_id, event):
cur = self.state.get(charge_id, 'pending')
if event not in self.TRANSITIONS[cur]:
raise ValueError(f'illegal: {cur} → {event}')
self.state[charge_id] = self.NEXT[(cur, event)]
return self.state[charge_id]
def process(events):
sm = ChargeStateMachine()
out = {}
for cid, ev in events:
try:
out[cid] = sm.apply(cid, ev)
except ValueError:
pass
return out
评分关注点:非法转换是否抛出、是否对未知 charge_id 默认 pending、是否提供清晰的 transition 表。
题型二:欺诈检测(滑动窗口聚合)
题目
实时事件流 events[(user_id, amount, ts)],规则:任意 10 分钟窗口内同一 user 累计金额 ≥ $1000 视为高风险。返回首次触发高风险的事件下标。
from collections import deque, defaultdict
def first_fraud_idx(events, threshold=1000, window_sec=600):
qs = defaultdict(deque)
sums = defaultdict(float)
for i, (uid, amt, ts) in enumerate(events):
q, s = qs[uid], sums
q.append((ts, amt))
s[uid] += amt
while q and ts - q[0][0] > window_sec:
_, old_amt = q.popleft()
s[uid] -= old_amt
if s[uid] >= threshold:
return i
return -1
时间复杂度:O(n) amortized。
进阶版(社区面经反馈出现率 ~25%)会加上「用户在不同币种下的金额需要换算」,要求接受额外的 fx 表参数。
题型三:API 解析
题目
给定一段 webhook payload(JSON 形式),实现一个 parse(payload),提取 event.type、event.data.object.id、并对所有金额字段做 cent → dollar 转换。
import json
def parse(payload, money_fields=('amount', 'amount_captured', 'amount_refunded')):
obj = json.loads(payload) if isinstance(payload, str) else payload
result = {
'type': obj.get('type'),
'id': obj.get('data', {}).get('object', {}).get('id'),
}
def walk(node):
if isinstance(node, dict):
for k, v in node.items():
if k in money_fields and isinstance(v, int):
node[k] = v / 100.0
else:
walk(v)
elif isinstance(node, list):
for v in node:
walk(v)
walk(obj)
result['cleaned'] = obj
return result
Stripe 的 webhook payload 可能嵌套 5+ 层,必须递归遍历,不能假设结构。
7 天冲刺方案
| 天数 | 任务 |
|---|---|
| D1 | 状态机模板:3 道经典题(订单 / 订阅 / charge) |
| D2 | 滑动窗口聚合:10 分钟、滚动、滑动中位数 |
| D3 | JSON 嵌套解析 + 递归 / 迭代 |
| D4 | LC 1095 / 705 / 706 + 接口设计 |
| D5 | 写一道 mock Stripe OA(2 小时计时) |
| D6 | 复盘 mock,针对薄弱点补 2 题 |
| D7 | 看 stripe.com/docs API 风格再写一道接口题 |
真题特征
- 题面长(200+ 行说明),先读完再动手
- 强测试覆盖:自动测试 + 人工 review 两道关
- 偏好「能跑、清晰、可扩展」三个标签 — 不要写炫技代码
- 时间紧但不会逼到极限:一般 60–80% 时间能完成主线
FAQ
Stripe OA 用什么语言?
可选 Python / Java / Go / Ruby / TypeScript。社区面经反馈:70% Python,15% Go,~10% Java。
题量是 1 道还是 2 道?
按岗位定。Backend / API SDE 通常 1 道多 part;Infra / Payments 偶尔 2 道。
Stripe OA 自动判 + 人工 review 怎么平衡?
自动测试要全过;review 看代码可读性、命名、是否复用、是否有合理错误处理。
没过冷却期?
通常 6 个月。换 team(Payments → Atlas)不一定算同一池,但简历会被推荐人重新评估。
正在准备 Stripe OA / VO?
这次很高兴帮这批同学顺利通过 Stripe OA。很多同学反馈,自己刷 LeetCode 时根本碰不到「200 行说明 + 接口设计 + 自动测试 + 人工 review」这种四重压力,到 OA 当天容易方寸大乱。
如果你也在准备 Stripe、Plaid、Brex、Mercury 这类支付 / FinTech SDE 的 OA / VO,感觉一个人复习方向模糊、节奏不稳,欢迎联系 oavoservice。我们会根据你的具体水平和弱点,提供专业的 OA 实战辅助服务和一对一指导,把状态机、欺诈检测、API 解析三套模板完整打通。
👉 立即添加微信:Coding0201,获取 Stripe 高频题与备考方案。
联系方式
Email: [email protected]
Telegram: @OAVOProxy