← 返回博客列表 Stripe OA 2026 真题速攻|状态机 + 欺诈检测 + API 三大题型
Stripe

Stripe OA 2026 真题速攻|状态机 + 欺诈检测 + API 三大题型

2026-05-23

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;任何阶段可 voidcaptured 后可 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.typeevent.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 风格再写一道接口题

真题特征


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