【问题标题】:Stripe checkout wont accept metadataStripe checkout 不接受元数据
【发布时间】:2019-09-08 16:14:47
【问题描述】:

我已经集成了 Stripe 结账(最新版本),需要发送额外的数据,以便我可以协调以后的 webhook。

Stripe 拒绝元数据并出现以下错误

Fatal error: Uncaught exception 'Stripe\Error\InvalidRequest' with message 'Received unknown parameter: metadata' 

我的部分编辑代码如下所示

$object = \Stripe\Checkout\Session::create([
    'success_url' => 'www/payment_processor.php?action=success',
    'cancel_url' => 'www/payment_processor.php?action=cancel',
    'payment_method_types' => ['card'],
    'customer_email' => $email,
    'metadata' => ['user_id' => $user_id],
    'line_items' => [[
        'amount' => $amount,
        'currency' => $currency,
        'name' => 'Purchase',
        'description' => $description,
        'quantity' => 1,
    ]]
]);

Stripe documentation 中所述,我希望元数据被接受并与 webhook 一起返回。

【问题讨论】:

  • 我遇到了类似的问题。能够为项目添加某种 ID 会很方便。
  • 最后我添加了属性 - client_reference_id 并使用了逗号分隔的值列表。唯一的问题是 client_reference_id 仅针对已完成的结帐会话返回,而不是收费成功事件。

标签: php stripe-payments


【解决方案1】:

对于仍然遇到此问题的任何人,即使使用 2020-08-27 API,简单地放置 client_reference_idmetadata 参数对我也不起作用。

添加带有元数据的payment_intent_data 是它为我工作的原因。您可以尝试添加以下代码:

'payment_intent_data'=>['metadata' => ["order_id" => $orderID, "type" => "myProduct"],

【讨论】:

  • 是的,但这仅适用于payment 模式
【解决方案2】:

你可以这样做

stripe.checkout.sessions.create({
    payment_intent_data: {
        application_fee_amount: this.booking_fee,
        metadata: {
            key1 : value1,
            key2 : value2,
            .
            .
            key N : value N
        }
    }
})

【讨论】:

  • 你可以这样做很酷,我似乎无法让它工作。 Stripe 不断拒绝“空元数据”声明,即使元数据属性显然是 json
【解决方案3】:

链接文档的第一句话指出:

可更新的 Stripe 对象——包括Account、Charge、Customer、PaymentIntent、Refund、Subscription 和 Transfer——具有元数据参数。

这两个都不是你创建的,你是在创建一个Session

【讨论】:

  • 我明白了。谢谢。他们如何协调 Stripe 处理的交易与我网站上的客户。看来这将是一个通常需要的操作。
  • 如果我理解您的评论正确,您可能正在寻找会话对象的 client_reference_id 属性:“引用结帐会话的唯一字符串。这可以是客户 ID 、购物车 ID 或类似名称,并可用于将会话与您的内部系统进行协调。”
  • 投反对票,因为这只是指出如果不提供 user13688383 在下面的答案中所做的解决方案,它就不应该工作。
  • @MarkusKnappenJohansson 从技术上讲,OP 没有提出任何具体要求,因此不可能有明确的解决方案。我指出会话不接受 OP 预期的元数据,因此澄清了问题。
  • 创建会话时,元数据应如下所示:payment_intent_data: { metadata: {platform: (data.platform || 'unsure')} }
【解决方案4】:

您无法将元数据附加到Session,但您可以将元数据附加到将在会话中创建的payment_intentsetup_intent

看到the documentation,你把它传递为payment_intent_data.metadata

请注意,Stripe warns you 不要将敏感数据放入 metadata,因此如果您想存储客户端名称等,最好将其放入数据库中的唯一键下,然后将键传递为client_reference_id.

【讨论】:

  • 将元数据添加到付款意图会在 Web UI 中显示元数据 - 将元数据添加到实际付款不会显示它
【解决方案5】:

截至 2020 年 10 月,会话对象具有元数据。

【讨论】:

  • 是的,但它似乎没有正确返回它。但是通过payment_intent_data.metadata 传递它是有效的。或者也许只是我。
  • 不只是你。将metadata 设置为会话只会在checkout.session.completed 事件被触发时返回。
【解决方案6】:

其他答案是正确的,metadata 在 Session 对象上不存在。 client_reference_id 是另一种选择,但它必须是唯一的,并且必须是字符串。

如果您只希望元数据显示在 Stripe Dashboard 中的购买上,请在创建会话时使用 payment_intent_data 属性。这就是您将元数据附加到会话期间进行的购买的方式。 Relevant documentation here.

【讨论】:

    【解决方案7】:

    Stripe Session 对象不接受 metadata 作为参数。 See here 了解详情。

    您问题中的reference you give 是针对 确实 接受元数据的 Stripe Charge 对象。

    【讨论】:

      【解决方案8】:

      如果您像我一样遇到需要将一些信息(例如客户 ID、订单 ID 等)捆绑到条带上。有一个名为 payment_intent_data 的参数,它是一个关联数组。在 payment_intent_data 中,您有一个名为 description 的属性,您可以使用它来嵌入一些额外的信息。当您在条带上执行 csv 付款导出时,您在此处输入的描述将显示在描述字段中。

      https://stripe.com/docs/api/checkout/sessions/create#create_checkout_session-payment_intent_data-description

                    $stripe_session = \Stripe\Checkout\Session::create([
                    'submit_type' => 'pay',
                    'billing_address_collection' => 'required',
                    'customer' => $customer,            
                    'client_reference_id' => $customer ,
                    'payment_intent_data'=>['description' =>'This is my description'],
                    'payment_method_types' => ['card'],
                    'line_items' => [[
                      'name' => $event->title,
                      'description' => $description/*This description does not go on csv export, it's more or less cosmetic */,               
                      'amount' => ($fee),
                      'currency' => 'gbp',
                      'quantity' => 1,
                    ]],
                    'success_url' => 'example.com',
                    'cancel_url' => 'example.com',
                  ]);
      
      
      

      【讨论】:

        【解决方案9】:

        元数据必须嵌套在 Session 创建对象中:

        Stripe 的文档错误地将元数据列为父级 (https://stripe.com/docs/api/checkout/sessions/create),而实际上它是子级:

        https://support.stripe.com/questions/using-metadata-with-checkout-sessions

        1. payment_intent_data.metadata
        2. subscription_data.metadata

        client_reference_id 仅与 Session 相关联,不会作为元数据存储在 Stripe 中。

        【讨论】:

          猜你喜欢
          • 2021-06-10
          • 2021-04-02
          • 2014-03-09
          • 2021-02-10
          • 2021-10-04
          • 2023-03-22
          • 2021-03-10
          • 1970-01-01
          • 2020-09-17
          相关资源
          最近更新 更多