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';
 }