SWE / New Grad · VO Coding

Stripe 多币种 Payment 扣款:Method Fee、FX 与余额原子性

支付金额、支付方式费用与换汇费用须分别建模,明确汇率方向、取整时点和扣款不足时的全有或全无。

题目重点:支付金额、支付方式费用与换汇费用须分别建模,明确汇率方向、取整时点和扣款不足时的全有或全无。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版金额为各币种最小单位的整数,汇率用十进制有理数或 Decimal 表示;每种币种的指数与向上/银行家舍入应由现场题面给出。
  • 先尝试 payment 币种同币种余额;若不足且允许 FX,只选择一条明确指定来源币种到支付币种的 quote。多币种余额自动拼凑或最佳路径不在题目可见范围。
  • method fee 与 conversion fee 的币种、计算基数和先后顺序是关键缺口;训练例假设两费用均以支付币种计,并在目标支付额上相加。

解题路线

  1. 定义 Payment(id,target_currency,amount,method) 与 Balance[(account,currency)]。将 fee rule 做纯函数,返回金额和币种;不要把 fee 隐藏在一个浮点乘法里。
  2. Part 1 计算 due=amount+method_fee,查目标币种余额,够则原子扣 due 并输出 success;不够时 fail 且任何余额不改。负余额、未知 method、重复 payment ID 先按题面决定,真实支付必须幂等。
  3. Part 2 若需转换,确认 rate 的方向。例如 1 USD=0.9 EUR,要付 90 EUR,费用合计 1 EUR,则需从 USD 提供 ceil(91/0.9) 的对应最小单位;具体货币小数位和舍入合同决定精确数。先算足额,再一次性扣来源余额/记目标流入与费用,失败绝不部分提交。
  4. 用候选 quote 的过期时间/版本做可重放记录。若多种来源币种可选,先定选择准则:固定优先级、最少费还是用户指定;没有规则不自动做最优图搜索。
  5. 测试金额刚好够、少 1 单位、fee 导致不足、换汇后舍入差 1 单位、重复 ID、负/零金额、多余额与 quote 过期。

手动走一遍

训练例余额 USD=110,支付 90 EUR,method fee=1 EUR、conversion fee=0 EUR,quote 1 USD=0.9 EUR;所需 91/0.9≈101.111 USD,按美元分取足额上取整为 101.12 USD,余额还 8.88 USD。若余额仅 101.11 USD,则整笔失败。这是说明方向和取整的训练示例,不是题目费用数字。

规模与取舍

P 笔支付、每笔只用一个指定 quote 时 O(P) 时间、O(A C) 余额状态(A 账户、C 实际出现币种);Decimal 操作成本与精度有关。若允许多跳 FX,另成 q11 的图搜索问题并需套利/费用约束。

易错点与追问

容易失分的边界

  • 把不同币种余额直接相加判断够不够。
  • 汇率乘除方向反了。
  • 只检查本金余额,漏掉 method fee 或 conversion fee。
  • 余额不足时已扣掉一种币种或只扣一部分。
  • 把具体费率和 rounding 规则补成未公开原题。

继续深挖

  • 若 fee 要以来源币种收取,公式与舍入顺序怎样改?
  • 同一 payment 重试时如何重放原 quote 而非使用新汇率?
  • 并发支付争用同一余额时如何防止两笔都成功?
✓已复制微信号!