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