App\Ninja\PaymentDrivers\StripePaymentDriver::handleWebHook PHP Method

handleWebHook() public method

public handleWebHook ( $input )
    public function handleWebHook($input)
    {
        $eventId = array_get($input, 'id');
        $eventType = array_get($input, 'type');
        $accountGateway = $this->accountGateway;
        $accountId = $accountGateway->account_id;
        if (!$eventId) {
            throw new Exception('Missing event id');
        }
        if (!$eventType) {
            throw new Exception('Missing event type');
        }
        $supportedEvents = ['charge.failed', 'charge.succeeded', 'charge.refunded', 'customer.source.updated', 'customer.source.deleted', 'customer.bank_account.deleted'];
        if (!in_array($eventType, $supportedEvents)) {
            return ['message' => 'Ignoring event'];
        }
        // Fetch the event directly from Stripe for security
        $eventDetails = $this->makeStripeCall('GET', 'events/' . $eventId);
        if (is_string($eventDetails) || !$eventDetails) {
            return false;
        }
        if ($eventType != $eventDetails['type']) {
            return false;
        }
        if (!$eventDetails['pending_webhooks']) {
            return false;
        }
        if ($eventType == 'charge.failed' || $eventType == 'charge.succeeded' || $eventType == 'charge.refunded') {
            $charge = $eventDetails['data']['object'];
            $transactionRef = $charge['id'];
            $payment = Payment::scope(false, $accountId)->where('transaction_reference', '=', $transactionRef)->first();
            if (!$payment) {
                return false;
            }
            if ($eventType == 'charge.failed') {
                if (!$payment->isFailed()) {
                    $payment->markFailed($charge['failure_message']);
                    $userMailer = app('App\\Ninja\\Mailers\\UserMailer');
                    $userMailer->sendNotification($payment->user, $payment->invoice, 'payment_failed', $payment);
                }
            } elseif ($eventType == 'charge.succeeded') {
                $payment->markComplete();
            } elseif ($eventType == 'charge.refunded') {
                $payment->recordRefund($charge['amount_refunded'] / 100 - $payment->refunded);
            }
        } elseif ($eventType == 'customer.source.updated' || $eventType == 'customer.source.deleted' || $eventType == 'customer.bank_account.deleted') {
            $source = $eventDetails['data']['object'];
            $sourceRef = $source['id'];
            $paymentMethod = PaymentMethod::scope(false, $accountId)->where('source_reference', '=', $sourceRef)->first();
            if (!$paymentMethod) {
                return false;
            }
            if ($eventType == 'customer.source.deleted' || $eventType == 'customer.bank_account.deleted') {
                $paymentMethod->delete();
            } elseif ($eventType == 'customer.source.updated') {
                //$this->paymentService->convertPaymentMethodFromStripe($source, null, $paymentMethod)->save();
            }
        }
        return 'Processed successfully';
    }