使用 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 不会过滤事件中的元数据,因此如果您设置了这些元数据值,那么它们将出现在事件中。这可能意味着您认为您正在设置这些值,但它们是空/空并且被忽略。您应该能够在创建该结账会话的仪表板中查看 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 个键,如预期。
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,
}
},
})