Skip to main content
幕后花絮
幕后花絮DecisionsPremium

我们代码中的法律

一个必须无需登录就能使用的取消按钮。一个绝不能拒绝你的表单。为什么对我们来说,法律义务是架构,而不是套话。

发布于 作者 AlphaCloud5 分钟阅读

当我们让 Premium 可以购买时,我们以为法律部分只是页脚里的几页文字。这是错的。有些义务根本无法写进文本,因为它们决定了一个功能必须如何构建。

下面是四个尤其能说明这一点的例子。先说清楚这是什么:这是对我们实现方式的描述,而不是法律建议。下面的规则来自德国法律,也就是 AlphaCloud 运营所在地的法律。

不允许登录的取消按钮

《德国民法典》第 312k 条要求,在线订立的合同必须提供一个可直接访问的取消途径。这带来了一些无法事后靠措辞补上的要求:

  • 页面必须无需登录即可使用
  • 它必须出现在每个页面的页脚中
  • 它需要两个步骤:先填写,再通过一个标注清楚、毫无歧义的按钮确认
  • 必须发出一份文本形式的收到确认

最后一点决定了架构。取消合同是一种单方面的意思表示,在送达时生效。因此它必须始终被记录并确认,无论它来自谁。

表单永远不能拒绝你

正是在这里,显而易见的做法差点让我们犯错。

显而易见的做法是:只有当服务器 ID 和电子邮件与一个有效订阅匹配时,才接受取消。听起来很合理,但它错了两次。

首先,它会把一位输错电子邮件或填写了其他地址的真正客户拒之门外。他们的取消将不算送达,订阅会续订,而他们手里却握有曾经尝试过的证据。

其次,也是更令人不快的部分:错误消息本身就会成为一个答案。任何收到“未找到订阅”的人都会知道这个服务器没有付费。Discord 服务器 ID 不是秘密,任何成员都能读取它。这个表单会变成一个刺探他人服务器的工具。

解决方案把两件感觉像是一件事的东西分开:

条件
意思表示的送达 无条件,始终记录并确认
取消的执行 仅当提交的电子邮件与存档的买家匹配时

其余一切都会进入一个队列,由人工审核。这是允许的,因为第 312k 条第 2 款明确允许要求提供身份信息。被禁止的只是在前面设置登录。

出于同样的原因,只有在身份得到确认后,公开回复才能写出结束日期。否则,这份确认又会变成一个可以用来探查信息的工具。

刻意需要登录的撤回

就在它旁边,有一个我们反其道而行之构建的功能:按比例退款的撤回需要登录。

这并不矛盾。第 312k 条涵盖的是取消,而不是撤回,只要非正式的途径保持开放,就根本没有义务提供在线撤回表单。区别在于后果:取消作用于未来,而退款会立即转移资金,而且无法追回。

由此产生三条规则,我们不会放宽:

无需强制说明理由。 第 355 条第 1 款明确规定撤回无需说明理由。这个字段是可选的,而且必须保持可选,无论一个必填字段对统计来说多么诱人。

14 天后,只拒绝自动化途径,绝不拒绝意思表示本身。 如果客户没有被正确告知,期限会延长至最多十二个月零十四天。因此,一概而论的“太晚了”可能是错误的。

防止重复退款的保护采取悲观策略。 标记在退款执行之前就会设置。如果之后退款失败,标记仍然保留,由人工接手。重复退款是唯一无法补救的结果。

Discord 私信不是耐久介质

第 312f 条第 3 款要求在耐久介质上提供合同确认,并且必须再现当时作出的同意。

我们起初发送的是 Discord 私信,因为我们的客户本来就在那个渠道里。但这并不满足要求。私信存在于一个我们无法控制的平台上,而且在该条款所指的意义上,它既不可保存,也不能保证不被更改。

因此我们增加了电子邮件,随之而来的是一个令人不安的依赖:如果没有设置邮件凭据,发送操作只会在日志中写入一条警告,而这项义务就没有履行。一项法定义务取决于一个环境变量,这是一种值得留意的状态。

没有增值税,而且这一点必须处处一致

AlphaCloud 是《德国增值税法》第 19 条意义上的小企业。价格均为最终价格,从不显示增值税。

这听起来像一个脚注,实际上却是一项横跨许多地方的一致性任务:价格页面、结账对话框、服务条款、隐私政策、发票页脚以及支付服务商那里的配置,都必须说同一件事。我们曾经长时间挂着一个“不含增值税”,那完全是错的。

还有 AI

自 2026 年 8 月起,欧盟《人工智能法》的透明度义务全面适用。任何与 AI 系统对话的人都必须能够认出这一点,最迟在第一次互动时。

那次审查中对我们最重要的一句话是:页脚里的一个法律页面可能并不满足要求。 告知必须发生在互动发生的地方,也就是 Discord 消息本身。这就是为什么我们的工单 AI 支持会主动自我介绍,并且有一个可见的按钮来关闭它。我们的详细评估见 AI 透明度。

共同的主线

四个例子都有相同的形态:义务看起来像一段文字,实际上却是对结构的要求。一个放错地方的登录、一条透露太多的错误消息、一份发错渠道的确认、一个允许重复退款的执行顺序。

所以我们现在把法律文本当作规格说明书来读,并且也反过来检查:代码真的在做我们条款所说的事吗?正是针对这个问题,我们发现了两处真正的偏差,关于它们另有一篇文章。

更多文章