You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Stripe生产环境集成报错:非测试模式下账户令牌需用发布密钥创建

解决Stripe生产环境账户令牌创建的InvalidRequest错误

嘿,我前阵子刚踩过这个一模一样的坑!本地测试跑起来毫无问题,一上生产环境直接触发致命错误,其实核心原因就是Stripe在生产环境严格执行了合规限制,而测试模式下的宽松规则到生产就不适用了。

问题根源

先给你拆解下这个错误的核心逻辑:

非测试模式下,账户令牌只能通过应用的publishable key创建。您应仅在客户端应用(例如使用Stripe.js或Android、iOS SDK)中创建账户令牌,绝不能在应用服务器端创建,否则可能违反相关合规规定。

Stripe这么限制是为了避免敏感的账户信息流经你的服务器——账户令牌关联的是卖家/用户的账户敏感数据,如果在服务器端生成令牌,你的服务器就会接触到这些敏感信息,会触发更严格的PCI合规要求,所以生产环境强制要求必须在客户端用publishable key生成令牌,服务器只负责接收令牌并完成后续操作。

修复步骤

我当时是这么解决的,你可以照着一步步来:

  • 把账户令牌生成逻辑迁移到客户端
    比如用前端的Stripe.js实现,给你个简单的示例:

    // 前端引入Stripe.js,用你的生产环境publishable key初始化
    const stripe = Stripe('pk_live_xxxxxxxxx');
    
    // 收集用户账户信息后,在客户端创建账户令牌
    const createAccountToken = async (accountData) => {
      const { token } = await stripe.createToken('account', accountData);
      // 把生成的token.id传给你的服务器端
      return token.id;
    };
    

    如果是移动端应用,就用Stripe官方的Android/iOS SDK,逻辑完全一致:用publishable key在客户端生成令牌,再把令牌ID传给服务器。

  • 服务器端仅处理令牌的后续操作
    服务器端绝对不要再尝试生成账户令牌,只需要接收客户端传过来的令牌ID,用生产环境的secret key完成账户创建或关联操作就行,比如PHP的示例:

    // 服务器端初始化Stripe SDK,用生产环境secret key
    \Stripe\Stripe::setApiKey('sk_live_xxxxxxxxx');
    
    // 接收客户端传递的账户令牌ID
    $tokenId = $_POST['account_token'];
    
    // 使用令牌创建账户
    $account = \Stripe\Account::create([
      'type' => 'express',
      'token' => $tokenId,
      // 其他必要的账户配置参数
    ]);
    
  • 检查环境配置是否正确
    别犯低级错误:生产环境的前端必须用生产的publishable key(以pk_live开头),服务器端用生产的secret key(以sk_live开头),千万不要和测试环境的密钥搞混了。

额外提醒

千万不要在生产环境的服务器端用secret key生成账户令牌,这不只会触发错误,还可能违反Stripe的服务条款和PCI合规要求,得不偿失。测试模式下允许这么做只是为了方便开发调试,生产环境必须严格遵守客户端生成令牌的规则。

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

火山引擎 最新活动