diff --git a/app/Http/Controllers/ClientPortal/PaymentMethodController.php b/app/Http/Controllers/ClientPortal/PaymentMethodController.php index 630d3dcbca22..b5182945be03 100644 --- a/app/Http/Controllers/ClientPortal/PaymentMethodController.php +++ b/app/Http/Controllers/ClientPortal/PaymentMethodController.php @@ -135,6 +135,13 @@ class PaymentMethodController extends Controller */ public function destroy(ClientGatewayToken $payment_method) { + $gateway = $this->getClientGateway(); + + $gateway + ->driver(auth()->user()->client) + ->setPaymentMethod(request()->query('method')) + ->detach($payment_method); + try { event(new MethodDeleted($payment_method, auth('contact')->user()->company, Ninja::eventVars())); $payment_method->delete(); diff --git a/app/PaymentDrivers/AuthorizePaymentDriver.php b/app/PaymentDrivers/AuthorizePaymentDriver.php index 60f569dec2c0..bf61c854b389 100644 --- a/app/PaymentDrivers/AuthorizePaymentDriver.php +++ b/app/PaymentDrivers/AuthorizePaymentDriver.php @@ -143,4 +143,15 @@ class AuthorizePaymentDriver extends BaseDriver return $this->payment_method->tokenBilling($cgt, $payment_hash); } + + /** + * Detach payment method from Authorize.net. + * + * @param \App\Models\ClientGatewayToken $token + * @return void + */ + public function detach(ClientGatewayToken $token) + { + // Authorize.net doesn't support this feature. + } } diff --git a/app/PaymentDrivers/CustomPaymentDriver.php b/app/PaymentDrivers/CustomPaymentDriver.php index 00b823595cce..88a063983fe7 100644 --- a/app/PaymentDrivers/CustomPaymentDriver.php +++ b/app/PaymentDrivers/CustomPaymentDriver.php @@ -75,4 +75,15 @@ class CustomPaymentDriver extends BaseDriver public function processPaymentResponse($request) { } + + /** + * Detach payment method from custom payment driver. + * + * @param \App\Models\ClientGatewayToken $token + * @return void + */ + public function detach(ClientGatewayToken $token) + { + // Driver doesn't support this feature. + } } diff --git a/app/PaymentDrivers/PayPalExpressPaymentDriver.php b/app/PaymentDrivers/PayPalExpressPaymentDriver.php index 952410f09688..6dff4333694c 100644 --- a/app/PaymentDrivers/PayPalExpressPaymentDriver.php +++ b/app/PaymentDrivers/PayPalExpressPaymentDriver.php @@ -322,4 +322,15 @@ class PayPalExpressPaymentDriver extends BasePaymentDriver 'code' => $response->getData()['L_ERRORCODE0'], ]; } + + /** + * Detach payment method from PayPal. + * + * @param \App\Models\ClientGatewayToken $token + * @return void + */ + public function detach(ClientGatewayToken $token) + { + // PayPal doesn't support this feature. + } } diff --git a/app/PaymentDrivers/StripePaymentDriver.php b/app/PaymentDrivers/StripePaymentDriver.php index b41eb9acfee5..8fb9199df543 100644 --- a/app/PaymentDrivers/StripePaymentDriver.php +++ b/app/PaymentDrivers/StripePaymentDriver.php @@ -304,7 +304,7 @@ class StripePaymentDriver extends BasePaymentDriver $customer = \Stripe\Customer::create($data); } - if (! $customer) { + if (!$customer) { throw new \Exception('Unable to create gateway customer'); } @@ -379,7 +379,7 @@ class StripePaymentDriver extends BasePaymentDriver * @param float $amount The amount of the payment * @return Payment The payment object */ - public function createPaymentRecord($data, $amount) :?Payment + public function createPaymentRecord($data, $amount): ?Payment { $payment = PaymentFactory::create($this->client->company_id, $this->client->user_id); $payment->client_id = $this->client->id; @@ -395,4 +395,26 @@ class StripePaymentDriver extends BasePaymentDriver return $payment->service()->applyNumber()->save(); } + + /** + * Detach payment method from the Stripe. + * https://stripe.com/docs/api/payment_methods/detach + * + * @param \App\Models\ClientGatewayToken $token + * @return bool + */ + public function detach(ClientGatewayToken $token) + { + $stripe = new \Stripe\StripeClient( + $this->company_gateway->getConfigField('apiKey') + ); + + try { + $response = $stripe->paymentMethods->detach($token->token); + } catch (\Exception $e) { + SystemLogger::dispatch([ + 'server_response' => $response, 'data' => request()->all(), + ], SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_STRIPE, $this->client); + } + } } diff --git a/resources/views/portal/ninja2020/payment_methods/includes/modals/removal.blade.php b/resources/views/portal/ninja2020/payment_methods/includes/modals/removal.blade.php index 6a5cb00cd4f3..dca664c78404 100644 --- a/resources/views/portal/ninja2020/payment_methods/includes/modals/removal.blade.php +++ b/resources/views/portal/ninja2020/payment_methods/includes/modals/removal.blade.php @@ -1,4 +1,4 @@ -