PayPal 11 年的 API 灾难:当他们忽视开发人员时,我们如何构建解决方法

在 Forward Email,我们十多年来一直在处理 PayPal 的 API 问题。起初只是些小麻烦,后来却演变成一场彻底的灾难,迫使我们自行构建变通方案,屏蔽他们的钓鱼模板,并最终在一次关键的账户迁移期间暂停所有 PayPal 付款。
这 11 年来,PayPal 一直忽视开发者的基本需求,而我们却竭尽全力让他们的平台正常运行。
缺失的部分:无法列出订阅
让我们震惊的是:PayPal 自 2014 年以来就提供订阅计费服务,但他们从未为商家提供列出自己的订阅的方式。
想一想。你可以创建订阅,如果你有 ID,也可以取消订阅,但你无法获取你账户下所有活跃订阅的列表。这就像一个没有 SELECT 语句的数据库。
我们需要它来进行基本的业务运营:
- 客户支持(当有人通过电子邮件询问其订阅情况时)
- 财务报告和对账
- 自动账单管理
- 合规性和审计
但 PayPal 呢?他们根本就没开发过。
2014-2017:问题浮现
订阅列表问题最早出现在 2017 年的 PayPal 社区论坛上。开发人员提出了一个显而易见的问题:“如何获取所有订阅的列表?”
PayPal 对此有何回应?毫无动静。
社区成员开始感到沮丧:
“如果商家无法列出所有有效协议,这真是一个很奇怪的遗漏。如果协议ID丢失,这意味着只有用户可以取消或暂停协议。” - leafspider
“+1。已经快 3 年了。” - laudukang(意思是这个问题自 2014 年左右就存在了)
2017 年的 原始社区帖子 表明开发人员正在恳求这项基本功能。PayPal 的回应是将人们报告该问题的存储库存档。
2020:我们向他们提供广泛的反馈
2020年10月,PayPal 与我们联系,希望召开一次正式的反馈会议。这可不是一次轻松的闲聊——他们组织了一场45分钟的 Microsoft Teams 电话会议,与会的8位 PayPal 高管包括 Sri Shivananda(首席技术官)、Edwin Aoki、Jim Magats、John Kunze 等。
27 项反馈列表
我们做好了准备。经过 6 个小时的尝试,我们整合了他们的 API,发现了 27 个具体问题。PayPal Checkout 团队的 Mark Stuart 说:
嘿,Nick,谢谢你今天和大家分享!我认为这会成为我们团队获得更多支持和投资的催化剂,让我们能够去解决这些问题。到目前为止,很难得到像你这样丰富的反馈。
这些反馈并不是理论上的——它来自于真实的整合尝试:
- 访问令牌生成不起作用:
访问令牌生成功能无法正常工作。另外,应该有更多 cURL 示例。
- 没有用于创建订阅的 Web UI:
不用 cURL 怎么创建订阅?好像没有网页界面可以实现这个功能(Stripe 有)。
Mark Stuart 发现访问令牌问题尤其令人担忧:
我们通常不会听说有关访问令牌生成的问题。
支球队参与,并做出承诺
随着我们发现越来越多的问题,PayPal 不断邀请更多团队参与讨论。订阅管理 UI 团队的 Darshan Raju 也加入了讨论,他说道:
确认差距。我们会跟踪并解决此问题。再次感谢您的反馈!
据描述,此次会议旨在寻求:
坦诚地讲述你的经历
到:
让 PayPal 成为开发人员应该使用的工具。
结果如何?没有。
尽管进行了正式的反馈会议,但清单仍然包含 27 项内容,多个团队参与,并承诺:
追踪并解决
问题,根本没有得到解决。
高管大批离职:PayPal 如何失去所有机构记忆
真正有趣的地方来了。所有收到我们 2020 年反馈的用户都离开了 PayPal:
领导层变动:
- 丹·舒尔曼(Dan Schulman,任职 9 年的首席执行官)→亚历克斯·克里斯(Alex Chriss)(2023 年 9 月)
- Sri Shivananda(组织反馈的首席技术官)→摩根大通(2024 年 1 月)
做出承诺然后离开的技术领导者:
- Mark Stuart(承诺的反馈将成为“催化剂”)→ 现在在 Ripple
- Jim Magats(PayPal 18 年资深员工)→ MX首席执行官(2022 年)
- John Kunze(全球消费产品副总裁)→ 已退休(2023 年)
- Edwin Aoki(最后几位留任者之一)→ 刚刚前往纳斯达克(2025 年 1 月)
PayPal 已经成为一扇旋转门,高管们在这里收集开发人员的反馈,做出承诺,然后跳槽到摩根大通、Ripple 和其他金融科技公司等更好的公司。
这就解释了为什么 2025 年 GitHub 问题响应似乎与我们 2020 年的反馈完全脱节——实际上所有收到该反馈的人都离开了 PayPal。
2025:新的领导,同样的问题
快进到2025年,同样的模式再次出现。在多年毫无进展之后,PayPal的新领导层再次伸出援手。
新任首席执行官参与其中
2025年6月30日,我们直接向PayPal新任首席执行官Alex Chriss汇报了此事。他的回复很简短:
嗨,Nick,感谢您的联系和反馈。Michelle(已抄送)和她的团队会积极与您沟通并共同解决此事。谢谢 -A
Michelle Gill 的回复
小型企业和金融服务部执行副总裁兼总经理 Michelle Gill 回应道:
非常感谢 Nick,把 Alex 改为密件抄送了。自从你之前发帖以来,我们一直在调查此事。我们会在本周结束前给你打电话。请把你的联系方式发给我,这样我的同事就能联系你了。Michelle
我们的回应:不再开会
我们拒绝了另一次会面,并解释了我们的沮丧之情:
谢谢。不过我觉得打电话没什么用。原因如下……我以前打过一次电话,但完全没有进展。我浪费了两个多小时的时间与整个团队和领导层沟通,但什么也没做……来来回回发了好多邮件,什么也没做。反馈也没有任何进展。我尝试了好几年,希望有人能听取我的意见,但最终却毫无进展。
马蒂·布罗德贝克的过度工程回应
然后,PayPal 消费者工程主管 Marty Brodbeck 伸出了援手:
你好,Nick,我是 Marty Brodbeck。我负责 PayPal 的所有消费者工程,并一直在推动公司的 API 开发。能否请你和我们谈谈你遇到的问题以及我们可以如何提供帮助?
当我们解释了订阅列表端点的简单需求时,他的回答揭示了确切的问题:
谢谢 Nick,我们正在创建一个具有完整 SDK 的单一订阅 API(支持完整的错误处理、基于事件的订阅跟踪、强大的正常运行时间),其中计费也被拆分为一个单独的 API 供商家使用,而不必跨多个端点进行协调以获得单一响应。
这完全是错误的做法。我们不需要耗费数月时间构建复杂的架构。我们需要一个简单的 REST 端点来列出订阅信息——这早在 2014 年就应该存在了。
GET /v1/billing/subscriptions
Authorization: Bearer {access_token}
“简单的 CRUD”矛盾
当我们指出这是自 2014 年起就应该存在的基本 CRUD 功能时,Marty 的回应是:
简单的 Crud 操作是核心 API 的一部分,所以不需要花费数月的开发时间
PayPal TypeScript SDK 经过数月的开发,目前仅支持三个端点,结合其历史时间线,可以清楚地看出此类项目需要几个月以上的时间才能完成。
这条回复表明他根本不了解自己的 API。如果“简单的 CRUD 操作是核心 API 的一部分”,那么订阅列表端点又在哪里呢?我们回复道:
如果“简单的 CRUD 操作是核心 API 的一部分”,那么订阅列表端点在哪里?自 2014 年以来,开发人员就一直在要求提供这种“简单的 CRUD 操作”。至今已有 11 年。其他所有支付处理器从第一天起就具备这项基本功能。
断开连接变得清晰
2025 年与亚历克斯·克里斯 (Alex Chriss)、米歇尔·吉尔 (Michelle Gill) 和马蒂·布罗德贝克 (Marty Brodbeck) 的交流表现出同样的组织功能障碍:
- 新领导层对之前的反馈会议一无所知
- 他们提出的都是同样过度设计的解决方案
- 他们不了解自身 API 的局限性
- 他们想要更多会议,而不是仅仅解决问题
这种模式解释了为什么 2025 年的 PayPal 团队似乎与 2020 年提供的广泛反馈完全脱节——收到反馈的人已经离开,而新的领导层正在重复同样的错误。
他们忽略了多年的错误报告
我们不只是抱怨功能缺失。我们积极报告错误,并努力帮助他们改进。以下是我们记录的问题的完整时间表:
2016:早期 UI/UX 投诉
早在 2016 年,我们就曾公开与包括 Dan Schulman 在内的 PayPal 领导层沟通,探讨界面和可用性问题。这已经是 9 年前的事了,同样的 UI/UX 问题至今仍然存在。
2021:企业电子邮件错误报告
2021年3月,我们报告了PayPal企业电子邮件系统发送错误的取消通知的问题。该电子邮件模板中的变量渲染不正确,导致客户收到令人困惑的消息。
马克·斯图尔特承认了这个问题:
谢谢 Nick!现在改用密件抄送。@Prasy,你的团队负责这封邮件吗?或者知道是谁负责的吗?“Niftylettuce, LLC,我们将不再向您收费”这句话让我怀疑邮件的收件者和内容有误。
结果:他们真的修复了这个问题!Mark Stuart 确认:
刚刚收到通知团队的通知,邮件模板已修复并正式上线。感谢您联系我们报告此问题。谢谢!
这表明他们能够在需要的时候解决问题——只是对于大多数问题他们选择不这么做。
2021:UI 改进建议
2021 年 2 月,我们对其仪表板 UI,特别是“PayPal 最近活动”部分提供了详细的反馈:
我认为paypal.com的仪表盘,特别是“PayPal近期活动”需要改进。我认为你们不应该显示$0的定期付款“已创建”状态行——这只会增加很多额外的行数,而且你无法一目了然地看到当天/过去几天的收入。
马克·斯图尔特将其转发给了消费者产品团队:
谢谢!我不确定哪个团队负责“活动”,但我已将其转发给消费者产品负责人,以便找到正确的团队。0.00 美元的定期付款似乎是一个 bug。应该过滤掉。
结果:问题从未修复。用户界面仍然显示这些无用的 $0 条目。
2021:沙盒环境故障
2021 年 11 月,我们报告了 PayPal 沙盒环境的严重问题:
- 沙盒 API 密钥被随机更改并禁用
- 所有沙盒测试帐户均被删除,恕不另行通知
- 尝试查看沙盒帐户详情时出现错误消息
- 间歇性加载失败
由于某种原因,我的沙盒 API 密钥被更改了,并且被禁用了。此外,我所有旧的沙盒测试帐户都被删除了。
有时候能加载,有时候加载不出来。这真是让人抓狂。
结果:没有回应,没有修复。开发人员仍然面临沙盒可靠性问题。
2021:报告系统完全崩溃
2021 年 5 月,我们报告称 PayPal 的交易报告下载系统已完全崩溃:
报告下载功能目前似乎无法使用,而且一整天都无法使用。如果失败,应该会收到电子邮件通知。
我们还指出了会话管理灾难:
另外,如果你在登录 PayPal 时有 5 分钟左右没有活动,你就会被注销。所以,当你再次刷新你想查看状态的报告旁边的按钮时(你得等很久),不得不重新登录,真是太麻烦了。
Mark Stuart 承认了会话超时问题:
我记得您过去曾报告过,当您在 IDE 和developer.paypal.com 或商家仪表板之间切换时,您的会话经常过期并中断您的开发流程,然后您会回来并再次被注销。
结果:会话超时仍为 60 秒。报告系统仍然经常出现故障。
2022:核心 API 功能缺失(再次)
2022 年 1 月,我们再次升级了订阅列表问题,这次更详细地说明了他们的文档是如何错误的:
没有列出所有订阅的 GET(以前称为计费协议)
我们发现他们的官方文件完全不准确:
API 文档也完全不准确。我们以为可以通过下载硬编码的订阅 ID 列表来解决这个问题。但这根本行不通!
从这里的官方文档来看...它说你可以这样做...问题是 - 根本没有任何地方可以找到需要勾选的“订阅 ID”字段。
PayPal 的 Christina Monti 回应道:
对于这些步骤错误造成的困扰,我们深感抱歉,我们将在本周修复该问题。
Sri Shivananda(首席技术官)对我们表示感谢:
感谢您一直以来的帮助,让我们变得更好。非常感谢。
结果:文档从未修复。订阅列表端点从未创建。
开发者体验噩梦
使用 PayPal 的 API 就像回到了十年前。以下是我们记录的技术问题:
损坏的用户界面
PayPal 开发者面板简直是一场灾难。以下是我们每天要处理的问题:



