You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js+Stripe实现账户间转账提现遇ERR_ASSERTION错误求助

排查Stripe转账/提现中的ERR_ASSERTION错误

我来帮你搞定这个ERR_ASSERTION错误的问题~首先得明确,这个错误是Node.js断言模块抛出来的,说明代码(大概率是Stripe SDK内部)有个检查没通过——预期某个值是true,但实际是false。结合你的代码和场景,我整理了几个实用的排查方向:

1. 先搞对API:Transfer和Payout别用混

你说要做“提现功能”,但当前代码用的是stripe.transfers.create——这个API是给Stripe账户之间转账用的(比如平台给关联的子账户打钱),而如果是从Stripe账户把钱提现到用户的银行卡/银行账户,应该用stripe.payouts.create。用错API很可能触发SDK内部的参数断言检查失败,这是常见坑!

如果是提现场景,把代码改成这样试试:

const payoutState = await stripe.payouts.create({
  amount: 400, // 注意单位是分,400就是4美元
  currency: 'usd',
  destination: targetId, // 这里的targetId得是用户关联的bank_account或card的ID,比如ba_xxx或card_xxx
});

2. 修复变量作用域的小问题

你代码里先声明了let payoutState = null;,然后在内部try块里又用const payoutState = ...重新声明,这会导致内部的变量把外部的给覆盖了——等catch块里访问payoutState时,拿到的还是最开始的null,虽然这不一定是断言错误的直接原因,但会让你的错误日志不准,建议统一改成:

let payoutState = null;
try {
  payoutState = await stripe.transfers.create({ // 去掉const,直接赋值给外层的变量
    amount: 400,
    currency: 'usd',
    destination: targetId,
    source_type: 'bank_account',
  });
  // ... 你的记录逻辑
} catch (error) {
  return ctx.send(null, { error, payoutState, });
}

3. 仔细核对Stripe参数的合法性

断言错误一般都是参数不符合SDK预期导致的,你可以逐一检查:

  • targetId(也就是cardInfo.account_id):如果是转账场景,得是有效的Stripe连接账户ID(格式acct_xxx);如果是提现场景,得是用户关联的银行账户/银行卡ID(ba_xxx/card_xxx),别传错格式。
  • amount参数:确保是整数(Stripe用分做单位),USD的最小金额是1分,你的400是合法的,但要确认币种和金额匹配。
  • 账户状态:检查你的Stripe平台账户是否有足够余额,连接的子账户(如果用转账)是否完成了身份验证,这些都可能导致底层断言失败。

4. 试试升级/降级Stripe SDK版本

有时候SDK内部的断言逻辑在某个版本可能有bug,你可以先升级到最新版试试:

npm install stripe@latest

如果最新版还是有问题,降级到一个稳定的旧版本(比如stripe@12.0.0)再测试,说不定能解决问题。

5. 打印完整错误堆栈定位根源

你可以在catch块里打印错误的完整堆栈信息,这样能精准找到是SDK哪一行代码触发的断言:

catch (error) {
  console.error('Stripe错误详情:', error.stack);
  return ctx.send(null, { error, payoutState, });
}

看堆栈里的文件路径和行号,就能知道是哪个参数或逻辑导致的断言失败,排查起来更高效。


内容的提问来源于stack exchange,提问作者user11847513

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:17