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 你的结果等,你很快就会看到发生了什么。
| 归档时间: |
|
| 查看次数: |
2627 次 |
| 最近记录: |