Stripe:处理多个 Webhook

Que*_*ron 3 php payment webhooks stripe-payments

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

我对两者都使用Stripe Checkout Session。由于他们的流程不同,我使用了两个 webhook;每人一份。

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

问题是,一旦结账会话完成,无论是订阅还是事件注册,两个 webhook 都会被触发

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

小智 5

两个 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",
]);
Run Code Online (Sandbox Code Playgroud)

结帐会话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",
]);
Run Code Online (Sandbox Code Playgroud)

请注意,上面两个示例中的元数据有所不同。

现在,使用 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

}
Run Code Online (Sandbox Code Playgroud)

一些有用的提示:

您可以将会话 ID 从 checkout.session start 传递到成功页面或挂钩,然后获取数据...

结账会话页面

'success_url' => "https://www.example.co.uk/success?session_id={CHECKOUT_SESSION_ID}",
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

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