← 返回部落格列表 Stripe OA 2026 真題速攻|狀態機 + 詐欺偵測 + API 三大題型
Stripe

Stripe OA 2026 真題速攻|狀態機 + 詐欺偵測 + API 三大題型

2026-05-23

Stripe 的 OA 在 2026 春招新一輪發放,仍然是「給你一個真實業務場景,寫出可讀、可擴展、可測試的程式碼」。和 Optiver / HRT 這種純演算法 OA 不同,Stripe 偏「工程師 OA」:題面長、抽象、要求你做合理的介面設計與邊界處理。

Stripe OA 概覽(2026)

維度 詳情
平台 自研線上 IDE(HackerRank 簡化版)
時長 2 小時
題量 1–2 道(多 part 形式)
難度 LC Medium 節奏 + 業務封裝
評分 自動測試 + 程式碼品質 review

題型一:支付狀態機

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 表。

題型二:詐欺偵測(滑動視窗聚合)

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。

題型三:API 解析

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