SDK 问题
- 无法同时处理一次性付款和订阅,除非采用复杂的变通方法,例如在使用脚本标签重新加载 SDK 时切换和重新渲染按钮
- JavaScript SDK 违反了基本约定(类名小写,没有实例检查)
- 错误消息未指示缺少哪些字段
- 数据类型不一致(要求使用字符串金额而不是数字)
内容安全政策违规行为
他们的 SDK 需要您的 CSP 中使用 unsafe-inline 和 unsafe-eval,迫使您损害网站的安全性。
文档混乱
马克·斯图尔特本人也承认:
同意,遗留 API 和新 API 的数量实在是太夸张了。真的很难找到要查找的内容(即使对于我们这些在这里工作的人来说也是如此)。
安全漏洞
PayPal 的 2FA 实现方式是倒退的。即使启用了 TOTP 应用,它们也会强制使用短信验证,这会使账户容易受到 SIM 卡交换攻击。如果您启用了 TOTP,它应该只使用 TOTP。备用方案应该是电子邮件,而不是短信。
会话管理灾难
他们的开发者控制面板会在你 60 秒不活动后自动注销。尝试做任何有用的事情,你都会不断经历:登录 → 验证码 → 双重认证 → 注销 → 重复。用 VPN 吗?祝你好运。
2025 年 7 月:最后一根稻草
同样的麻烦持续了11年,终于在一次例行账户迁移中出现了转折点。为了更清晰地记录账目,我们需要迁移到一个新的PayPal账户,以匹配我们的公司名称“Forward Email LLC”。
本来应该很简单的事情却变成了一场彻底的灾难:
- 初步测试显示一切正常
- 数小时后,PayPal 突然冻结所有订阅付款,且未另行通知
- 客户无法付款,造成混乱并加重了客服负担
- PayPal 客服给出的回复前后矛盾,声称账户已验证
- 我们被迫完全停止 PayPal 付款















