← 返回博客列表
Stripe

Stripe 面试真题解析:Authorization Requests & Fraud Rules

2026-01-04

这是一道非常经典的 Stripe "Stateful Stream Processing"(有状态流处理)类型的题目。它考察候选人如何处理时间序列数据、如何设计高效的数据结构来查询状态,以及如何将业务规则转化为代码逻辑。

题目描述

Part 1: 授权请求处理 (Authorization Requests)

Stripe 代表商户接收付款请求。由于初期策略宽松,所有请求一律 APPROVE(批准)。 你需要处理一系列按时间顺序到达的请求,并输出格式化的日志。

输入格式: timestamp, unique_id, amount, card_number, merchant

示例输入:

5,R1,5.60,4242424242424242,bobs_burgers
10,R2,500.00,4242111111111111,a_corp

输出格式: <timestamp> <id> <amount> APPROVE

Part 2: 欺诈规则流 (Fraud Rules Stream)

为了降低风险,风控部门引入了“欺诈规则”。规则也是以流的形式实时更新的。

规则格式: time, field, value

规则含义:

规则特性:

任务: 实现一个系统,同时接收“交易流”和“规则流”,对每笔交易进行判定。如果交易时间点匹配任何一条已生效的欺诈规则,则输出 REJECT,否则 APPROVE

oavoservice 解题思路分析

这道题的难点在于双流合并状态查询

1. 数据结构选择

由于规则是基于特定字段(如 merchantcard_number)的,我们需要高效地查询某个字段是否被 ban。

2. 判定逻辑

对于每一笔交易(假设时间为 T_trans):

  1. 检查交易的 merchant 是否在规则表中。如果在,且 Rule_StartTime <= T_trans,则 REJECT。
  2. 检查交易的 card_number 是否在规则表中。如果在,且 Rule_StartTime <= T_trans,则 REJECT。
  3. 否则 APPROVE。

3. 处理双流顺序

在实际面试中,输入可能是两个分开的 List,或者是一个混合的 Stream。

代码实现片段 (Python)

class FraudDetector:
    def __init__(self):
        # 记录每种规则的生效时间
        # key: field_name, value: { field_value: start_time }
        self.rules = {
            "merchant": {},
            "card_number": {}
        }

    def add_rule(self, time, field, value):
        # 如果同一实体有多次规则,保留最早的还是最新的?通常保留最早的生效时间
        if value not in self.rules[field]:
            self.rules[field][value] = int(time)

    def check_transaction(self, time, merchant, card_num):
        # 检查 Merchant
        if merchant in self.rules["merchant"]:
            if self.rules["merchant"][merchant] <= time:
                return "REJECT"
        
        # 检查 Card Number
        if card_num in self.rules["card_number"]:
            if self.rules["card_number"][card_num] <= time:
                return "REJECT"
                
        return "APPROVE"

想获取本题完整代码与测试用例?

oavoservice 拥有最全的 Stripe 面试真题库与通过验证的 Standard Solution。我们的 VO 辅助服务不仅提供答案,更教你如何向面试官展示你的系统设计思维。

立即咨询 助你拿下 Stripe Offer。