Stripe webhook 未返回我的所有元数据

问题描述 投票:0回答:2

使用 PHP,当我生成 Stripe 会话时,我将 10 个不同的键:值对传递给元数据参数,如下所示:

  $checkout_session = \Stripe\Checkout\Session::create([
    'payment_method_types' => ['card'],
    'client_reference_id' => $accountnumber,
    'mode' => 'payment',
    'line_items' => [[
      'price_data' => [
        'currency' => $currencycode,
        'product_data' => [
          'name' => 'Invoice Total',
        ],
        'unit_amount' => $invoicetotal,
      ],
      'quantity' => 1,
    ]],
    'payment_intent_data' => [
      'application_fee_amount' => $timesavrfee,
      'receipt_email' => $payeremail
    ],
    'success_url' => $successurl.'?session_id={CHECKOUT_SESSION_ID}&cid='.$companyid,
    'cancel_url' => $cancelurl.'?session_id={CHECKOUT_SESSION_ID}&cid='.$companyid,
    'metadata' => ['familyid'=>$familyid,
                   'transactionreference'=>$transactionreference,
                   'companyid'=>$companyid,
                   'paymenttype'=>$paymenttype,
                   'payer'=>$primarypayer,
                   'invoicedate'=>$invoicedate,
                   'feecomment'=>$feecomment,
                   'feeamount'=>$feeamount,
                   'processingfeeschargeitem'=>$processingfeeschargeitem,
                   'passonprocessingfees'=>$passonprocessingfees]
  ],['stripe_account' => $accountid]);

我已经通过记录我传入的值来确认我拥有所有这些值,但是我从 Stripe 收到的“checkout.session.completed”事件的 Webhook 只返回给我其中的六个这十个价值观。 我并不是说它为其他四个返回空白,我的意思是其他四个甚至不存在于返回中。 我通过查看 Stripe 仪表板中的 webhook 历史记录确认了这一点。 返回的元数据部分如下所示:

"metadata": {
    "payer": "M",
    "companyid": "2142",
    "invoicedate": "2024-01-26 00:00:00",
    "paymenttype": "ONL",
    "transactionreference": "1157",
    "familyid": "29764010"
  },

如您所见,我缺少以下四个值:

  • 收费评论
  • 费用
  • 加工费收费项目
  • 传递处理费

根据 Stripe 文档,我最多可以传入 50 个键,每个键长度最多 40 个字符,所以我知道我不会打破这些限制。 我的价值观也不接近 500 个字符长。

您最多可以指定 50 个键,键名称最长为 40 个字符 值最长可达 500 个字符。

那么,当前六个值工作得很好时,为什么我没有收到其他四个值?

stripe-payments
2个回答
0
投票

Stripe 不会过滤事件中的元数据,因此如果您设置了这些元数据值,那么它们将出现在事件中。这可能意味着您认为您正在设置这些值,但它们是空/空并且被忽略。您应该能够在创建该结账会话的仪表板中查看 API 请求日志,并确认您发送的元数据不是您所期望的。

您还可以通过强制创建 20 个元数据键/值对来快速确认其按预期工作,并在生成的事件中查看这些键/值对。这是执行此操作的一些基本代码:

$metadata = [];
for($i = 0; $i < 20; $i++) {
  $key = "key $i";
  $value = "value $i";
  $metadata[$key] = $value;
}

$checkoutSession = $stripe->checkout->sessions->create([
  'allow_promotion_codes' => true,
  'success_url' => 'https://example.com/success?return=true',
  'line_items' => [
    [
      'price' => 'price_123',
      'quantity' => 1,
    ],
  ],
  'metadata' => $metadata,
  'mode' => 'payment',
]);

如果您完成使用此代码创建的结帐会话,您将立即看到事件中的

metadata
具有从
key 0
key 19
的所有 20 个键,如预期。


0
投票

keys
中元数据的
paymentIntent
必须与付款确认相同,否则只会保存匹配的。

注意无需重新发送确认元数据中的所有内容,仅发送已更改且需要更新的内容。

创建付款意向

await stripe.paymentIntents.create({
  amount: body.amount,
  metadata: {
    product_id: body.metadata.product_id,
    user_id: body.metadata.user_id,
  },
})

确认付款意向

await stripe.confirmCardPayment(paymentIntent.clientSecret, {
  payment_method: {
    card: cardNumberElement,
    metadata: {
      product_id: product?.uid,
      user_id: user?.uid,
    }
  },
})
© www.soinside.com 2019 - 2024. All rights reserved.