条纹:处理多个Webhooks

时间:2020-01-30 23:07:49

标签: php stripe-payments webhooks payment

我正在研究一个包含两种产品的项目:订阅事件注册

我同时使用this doc。由于他们的过程不同,因此我使用了两个webhook。每个一个。

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

问题在于,一旦结帐会话完成,无论是用于订阅还是事件注册,都会同时触发两个网络钩子

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

3 个答案:

答案 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事件使用一个。

[1] https://stripe.com/docs/api/webhook_endpoints/create

答案 2 :(得分:0)

您只需要 1 个 webhook 端点,然后您可以为这些订阅的每个事件(在您的情况下为 subscriptionsevent registration)处理 switch case(或者如果其他)。

我和你一样,不知道如何区分 subscriptions 是什么事件,event registration 是什么事件。