gpt4 book ai didi

php - Stripe : handle multiple Webhooks

转载 作者:行者123 更新时间:2023-12-05 02:56:59 25 4
gpt4 key购买 nike

我正在从事一个项目,该项目有两种类型的产品:订阅事件注册

我正在使用 Stripe Checkout Session对彼此而言。由于他们的过程不同,我使用了两个 webhooks;一人一份。

例如:
http://example.com/payment/subscription_webhooks.php
http://example.com/payment/event_webhooks.php

问题在于,一旦结帐 session 完成,无论是订阅还是事件注册,都会触发两个 webhook

我正在寻找一种解决方案来定义应该触发哪个 webhook。

最佳答案

两个 session.complete 触发器都有 1 个端点,但将元数据发送到端点并将 IF 语句扔到您的监听器中,以便您可以看到您正在监听哪个 session 。

这是我写的一些代码。

结帐 session A:

$checkout_session = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],

'line_items' => [[
'price_data' => [
'currency' => 'gbp',
'unit_amount' => '1000',
'product_data' => [
'name' => 'Example Product',
],
],
'quantity' => 1,
]],

'metadata' => ["session" => "session_a"],

'mode' => 'payment',

'success_url' => "https://www.example.co.uk/success",
'cancel_url' => "https://www.example.co.uk/cancel",
]);

结帐 session B:

$checkout_session = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],

'line_items' => [[
'price_data' => [
'currency' => 'gbp',
'unit_amount' => '1000',
'product_data' => [
'name' => 'Example Product',
],
],
'quantity' => 1,
]],

'metadata' => ["session" => "session_b"],

'mode' => 'payment',

'success_url' => "https://www.example.co.uk/success",
'cancel_url' => "https://www.example.co.uk/cancel",
]);

请注意,上述 2 个示例中的元数据不同。

现在,使用 SWITCH 和 CASE 找到您正在收听的那个。

网络钩子(Hook)

$payload = @file_get_contents('php://input');
$event = null;

try {

$event = \Stripe\Event::constructFrom(json_decode($payload, true));

} catch(\UnexpectedValueException $e) {

http_response_code(400);
exit();

}

switch($event->data->object->metadata['package']) {

case 'session_a':

// Do your Session A stuff, SQL etc

break;

case 'session_b':

// Do your Session B stuff, SQL etc

}

一些有用的提示:

您可以将 session ID 从您的 checkout.session 开始传递到您的成功页面或 Hook ,然后获取数据...

结帐 session 页面

'success_url' => "https://www.example.co.uk/success?session_id={CHECKOUT_SESSION_ID}",

session_id={CHECKOUT_SESSION_ID} 与我写的完全一样,您实际上不需要输入结帐 session ID,只需照原样复制即可。

Hook 页面或成功页面

if($_GET['session_id']){

$session_id = $_GET['session_id'];

}
$stripe = new \Stripe\StripeClient('API key');

$session_data = $stripe->checkout->sessions->retrieve($session_id,[]);

$payment_status = $session_data->payment_status;

$payment_address0 = $session_data->shipping->name;
$payment_address1 = $session_data->shipping->address->line1;
$payment_address2 = $session_data->shipping->address->line2;
$payment_address3 = $session_data->shipping->address->city;
$payment_address4 = $session_data->shipping->address->country;
$payment_address5 = $session_data->shipping->address->postal_code;

$payment_buyer_email = $session_data->customer_details->email;

$payment_metadata = $session_data->metadata->user_id;

您可以获取数据,只需查看 Stripe 文档中的 JSON 响应即可。

任何学习 Stripe 的人,一切看起来都很困惑,但继续尝试、测试、var_dump 你的结果等,你很快就会看到发生了什么。

关于php - Stripe : handle multiple Webhooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59995848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com