PagarmeCardService.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Data\Pagarme\Request\PagarmeCardRequestData\PagarmeCardBillingAddressData;
  4. use App\Data\Pagarme\Request\PagarmeCardRequestData\PagarmeCardRequestData;
  5. use App\Data\Pagarme\Response\PagarmeCardResponseData;
  6. use App\Models\Address;
  7. use App\Models\ClientPaymentMethod;
  8. use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
  9. class PagarmeCardService
  10. {
  11. use SendsPagarmeRequests;
  12. public function __construct(
  13. private readonly PagarmeCustomerService $pagarmeCustomerService,
  14. ) {}
  15. public function createCardForPaymentMethod(ClientPaymentMethod $paymentMethod): ?string
  16. {
  17. if (! empty($paymentMethod->gateway_card_id)) {
  18. return $paymentMethod->gateway_card_id;
  19. }
  20. $paymentMethod->loadMissing('client.user');
  21. $customerId = $this->pagarmeCustomerService->createCustomerForClient(
  22. $paymentMethod->client,
  23. []
  24. );
  25. $raw = $this->pagarmeRequest(
  26. method: 'POST',
  27. path: "/customers/{$customerId}/cards",
  28. payload: new PagarmeCardRequestData(
  29. token: $paymentMethod->token,
  30. label: $paymentMethod->card_name,
  31. billingAddress: PagarmeCardBillingAddressData::fromAddress(
  32. Address::query()
  33. ->with(['city.state', 'state'])
  34. ->where('source', 'client')
  35. ->where('source_id', $paymentMethod->client_id)
  36. ->orderByDesc('is_primary')
  37. ->latest('id')
  38. ->first()
  39. ),
  40. ),
  41. idempotencyKey: $this->idempotencyKey($paymentMethod),
  42. errorMessage: 'Erro ao salvar cartao no Pagar.me.',
  43. );
  44. $cardData = $this->buildCardResponse($raw);
  45. $cardId = $cardData->requireId();
  46. $paymentMethod->forceFill([
  47. 'gateway_card_id' => $cardId,
  48. 'brand' => $paymentMethod->brand ?: $cardData->brand(),
  49. 'last_four_digits' => $paymentMethod->last_four_digits ?: $cardData->lastFourDigits(),
  50. ])->save();
  51. return $cardId;
  52. }
  53. //
  54. private function buildCardResponse(array $raw): PagarmeCardResponseData
  55. {
  56. return new PagarmeCardResponseData(
  57. id: $raw['id'] ?? null,
  58. firstSixDigits: $raw['first_six_digits'] ?? null,
  59. lastFourDigits: $raw['last_four_digits'] ?? null,
  60. brand: $raw['brand'] ?? null,
  61. holderName: $raw['holder_name'] ?? null,
  62. expMonth: isset($raw['exp_month']) ? (int) $raw['exp_month'] : null,
  63. expYear: isset($raw['exp_year']) ? (int) $raw['exp_year'] : null,
  64. status: $raw['status'] ?? null,
  65. type: $raw['type'] ?? null,
  66. createdAt: $raw['created_at'] ?? null,
  67. updatedAt: $raw['updated_at'] ?? null,
  68. );
  69. }
  70. // evita criacao duplicada de cartao
  71. private function idempotencyKey(ClientPaymentMethod $paymentMethod): string
  72. {
  73. return "client-payment-method-{$paymentMethod->id}-card";
  74. }
  75. }