我正在研究一个包含两种产品的项目:订阅和事件注册。
我同时使用this doc。由于他们的过程不同,因此我使用了两个webhook。每个一个。
例如:
http://example.com/payment/subscription_webhooks.php
http://example.com/payment/event_webhooks.php
问题在于,一旦结帐会话完成,无论是用于订阅还是事件注册,都会同时触发两个网络钩子。
我正在寻找一种定义应该触发哪个webhook的解决方案。
答案 0 :(得分:1)
我遇到了完全相同的问题。
两个 session.complete 触发器都有 1 个端点,但将元数据发送到端点并将 IF 语句扔到您的侦听器中,以便您可以查看您正在侦听的会话。
这是我写的一些代码。
结帐会话 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",
]);
结帐会话 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",
]);
请注意,上面两个示例中的元数据是不同的。
现在,使用 SWITCH 和 CASE 查找您正在收听的歌曲。
网络钩子
$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
}
一些有用的提示:
您可以将会话 ID 从您的 checkout.session 开始传递到您的成功页面或钩子,然后抓取数据...
结帐会话页面
'success_url' => "https://www.example.co.uk/success?session_id={CHECKOUT_SESSION_ID}",
session_id={CHECKOUT_SESSION_ID} 与我写的完全一样,您实际上不需要输入结帐会话 ID,只需照字面写的完全复制即可。
挂钩页面或成功页面
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;
您可以获取数据,只需查看 JSON 响应的 Stripe 文档即可。
任何学习 Stripe 的人,似乎都令人困惑,但继续尝试、测试、var_dump 你的结果等,你很快就会看到发生了什么。坚持下去。
我希望这对任何人都有帮助。多爱。
答案 1 :(得分:0)
您可以通过仪表板或API [1]在Stripe上创建一个Webhook端点,并在这样做时指定要通知的事件类型。
您可能希望删除这些webhook端点之一,并仅对所有checkout.session.completed事件使用一个。
答案 2 :(得分:0)
您只需要 1 个 webhook 端点,然后您可以为这些订阅的每个事件(在您的情况下为 subscriptions
和 event registration
)处理 switch case(或者如果其他)。
我和你一样,不知道如何区分 subscriptions
是什么事件,event registration
是什么事件。