Show "Save card" option for credit card

This commit is contained in:
Benjamin Beganović 2021-04-29 11:59:18 +02:00
parent d4c51871ef
commit 6cab52fc9f
3 changed files with 43 additions and 2 deletions

View File

@ -96,6 +96,10 @@ class CreditCard
if ($result->success) { if ($result->success) {
$this->braintree->logSuccessfulGatewayResponse(['response' => $request->server_response, 'data' => $this->braintree->payment_hash], SystemLog::TYPE_BRAINTREE); $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); return $this->processSuccessfulPayment($result);
} }
@ -155,4 +159,30 @@ class CreditCard
throw new PaymentFailed($response->transaction->additionalProcessorResponse, $response->transaction->processorResponseCode); 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);
}
}
} }

View File

@ -59,6 +59,8 @@
</label> </label>
@endcomponent @endcomponent
@include('portal.ninja2020.gateways.includes.save_card')
@component('portal.ninja2020.components.general.card-element-single') @component('portal.ninja2020.components.general.card-element-single')
<div id="dropin-container"></div> <div id="dropin-container"></div>
@endcomponent @endcomponent
@ -100,6 +102,15 @@
document.querySelector('input[name=token]').value = payload.nonce; document.querySelector('input[name=token]').value = payload.nonce;
document.querySelector('input[name=gateway_response]').value = JSON.stringify(payload); 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(); document.getElementById('server-response').submit();
}); });
}); });

View File

@ -16,12 +16,12 @@
value="true"/> value="true"/>
<span class="ml-1 cursor-pointer">{{ ctrans('texts.yes') }}</span> <span class="ml-1 cursor-pointer">{{ ctrans('texts.yes') }}</span>
</label> </label>
<label> <labecoml>
<input type="radio" class="form-radio cursor-pointer" name="token-billing-checkbox" <input type="radio" class="form-radio cursor-pointer" name="token-billing-checkbox"
id="proxy_is_default" id="proxy_is_default"
value="false" checked /> value="false" checked />
<span class="ml-1 cursor-pointer">{{ ctrans('texts.no') }}</span> <span class="ml-1 cursor-pointer">{{ ctrans('texts.no') }}</span>
</label> </labecoml>
</dd> </dd>
</div> </div>
@else @else