为什么我们不能放弃 PayPal
尽管存在诸多问题,我们也无法完全放弃 PayPal,因为有些客户只选择 PayPal 作为付款方式。正如一位客户在我们的 状态页面 上所说:
PayPal 是我唯一的付款方式
我们只能支持一个有缺陷的平台,因为 PayPal 为某些用户创造了支付垄断权。
社区解决方案
由于 PayPal 不提供基本的订阅列表功能,开发者社区已构建了相应的解决方案。我们创建了一个脚本来帮助管理 PayPal 订阅:set-active-pypl-subscription-ids.js
此脚本引用了一个 社区要点,开发者可以在其中分享解决方案。用户实际上是 感谢我们,因为他们提供了 PayPal 多年前就应该构建的功能。
因网络钓鱼而阻止 PayPal 模板
问题不仅仅在于 API。PayPal 的电子邮件模板设计非常糟糕,以至于我们不得不在电子邮件服务中实施特定的过滤措施,因为它们与网络钓鱼攻击难以区分。
真正的问题:PayPal 的模板看起来像骗局
我们经常收到一些看似类似网络钓鱼的 PayPal 电子邮件报告。以下是我们从滥用报告中摘录的一个真实案例:
主题: [Sandbox] TEST - New invoice from PaypalBilling434567 sandbox #A4D369E8-0001
这封邮件被转发给了 abuse@microsoft.com
,因为它疑似网络钓鱼攻击。问题出在哪里?它实际上来自 PayPal 的沙盒环境,但其模板设计非常糟糕,以至于触发了网络钓鱼检测系统。
我们的实施
您可以在 电子邮件过滤代码 中看到我们针对 PayPal 实施的过滤功能:
// check for paypal scam (very strict until PayPal resolves phishing on their end)
// (seems to only come from "outlook.com" and "paypal.com" hosts)
//
// X-Email-Type-Id = RT000238
// PPC001017
// RT000542 = gift message hack
// RT002947 = paypal invoice spam
// <https://www.bleepingcomputer.com/news/security/beware-paypal-new-address-fraud/>
//
if (
session.originalFromAddressRootDomain === 'paypal.com' &&
headers.hasHeader('x-email-type-id') &&
['PPC001017', 'RT000238', 'RT000542', 'RT002947'].includes(
headers.getFirst('x-email-type-id')
)
) {
const err = new SMTPError(
'Due to ongoing PayPal invoice spam, you must manually send an invoice link'
);
err.isCodeBug = true; // alert admins for inspection
throw err;
}
我们为什么必须屏蔽 PayPal
我们实施这一措施的原因是,尽管我们多次向 PayPal 的滥用团队报告,但 PayPal 仍拒绝修复大量垃圾邮件/网络钓鱼/欺诈问题。我们阻止的电子邮件类型具体包括:
- RT000238 - 可疑发票通知
- PPC001017 - 付款确认问题
- RT000542 - 礼品信息被黑客入侵
问题的规模
我们的垃圾邮件过滤日志显示,我们每天处理的 PayPal 发票垃圾邮件数量巨大。被拦截的主题示例包括:
- PayPal 账单团队开具的发票:- 此费用将从您的账户中自动扣除。请立即致电 [电话] 联系我们。
- 公司名称 [公司名称] (订单号 [ORDER-ID]) 开具的发票。
- 包含多个不同电话号码和虚假订单号的发票
这些电子邮件通常来自 outlook.com
主机,但看似来自 PayPal 的合法系统,因此特别危险。由于这些电子邮件是通过 PayPal 的实际基础设施发送的,因此它们能够通过 SPF、DKIM 和 DMARC 身份验证。
我们的技术日志显示这些垃圾邮件包含合法的 PayPal 标头:
X-Email-Type-Id: RT000238
(与我们阻止的 ID 相同)From: "service@paypal.com" <service@paypal.com>
- 来自
paypal.com
的有效 DKIM 签名 - 显示 PayPal 邮件服务器的正确 SPF 记录
这就造成了一种不可能的情况:合法的 PayPal 电子邮件和垃圾邮件都具有相同的技术特征。
讽刺
PayPal 本应引领金融诈骗的斗争,但其电子邮件模板设计却极其糟糕,甚至会触发反钓鱼系统。我们被迫屏蔽合法的 PayPal 邮件,因为它们与诈骗邮件难以区分。
这在安全研究中有所记录:警惕PayPal新地址诈骗 - 展示了 PayPal 自己的系统如何被利用进行欺诈。
现实世界的影响:新型 PayPal 诈骗
问题不仅仅在于糟糕的模板设计。PayPal 的发票系统极易被利用,骗子经常滥用它来发送看似合法的欺诈性发票。安全研究员 Gavin Anderegg 记录了 新型 PayPal 骗局 的情况,骗子会通过所有身份验证检查,发送真实的 PayPal 发票:
“检查邮件来源后,发现这封邮件似乎真的来自 PayPal(SPF、DKIM 和 DMARC 均已通过)。按钮还链接到一个看似合法的 PayPal 网址……我愣了一下才意识到这是一封合法邮件。我刚刚收到一张骗子发来的随机“发票”。

