| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- <?php
- namespace App\Services\Pagarme;
- use App\Data\Pagarme\Request\PagarmeCardRequestData\PagarmeCardBillingAddressData;
- use App\Data\Pagarme\Request\PagarmeCardRequestData\PagarmeCardRequestData;
- use App\Data\Pagarme\Response\PagarmeCardResponseData;
- use App\Models\Address;
- use App\Models\ClientPaymentMethod;
- use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
- class PagarmeCardService
- {
- use SendsPagarmeRequests;
- public function __construct(
- private readonly PagarmeCustomerService $pagarmeCustomerService,
- ) {}
- public function createCardForPaymentMethod(ClientPaymentMethod $paymentMethod): ?string
- {
- if (! empty($paymentMethod->gateway_card_id)) {
- return $paymentMethod->gateway_card_id;
- }
- $paymentMethod->loadMissing('client.user');
- $customerId = $this->pagarmeCustomerService->createCustomerForClient(
- $paymentMethod->client,
- []
- );
- $raw = $this->pagarmeRequest(
- method: 'POST',
- path: "/customers/{$customerId}/cards",
- payload: new PagarmeCardRequestData(
- token: $paymentMethod->token,
- label: $paymentMethod->card_name,
- billingAddress: PagarmeCardBillingAddressData::fromAddress(
- Address::query()
- ->with(['city.state', 'state'])
- ->where('source', 'client')
- ->where('source_id', $paymentMethod->client_id)
- ->orderByDesc('is_primary')
- ->latest('id')
- ->first()
- ),
- ),
- idempotencyKey: $this->idempotencyKey($paymentMethod),
- errorMessage: 'Erro ao salvar cartao no Pagar.me.',
- );
- $cardData = $this->buildCardResponse($raw);
- $cardId = $cardData->requireId();
- $paymentMethod->forceFill([
- 'gateway_card_id' => $cardId,
- 'brand' => $paymentMethod->brand ?: $cardData->brand(),
- 'last_four_digits' => $paymentMethod->last_four_digits ?: $cardData->lastFourDigits(),
- ])->save();
- return $cardId;
- }
- //
- private function buildCardResponse(array $raw): PagarmeCardResponseData
- {
- return new PagarmeCardResponseData(
- id: $raw['id'] ?? null,
- firstSixDigits: $raw['first_six_digits'] ?? null,
- lastFourDigits: $raw['last_four_digits'] ?? null,
- brand: $raw['brand'] ?? null,
- holderName: $raw['holder_name'] ?? null,
- expMonth: isset($raw['exp_month']) ? (int) $raw['exp_month'] : null,
- expYear: isset($raw['exp_year']) ? (int) $raw['exp_year'] : null,
- status: $raw['status'] ?? null,
- type: $raw['type'] ?? null,
- createdAt: $raw['created_at'] ?? null,
- updatedAt: $raw['updated_at'] ?? null,
- );
- }
- // evita criacao duplicada de cartao
- private function idempotencyKey(ClientPaymentMethod $paymentMethod): string
- {
- return "client-payment-method-{$paymentMethod->id}-card";
- }
- }
|