У меня есть приложение laravel, в котором я хочу включить платежи Stripe, особенно асинхронный поток с использованием веб-хуков! Я еще не пользовался веб-крючками, поэтому я в замешательстве и у меня есть несколько вопросов:
Сначала я создаю paymentIntent на сервере и отправляю секрет PI на клиент.
public function createPaymentIntent(Request $request)
{
$intent = PaymentIntent::create([
'setup_future_usage' => 'off_session',
'amount' => 1099,
'currency' => 'usd',
]);
return response()->json([
'intent_secret' => $intent->client_secret,
], 200);
}
Теперь в клиенте я выполняю подтверждающую оплату, это возвращает Обещание
this.stripe.confirmCardPayment(
this.intent_secret,
{
payment_method: {card: this.cardNumberElement}
}
)
.then(function(result)
{
if (result.error)
{
// Display error.message in your UI.
}
else
{
// The payment has succeeded
// Display a success message
}
});
Теперь, когда это сбивает с толку, очевидно, мне нужно настроить webhooks для прослушивания, когда авторизация / оплата завершена, я проверил документы и я спас их пример PHP в мой код laravel, но у меня так много вопросов:
public function stripeWebhook(Request $request)
{
// You can find your endpoint's secret in your webhook settings
$endpoint_secret = config('services.stripe.webhooksecret');
$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;
try
{
$event = \Stripe\Webhook::constructEvent($payload, $sig_header, $endpoint_secret);
}
catch(\UnexpectedValueException $e)
{
// Invalid payload
return response()->json([
'message' => 'Invalid payload',
], 200);
}
catch(\Stripe\Exception\SignatureVerificationException $e)
{
// Invalid signature
return response()->json([
'message' => 'Invalid signature',
], 200);
}
if ($event->type == "payment_intent.succeeded")
{
//As I understand here is where I should do things like send order info by mail and deplete stock accordingly
$intent = $event->data->object;
//$this->completeOrderInDatabase()
//$this->sendMail();
return response()->json([
'intentId' => $intent->id,
'message' => 'Payment succeded'
], 200);
}
elseif ($event->type == "payment_intent.payment_failed")
{
//Payment failed to be completed
$intent = $event->data->object;
$error_message = $intent->last_payment_error ? $intent->last_payment_error->message : "";
return response()->json([
'intentId' => $intent->id,
'message' => 'Payment failed: '.$error_message
], 400);
}
}
Итак, сначала я должен создать POST-маршрут domain.com/webhook, откуда я буду звонить мой метод webhookController?
Во-вторых, что такое полезная нагрузка и подпись? это похоже на обязательные параметры, но я не знаю, что именно они ...
Где я должен прикрепить способ оплаты к клиенту? В документах я должен получить способ оплаты от объекта PaymentIntent, но он есть у клиента или сервера.
https://stripe.com/docs/payments/payment-intents/migration#saving -cards-checkout
Из документы:
$payment_method = \Stripe\PaymentMethod::retrieve('{{PAYMENT_METHOD_ID}}');
$payment_method->attach(['customer' => '{{CUSTOMER_ID}}']);