diff --git a/app/PaymentDrivers/Braintree/CreditCard.php b/app/PaymentDrivers/Braintree/CreditCard.php index 0e79aa692224..6985770c76a9 100644 --- a/app/PaymentDrivers/Braintree/CreditCard.php +++ b/app/PaymentDrivers/Braintree/CreditCard.php @@ -96,6 +96,10 @@ class CreditCard if ($result->success) { $this->braintree->logSuccessfulGatewayResponse(['response' => $request->server_response, 'data' => $this->braintree->payment_hash], SystemLog::TYPE_BRAINTREE); + if ($request->store_card) { + $this->storePaymentMethod(); + } + return $this->processSuccessfulPayment($result); } @@ -155,4 +159,30 @@ class CreditCard throw new PaymentFailed($response->transaction->additionalProcessorResponse, $response->transaction->processorResponseCode); } + + private function storePaymentMethod() + { + return; + + $method = $this->braintree->payment_hash->data->server_response->details; + + try { + $payment_meta = new \stdClass; + $payment_meta->exp_month = (string) $method->expirationMonth; + $payment_meta->exp_year = (string) $method->expirationYear; + $payment_meta->brand = (string) $method->cardType; + $payment_meta->last4 = (string) $method->lastFour; + $payment_meta->type = GatewayType::CREDIT_CARD; + + $data = [ + 'payment_meta' => $payment_meta, + 'token' => $method->id, + 'payment_method_id' => $this->braintree->payment_hash->data->payment_method_id, + ]; + + $this->braintree->storeGatewayToken($data, ['gateway_customer_reference' => $customer->id]); + } catch (\Exception $e) { + return $this->braintree->processInternallyFailedPayment($this->braintree, $e); + } + } } diff --git a/resources/views/portal/ninja2020/gateways/braintree/credit_card/pay.blade.php b/resources/views/portal/ninja2020/gateways/braintree/credit_card/pay.blade.php index 5dc59263a151..879cabdf97f7 100644 --- a/resources/views/portal/ninja2020/gateways/braintree/credit_card/pay.blade.php +++ b/resources/views/portal/ninja2020/gateways/braintree/credit_card/pay.blade.php @@ -59,6 +59,8 @@ @endcomponent + @include('portal.ninja2020.gateways.includes.save_card') + @component('portal.ninja2020.components.general.card-element-single')
@endcomponent @@ -100,6 +102,15 @@ document.querySelector('input[name=token]').value = payload.nonce; document.querySelector('input[name=gateway_response]').value = JSON.stringify(payload); + let tokenBillingCheckbox = document.querySelector( + 'input[name="token-billing-checkbox"]:checked' + ); + + if (tokenBillingCheckbox) { + document.querySelector('input[name="store_card"]').value = + tokenBillingCheckbox.value; + } + document.getElementById('server-response').submit(); }); }); diff --git a/resources/views/portal/ninja2020/gateways/includes/save_card.blade.php b/resources/views/portal/ninja2020/gateways/includes/save_card.blade.php index 34a5b3671075..e6f7d55ea043 100644 --- a/resources/views/portal/ninja2020/gateways/includes/save_card.blade.php +++ b/resources/views/portal/ninja2020/gateways/includes/save_card.blade.php @@ -16,12 +16,12 @@ value="true"/> {{ ctrans('texts.yes') }} - + @else