研究人员指出:
“这似乎也算是一项 PayPal 应该考虑锁定的便捷功能。我立刻就觉得这是某种骗局,只对技术细节感兴趣。这看起来太容易上当了,我担心其他人也会上当。”
这完美地说明了问题所在:PayPal 自己的合法系统设计非常糟糕,以至于它们会导致欺诈,同时使合法通信看起来可疑。
更糟糕的是,这影响了我们与雅虎的交付能力,导致客户投诉以及数小时的细致测试和模式检查。
PayPal 的反向 KYC 流程
PayPal 平台最令人沮丧的一点是其在合规性和了解你的客户 (KYC) 流程方面的落后做法。与其他支付处理器不同,PayPal 允许开发者在未完成适当验证的情况下集成其 API 并开始在生产环境中收款。
工作原理
每个合法的支付处理器都遵循以下逻辑顺序:
- 首先完成 KYC 验证
- 批准商家账户
- 提供生产 API 访问权限
- 允许收款
通过确保任何资金易手之前的合规性,这可以保护支付处理商和商家。
PayPal 的实际运作方式
PayPal 的流程完全是倒退的:
- 立即提供生产 API 访问权限
- 允许收款持续数小时或数天
- 突然冻结付款,恕不另行通知
- 在客户已受到影响后要求提供 KYC 文件
- 不通知商户
- 让客户发现问题并报告
现实世界的影响
这种倒退的过程会给企业带来灾难:
- 客户在销售高峰期无法完成购买
- 没有提前警告需要验证
- 付款被阻止时没有电子邮件通知
- 商家从困惑的客户那里了解到问题
- 关键业务期间收入损失
- 付款神秘失败时客户信任受损
2025 年 7 月帐户迁移灾难
2025年7月,我们例行账户迁移时就曾遇到过类似的情况。PayPal最初允许付款,然后突然在没有任何通知的情况下将其屏蔽。直到客户开始反映无法付款,我们才发现这个问题。
当我们联系客服时,他们给出了自相矛盾的回复,要求我们提供所需的文件,并且没有明确的解决时间表。这迫使我们彻底停止了 PayPal 付款,让那些没有其他付款方式的客户感到困惑。
为什么这很重要
PayPal 的合规做法表明其对企业运营方式存在根本性的误解。正确的 KYC 应该在生产集成之前进行,而不是在客户尝试付款之后。当问题出现时,PayPal 缺乏主动沟通,这表明它与商家的需求脱节。
这种落后的流程是 PayPal 更广泛的组织问题的征兆:他们优先考虑内部流程而不是商家和客户体验,从而导致了导致企业远离其平台的运营灾难。
其他支付处理器如何正确运作
PayPal 拒绝实现的订阅列表功能,十多年来一直是行业标准。以下是其他支付处理商处理这一基本要求的方式:
条纹
Stripe 自 API 上线以来就提供了订阅列表功能。他们的文档清晰地展示了如何检索客户或商家账户的所有订阅。这被视为基本的 CRUD 功能。
桨
Paddle 提供全面的订阅管理 API,包括列表、筛选和分页。他们深知商家需要了解自己的经常性收入来源。
Coinbase 商务
甚至像 Coinbase Commerce 这样的加密货币支付处理器也比 PayPal 提供更好的订阅管理。
正方形
Square 的 API 将订阅列表作为一项基本功能,而不是事后才想到的功能。
行业标准
每个现代支付处理器都提供:
- 列出所有订阅
- 按状态、日期和客户筛选
- 大数据集分页
- 订阅变更的 Webhook 通知
- 包含实用示例的详尽文档
其他处理器与 PayPal 相比提供哪些功能
Stripe - 列出所有订阅:
GET https://api.stripe.com/v1/subscriptions
Authorization: Bearer sk_test_...
Response:
{
"object": "list",
"data": [
{
"id": "sub_1MowQVLkdIwHu7ixeRlqHVzs",
"object": "subscription",
"status": "active",
"customer": "cus_Na6dX7aXxi11N4",
"current_period_start": 1679609767,
"current_period_end": 1682288167
}
],
"has_more": false
}
Stripe - 按客户筛选:
GET https://api.stripe.com/v1/subscriptions?customer=cus_Na6dX7aXxi11N4
Stripe - 按状态过滤:
GET https://api.stripe.com/v1/subscriptions?status=active
PayPal - 您实际得到的是:
GET https://api.paypal.com/v1/billing/subscriptions/{id}
Authorization: Bearer access_token
# You can ONLY get ONE subscription if you already know the ID
# There is NO endpoint to list all subscriptions
# There is NO way to search or filter
# You must track all subscription IDs yourself
PayPal 的可用端点:
POST /v1/billing/subscriptions
- 创建订阅GET /v1/billing/subscriptions/{id}
- 获取一个订阅(如果您知道 ID)PATCH /v1/billing/subscriptions/{id}
- 更新订阅POST /v1/billing/subscriptions/{id}/cancel
- 取消订阅POST /v1/billing/subscriptions/{id}/suspend
- 暂停订阅
PayPal 缺少什么:
- ❌ 无
GET /v1/billing/subscriptions
(列出全部) - ❌ 无搜索功能
- ❌ 不支持按状态、客户和日期筛选
- ❌ 不支持分页
PayPal 是唯一一家强制开发人员在自己的数据库中手动跟踪订阅 ID 的主要支付处理商。
PayPal 的系统性掩盖:压制 600 万人的声音
最近,PayPal 将整个社区论坛下线,此举完美体现了 PayPal 处理批评的态度,实际上让 600 多万会员噤声,并删除了数十万条记录其失败的帖子。
大抹杀
paypal-community.com
上的原始 PayPal 社区拥有6,003,558 名成员,其中包含数十万条关于 PayPal API 故障的帖子、错误报告、投诉和讨论。这代表了 PayPal 十多年来系统性问题的记录证据。
2025年6月30日,PayPal悄悄下线了整个论坛。所有paypal-community.com
链接现在都返回404错误。这并非迁移或升级。
第三方救援
幸运的是,ppl.lithium.com 的第三方服务保留了部分内容,让我们能够访问 PayPal 试图隐藏的讨论。然而,第三方的保留并不完整,随时可能消失。
这种隐藏证据的做法对 PayPal 来说并不新鲜。他们有过这样的记录:
- 删除公众可见的关键错误报告
- 未经通知停止开发工具
- 更改 API 且未提供适当文档
- 禁止社区讨论其失败之处
论坛被关闭是迄今为止最肆无忌惮的企图,旨在掩盖其系统性失误,避免公众监督。
持续 11 年的捕获漏洞灾难:损失 1,899 美元,而且还在继续
当 PayPal 忙于组织反馈会议并做出承诺时,其核心支付处理系统却已彻底崩溃,长达 11 年之久。证据确凿。
转发电子邮件造成 1,899 美元损失
在我们的生产系统中,我们发现有 108 笔 PayPal 付款,总额达 1,899 美元,由于 PayPal 捕获失败而丢失。这些付款呈现出一致的模式:
- 已收到
CHECKOUT.ORDER.APPROVED
个 webhook - PayPal 的捕获 API 返回 404 错误
- 订单无法通过 PayPal API 访问
由于 PayPal 会在 14 天后完全隐藏调试日志,并从仪表板中删除未捕获的订单 ID 的所有数据,因此无法确定客户是否被收费。
这仅代表一家企业。超过11年来,数千家商户的集体损失可能高达数百万美元。
我们要再次声明:11 年多来,数千家商家的集体损失可能高达数百万美元。
我们发现这一点的唯一原因是因为我们非常细致并且以数据为导向。
2013 年原始报告:11 年以上的疏忽
关于此确切问题的最早记录报告出现在 2013 年 11 月 Stack Overflow (已归档) 上:
“使用 Rest API 进行捕获时不断收到 404 错误”
2013 年报告的错误与 Forward Email 在 2024 年遇到的错误相同:
{
"name": "INVALID_RESOURCE_ID",
"message": "The requested resource ID was not found",
"information_link": "https://developer.paypal.com/webapps/developer/docs/api/#INVALID_RESOURCE_ID",
"debug_id": "e56bae98dcc26"
}
2013 年社区的反应很有启发:
“目前 REST API 存在一个问题。PayPal 正在努力解决。”
11年多过去了,他们仍在“努力”。
2016 年承认:PayPal 破坏了他们自己的 SDK
2016年,PayPal 自己的 GitHub 代码库记录了 大规模捕获失败 对其官方 PHP SDK 的影响。影响规模之大令人震惊:
“自 2016 年 9 月 20 日起,所有 PayPal 数据捕获尝试均失败,并显示‘INVALID_RESOURCE_ID - 未找到请求的资源 ID’。9 月 19 日至 9 月 20 日期间,API 集成没有任何变化。自 9 月 20 日起,100% 的捕获尝试均返回此错误。”
一位商家报告说:
“我在过去 24 小时内有超过 1,400 次捕获尝试失败,所有尝试均出现 INVALID_RESOURCE_ID 错误响应。”
PayPal 最初的反应是指责商家,并让他们寻求技术支持。在巨大的压力之下,他们才承认了错误:
“我收到了产品开发人员的更新。他们注意到,在发送的标头中,PayPal 请求 ID 的长度为 42 个字符,但似乎最近进行了更改,将此 ID 的长度限制为 38 个字符。”
这一承认暴露了 PayPal 的系统性疏忽:
- 他们做出了未记录的重大更改
- 他们破坏了自己的官方 SDK
- 他们先指责商家
- 他们只在压力之下才承认错误
即使在“解决”该问题后,商家仍报告称:
“已将 SDK 升级至 v1.7.4,但问题仍然存在。”
2024 年升级:仍然失败
来自已保存的 PayPal 社区的最新报告显示,问题实际上变得更加严重。2024 年 9 月讨论 (已归档) 记录了同样的问题:
“该问题大约在两周前才开始出现,并且不会影响所有订单。更常见的问题似乎是捕获时出现 404 错误。”
商家描述了转发电子邮件所经历的相同模式:
“尝试捕获订单后,PayPal 返回 404。检索订单详细信息时:{'id': 'ID', 'intent': 'CAPTURE', 'status': 'COMPLETED', ..., 'final_capture': true, ...} 这没有任何表明我们成功捕获的痕迹。”
Webhook 可靠性灾难
另一个 保留社区讨论 揭示了 PayPal 的 webhook 系统从根本上来说是不可靠的:
“理论上,它应该有两个来自 Webhook 事件的事件(CHECKOUT.ORDER.APPROVED 和 PAYMENT.CAPTURE.COMPLETED)。实际上,这两个事件很少会立即收到,PAYMENT.CAPTURE.COMPLETED 大多数情况下都无法收到,或者会在几个小时后收到。”
对于订阅付款:
“有时无法收到‘PAYMENT.SALE.COMPLETED’,或者需要几个小时才能收到。”
商家的疑问揭示了 PayPal 可靠性问题的严重性:
- “为什么会发生这种情况?” - PayPal 的 Webhook 系统根本就存在问题
- “如果订单状态为‘已完成’,我可以认为我已经收到款项了吗?” - 商家无法信任 PayPal 的 API 响应
- “为什么‘事件日志’->Webhook 事件’找不到任何日志?” - 即使是 PayPal 自己的日志系统也无法正常工作
系统性疏忽模式
证据跨越了 11 年多的时间,并显示出清晰的模式:
- 2013:“PayPal 正在努力解决这个问题”
- 2016:PayPal 承认存在重大变更,并提供修复方案
- 2024:同样的错误仍在发生,影响了 Forward Email 和无数其他应用
这不是一个错误 - 这是系统性疏忽。PayPal 十多年来一直知道这些关键的支付处理故障,并且一直:
- 将 PayPal 漏洞归咎于商家
- 进行未记录的重大更改
- 提供的修复方案不充分且无效
- 忽视对企业的财务影响
- 通过关闭社区论坛来隐藏证据
未记录的要求
PayPal 的官方文档中从未提及商家必须为捕获操作实现重试逻辑。他们的文档指出商家应该“批准后立即捕获”,但却没有提到他们的 API 会随机返回 404 错误,需要复杂的重试机制。
这迫使每个商家:
- 实现指数退避重试逻辑
- 处理不一致的 webhook 传递
- 构建复杂的状态管理系统
- 手动监控失败的捕获
其他所有支付处理器均提供可靠的捕获 API,且首次运行。
PayPal 更广泛的欺骗模式
捕获错误灾难只是 PayPal 欺骗客户和隐藏故障的系统方法的一个例子。
纽约金融服务部行动
2025 年 1 月,纽约金融服务部针对欺骗行为发布了 针对 PayPal 的执法行动 警告,表明 PayPal 的欺骗模式远远超出了其 API 的范围。
此次监管行动表明 PayPal 愿意在其整个业务范围内采取欺骗行为,而不仅仅是在其开发工具范围内。
Honey 诉讼:重写联盟链接
PayPal 收购 Honey 导致 诉讼称 Honey 重写了联盟链接 窃取了内容创作者和网红的佣金。这体现了另一种系统性欺诈行为,PayPal 通过将本应归于他人的收入转移来牟利。
模式很清晰:
- API 故障:隐藏故障功能,将责任推卸给商家
- 社区禁言:消除问题证据
- 违反监管规定:从事欺诈行为
- 联盟营销盗窃:通过技术手段窃取佣金
PayPal 疏忽的代价
Forward Email 的 1,899 美元损失只是冰山一角。请考虑更广泛的影响:
- 个人商户:数千家商家每家损失数百甚至数千美元
- 企业客户:潜在数百万美元的收入损失
- 开发人员耗费大量时间:他们耗费大量时间构建 PayPal 漏洞 API 的变通方案
- 客户信任:企业因 PayPal 支付失败而失去客户
如果一个小型电子邮件服务损失近 2,000 美元,并且这个问题已经存在了 11 年以上,影响了数千家商家,那么集体财务损失可能总计数亿美元。
文档谎言
PayPal 的官方文档始终未提及商家可能遇到的关键限制和错误。例如:
- 捕获 API:未提及 404 错误很常见且需要重试逻辑
- Webhook 可靠性:未提及 Webhook 通常会延迟数小时
- 订阅列表:文档暗示即使不存在端点也可以列出订阅
- 会话超时:未提及激进的 60 秒超时
这种系统性的关键信息遗漏迫使商家在生产系统中反复试验以发现 PayPal 的局限性,这常常导致财务损失。
这对开发者意味着什么
PayPal 在收集大量反馈的同时,却未能系统性地满足开发者的基本需求,这暴露出一个根本性的组织问题。他们把收集反馈当成了解决问题的替代品。
模式很清晰:
- 开发人员报告问题
- PayPal 组织高管反馈会议
- 提供详尽的反馈
- 团队承认差距并承诺“跟踪并解决”
- 未实施任何措施
- 高管跳槽至更好的公司
- 新团队寻求相同的反馈
- 循环往复
与此同时,开发人员被迫构建变通方法、损害安全性并处理损坏的用户界面才能接受付款。
如果您正在构建支付系统,请借鉴我们的经验:构建包含多个处理器的 三连胜方法,但不要指望 PayPal 能够提供您所需的基本功能。从第一天起,就应制定变通方案。
这篇文章记录了我们在 Forward Email 使用 PayPal API 11 年的经验。所有代码示例和链接均来自我们的实际生产系统。尽管存在这些问题,我们仍继续支持 PayPal 付款,因为有些客户别无选择。
