{"id":4212,"date":"2024-12-13T11:34:58","date_gmt":"2024-12-13T11:34:58","guid":{"rendered":"https:\/\/www.rcvtechnologies.com\/blog\/?p=4212"},"modified":"2024-12-13T11:39:53","modified_gmt":"2024-12-13T11:39:53","slug":"webhooks-in-payment-gateway-and-authorization","status":"publish","type":"post","link":"https:\/\/www.rcvtechnologies.com\/blog\/webhooks-in-payment-gateway-and-authorization\/","title":{"rendered":"Webhooks in Payment Gateway And Authorization"},"content":{"rendered":"<p>What are Webhooks ?<\/p>\n<p>A <strong>webhook<\/strong> is a way for one system to send real-time data to another system whenever a specific event occurs. Unlike APIs that require polling (periodically checking for updates), webhooks allow you to &#8220;subscribe&#8221; to events so the data gets sent to you immediately when the event happens. Webhooks are lightweight and efficient because they only send data when triggered.<\/p>\n<h3>How Does a Webhook Work?<\/h3>\n<ol>\n<li><strong>Setup<\/strong>: A client (your system) provides a callback URL to the server (the service you&#8217;re using). This URL is the endpoint where the server will send data when an event occurs.<\/li>\n<li><strong>Trigger<\/strong>: An event occurs on the server, such as a new customer signing up or an order being completed.<\/li>\n<li><strong>Notification<\/strong>: The server sends an HTTP POST request to the client&#8217;s callback URL with details of the event (usually in JSON or XML format).<\/li>\n<li><strong>Processing<\/strong>: The client receives the request, processes the data, and responds (e.g., with a <code>200 OK<\/code> status code to acknowledge receipt).<strong><strong>Managing Net Off Scenarios in Payment Processing and API Responses<\/strong><\/strong>&nbsp;<br \/>\n<h3><strong>What is a Net Off Scenario in Payment Processing?<\/strong><\/h3>\n<p>A <strong>net off scenario<\/strong> occurs when a payment transaction appears successful from the user&#8217;s perspective but does not fully process or settle on the backend due to various reasons, such as:<\/p>\n<ol>\n<li><strong>Network Issues<\/strong>: Connectivity problems during the payment confirmation phase.<\/li>\n<li><strong>Gateway Errors<\/strong>: Payment gateway processes the transaction but fails to notify your server due to internal errors.<\/li>\n<li><strong>Delayed Processing<\/strong>: Payment gets queued or delayed in the gateway or banking system.<\/li>\n<li><strong>Server Timeout<\/strong>: Your server or the gateway server times out while awaiting a response.<\/li>\n<li><strong>Webhook Failures<\/strong>: The webhook notification from the gateway fails to reach your server.<\/li>\n<\/ol>\n<p>In such cases, reconciliation between the user experience and the actual transaction status is crucial.<\/p>\n<p>In Laravel Use Given Code as Below For Capturing Different event of WebHook<\/p>\n<div>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#000;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">public function handleWebhook(Request $request)\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 Stripe::setApiKey(env('STRIPE_SECRET'));\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 $payload = $request-&gt;getContent();\r\n\u00a0 \u00a0 \u00a0 \u00a0 $sig_header = $request-&gt;header('Stripe-Signature');\r\n\u00a0 \u00a0 \u00a0 \u00a0 $endpoint_secret = env('STRIPE_WEBHOOK_SECRET');\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 try {\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $event = Webhook::constructEvent($payload, $sig_header, $endpoint_secret);\r\n\u00a0 \u00a0 \u00a0 \u00a0 } catch (\\UnexpectedValueException $e) {\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return response()-&gt;json(['error' =&gt; 'Invalid payload'], 400);\r\n\u00a0 \u00a0 \u00a0 \u00a0 } catch (\\Stripe\\Exception\\SignatureVerificationException $e) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Invalid signature\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return response()-&gt;json(['error' =&gt; 'Invalid signature'], 400);\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 DB::beginTransaction();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 try {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $eventData = $event-&gt;data-&gt;object;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'payment_method.attached') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment = new CustomerSubscriptionPaymentAttachment();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;stripe_payment_method_id = $eventData-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;type = $eventData-&gt;type;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;customer_stripe_id = $eventData-&gt;customer;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;card_brand = (isset($eventData-&gt;card)) ? $eventData-&gt;card-&gt;brand : \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;card_exp_month = (isset($eventData-&gt;card)) ? $eventData-&gt;card-&gt;exp_month : \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;card_exp_year = (isset($eventData-&gt;card)) ? $eventData-&gt;card-&gt;exp_year : \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;card_last4 = (isset($eventData-&gt;card)) ? $eventData-&gt;card-&gt;last4 : \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;country = (isset($eventData-&gt;card)) ? $eventData-&gt;card-&gt;country : \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;payment_created_at = Carbon::createFromTimestamp((int) $eventData-&gt;created);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;payment_stripe_object_detail = json_encode($event-&gt;data-&gt;object, true);\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subcriptionAttachPayment-&gt;save();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'customer.deleted') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 CustomerStripeId::where('stripe_id', $eventData-&gt;id)-&gt;delete();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'customer.subscription.created') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction = new CustomerSubscriptionTransaction();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;stripe_subscription_id = $eventData-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;stripe_customer_id = $eventData-&gt;customer;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;payment_method_id = $eventData-&gt;default_payment_method;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;stripe_product_id = $eventData-&gt;plan-&gt;product;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;amount_received = $eventData-&gt;plan-&gt;amount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;currency_type = $eventData-&gt;plan-&gt;currency;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;status = $eventData-&gt;status;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;save();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'customer.subscription.updated') {\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $inactivePlanId = isset($event-&gt;data-&gt;previous_attributes-&gt;plan) ? $event-&gt;data-&gt;previous_attributes-&gt;plan-&gt;id : \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customer = CustomerSubscriptionTransaction::where('stripe_customer_id', $eventData-&gt;customer)-&gt;where('stripe_subscription_id', $eventData-&gt;id)-&gt;update([\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'status' =&gt; $eventData-&gt;status,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'stripe_product_id' =&gt; $eventData-&gt;plan-&gt;product,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'active_plan_id' =&gt; $eventData-&gt;plan-&gt;id,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'inactive_plan_id' =&gt; $inactivePlanId,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'canceled_at' =&gt; Carbon::createFromTimestamp((int) ($eventData-&gt;canceled_at)) ?? \"\",\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'cancellation_comment' =&gt; isset($eventData-&gt;cancellation_details) ? $eventData-&gt;cancellation_details-&gt;comment : \"\",\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'cancellation_feedback' =&gt; isset($eventData-&gt;cancellation_details) ? $eventData-&gt;cancellation_details-&gt;feedback : \"\",\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'subscription_start_at' =&gt; Carbon::createFromTimestamp((int) ($eventData-&gt;current_period_start)),\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'subscription_end_at' =&gt; Carbon::createFromTimestamp((int) ($eventData-&gt;current_period_end)),\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'billing_cycle_anchor' =&gt; Carbon::createFromTimestamp((int) ($eventData-&gt;billing_cycle_anchor)),\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'stripe_subscription_detail_object' =&gt; json_encode($event-&gt;data-&gt;object, true)\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]);\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (isset($event-&gt;data-&gt;previous_attributes-&gt;plan)) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionCurrentPlanId = $eventData-&gt;plan-&gt;id;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousSubscriptionPlanId = $event-&gt;data-&gt;previous_attributes-&gt;plan-&gt;id;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($subscriptionCurrentPlanId !== $previousSubscriptionPlanId) {\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customer = CustomerSubscriptionTransaction::where('stripe_customer_id', $eventData-&gt;customer)-&gt;where('stripe_subscription_id', $eventData-&gt;id)-&gt;update([\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'update_plan_status' =&gt; '1',\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]);\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'customer.subscription.deleted') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customer = CustomerSubscriptionTransaction::where('stripe_customer_id', $eventData-&gt;customer)-&gt;where('stripe_subscription_id', $eventData-&gt;id)-&gt;update([\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'status' =&gt; $eventData-&gt;status,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'stripe_product_id' =&gt; $eventData-&gt;plan-&gt;product\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'payment_intent.succeeded') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent = new SubscriptionPaymentIntent();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;payment_intent_id = $eventData-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;stripe_customer_id = $eventData-&gt;customer;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;payment_method = $eventData-&gt;payment_method;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;description = $eventData-&gt;description;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;amount_send = $eventData-&gt;amount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;amount_received = $eventData-&gt;amount_received;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;status = $eventData-&gt;status;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;invoice = $eventData-&gt;invoice;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;stripe_payment_detail_object = json_encode($event-&gt;data-&gt;object, true);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntent-&gt;save();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'invoice.payment_succeeded') {\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $activeProtionStatus = $eventData-&gt;lines-&gt;data[0]-&gt;proration;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($activeProtionStatus) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductItemPlanId = $eventData-&gt;lines-&gt;data[0]-&gt;plan-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductPriceAmount = $eventData-&gt;lines-&gt;data[0]-&gt;amount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductPriceAmountExculdingTax = $eventData-&gt;lines-&gt;data[0]-&gt;amount_excluding_tax;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductDiscription = $eventData-&gt;lines-&gt;data[0]-&gt;description;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductItemProduct = $eventData-&gt;lines-&gt;data[0]-&gt;plan-&gt;product;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductItemPlanId = $eventData-&gt;lines-&gt;data[1]-&gt;plan-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductItemProduct = $eventData-&gt;lines-&gt;data[1]-&gt;plan-&gt;product;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductProductPriceAmount = $eventData-&gt;lines-&gt;data[1]-&gt;amount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductProductPriceAmountExculdingTax = $eventData-&gt;lines-&gt;data[1]-&gt;amount_excluding_tax;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductDiscription = $eventData-&gt;lines-&gt;data[1]-&gt;description;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductItemPlanId = \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductItemProduct = \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductPriceAmount = \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductPriceAmountExculdingTax = \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $previousProductDiscription = \"\";\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductDiscription = $eventData-&gt;lines-&gt;data[0]-&gt;description;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductProductPriceAmount = $eventData-&gt;lines-&gt;data[0]-&gt;amount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductProductPriceAmountExculdingTax = $eventData-&gt;lines-&gt;data[0]-&gt;amount_excluding_tax;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductItemPlanId = $eventData-&gt;lines-&gt;data[0]-&gt;plan-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $currentProductItemProduct = $eventData-&gt;lines-&gt;data[0]-&gt;plan-&gt;product;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice = new SubscriptionPaymentInvoice();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;invoice_id = $eventData-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;charge = $eventData-&gt;charge ?? \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;number = $eventData-&gt;number;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;previous_product_description = $previousProductDiscription;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;current_product_description = $currentProductDiscription;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;total = $eventData-&gt;total;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;total_excluding_tax = $eventData-&gt;total_excluding_tax;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;subtotal = $eventData-&gt;subtotal;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;subtotal_excluding_tax = $eventData-&gt;subtotal_excluding_tax;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;previous_product_price_amount = $previousProductPriceAmount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;previous_product_excluding_amount = $previousProductPriceAmountExculdingTax;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;current_product_price_amount = $currentProductProductPriceAmount;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;current_product_excluding_tax_amount = $currentProductProductPriceAmountExculdingTax;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;current_product_id = $currentProductItemProduct;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;current_plan_id = $currentProductItemPlanId;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;previous_product_id = $previousProductItemProduct;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;previous_plan_id = $previousProductItemPlanId;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;proration = $activeProtionStatus;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;stripe_subscription_id = $eventData-&gt;subscription;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;hosted_invoice_url = $eventData-&gt;hosted_invoice_url;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;invoice_pdf = $eventData-&gt;invoice_pdf;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;customer_name = $eventData-&gt;customer_name;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;customer_email = $eventData-&gt;customer_email;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;collection_method = $eventData-&gt;collection_method;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;account_name = $eventData-&gt;account_name;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;invoice_created_at = Carbon::createFromTimestamp($eventData-&gt;created);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;status = $eventData-&gt;status;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;stripe_subscription_payment_invoice_object = json_encode($event-&gt;data-&gt;object, true);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;save();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($event-&gt;type === 'payment_intent.payment_failed') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice = new SubscriptionPaymentInvoice();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;invoice_id = $eventData-&gt;id;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;number = $eventData-&gt;number;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;stripe_subscription_id = $eventData-&gt;subscription;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;hosted_invoice_url = $eventData-&gt;hosted_invoice_url;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;invoice_pdf = $eventData-&gt;invoice_pdf;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;customer_name = $eventData-&gt;customer_name;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;customer_email = $eventData-&gt;customer_email;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;collection_method = $eventData-&gt;collection_method;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;account_name = $eventData-&gt;account_name;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;invoice_careted_at = Carbon::createFromTimestamp($eventData-&gt;created);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;status = $eventData-&gt;status;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $customerTransaction-&gt;stripe_failed_message = $eventData-&gt;last_payment_error-&gt;message;\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;stripe_subscription_payment_invoice_object = json_encode($event-&gt;data-&gt;object, true);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $subscriptionIntentInvoice-&gt;save();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 DB::commit();\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return response()-&gt;json(['status' =&gt; 'success']);\r\n\u00a0 \u00a0 \u00a0 \u00a0 } catch (\\Exception $e) {\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 DB::rollBack();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return response()-&gt;json(['status' =&gt; 'error', 'message' =&gt; $e-&gt;getMessage()], 500);\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\r\n\r\n\r\n\u00a0 \u00a0 }<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<\/div>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>What are Webhooks ? A webhook is a way for one system to send real-time data to another system whenever a specific event occurs. Unlike APIs that require polling (periodically checking for updates), webhooks allow you to &#8220;subscribe&#8221; to events so the data gets sent to you immediately when the event happens. Webhooks are lightweight [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":4265,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[332],"tags":[],"class_list":["post-4212","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/4212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/comments?post=4212"}],"version-history":[{"count":3,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/4212\/revisions"}],"predecessor-version":[{"id":4271,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/4212\/revisions\/4271"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/media\/4265"}],"wp:attachment":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/media?parent=4212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/categories?post=4212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/tags?post=4212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}