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