PagarmeRecipientService.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Models\Provider;
  4. use PagarmeApiSDKLib\Authentication\BasicAuthCredentialsBuilder;
  5. use PagarmeApiSDKLib\Models\Builders\CreateBankAccountRequestBuilder;
  6. use PagarmeApiSDKLib\Models\Builders\CreateRecipientRequestBuilder;
  7. use PagarmeApiSDKLib\Models\Builders\CreateTransferSettingsRequestBuilder;
  8. use PagarmeApiSDKLib\Models\Builders\UpdateAutomaticAnticipationSettingsRequestBuilder;
  9. use PagarmeApiSDKLib\PagarmeApiSDKClient;
  10. use PagarmeApiSDKLib\PagarmeApiSDKClientBuilder;
  11. class PagarmeRecipientService
  12. {
  13. private ?PagarmeApiSDKClient $client = null;
  14. public function createRecipientForProvider(Provider $provider, array $data): string
  15. {
  16. if (!empty($provider->recipient_id)) {
  17. return $provider->recipient_id;
  18. }
  19. $client = $this->client();
  20. $bankAccountData = $data['recipient_default_bank_account'];
  21. $metadata = $data['recipient_metadata'] ?? [];
  22. $paymentMode = $data['recipient_payment_mode'];
  23. $bankAccount = CreateBankAccountRequestBuilder::init(
  24. $bankAccountData['holder_name'],
  25. $bankAccountData['holder_type'],
  26. $bankAccountData['holder_document'],
  27. $bankAccountData['bank'],
  28. $bankAccountData['branch_number'],
  29. $bankAccountData['account_number'],
  30. $bankAccountData['account_check_digit'],
  31. $bankAccountData['type'],
  32. $bankAccountData['metadata'] ?? []
  33. )
  34. ->branchCheckDigit($bankAccountData['branch_check_digit'] ?? null)
  35. ->pixKey($bankAccountData['pix_key'] ?? null)
  36. ->build();
  37. $recipientRequest = CreateRecipientRequestBuilder::init(
  38. $bankAccount,
  39. $metadata,
  40. $data['recipient_code'],
  41. $paymentMode
  42. )
  43. ->name($data['recipient_name'])
  44. ->email($data['recipient_email'])
  45. ->description($data['recipient_description'])
  46. ->document($data['recipient_document'])
  47. ->type($data['recipient_type']);
  48. $recipientTransferSettings = CreateTransferSettingsRequestBuilder::init(false, 'daily', 0)->build();
  49. $recipientRequest->transferSettings($recipientTransferSettings);
  50. $recipient = $client->getRecipientsController()->createRecipient(
  51. $recipientRequest->build(),
  52. $this->idempotencyKey($provider->id)
  53. );
  54. $recipientId = $recipient->getId();
  55. if (!$recipientId) {
  56. throw new \RuntimeException('Pagar.me recipient creation returned an empty id.');
  57. }
  58. $provider->forceFill([
  59. 'recipient_id' => $recipientId,
  60. 'recipient_name' => $data['recipient_name'],
  61. 'recipient_email' => $data['recipient_email'],
  62. 'recipient_description' => $data['recipient_description'],
  63. 'recipient_document' => $data['recipient_document'],
  64. 'recipient_type' => $data['recipient_type'],
  65. 'recipient_code' => $data['recipient_code'],
  66. 'recipient_payment_mode' => $paymentMode,
  67. 'recipient_default_bank_account' => $bankAccountData,
  68. 'recipient_transfer_settings' => [
  69. 'transfer_enabled' => false,
  70. 'transfer_interval' => 'daily',
  71. 'transfer_day' => 0,
  72. ],
  73. 'recipient_automatic_anticipation_settings' => [
  74. 'enabled' => false,
  75. ],
  76. 'recipient_metadata' => $metadata,
  77. ])->save();
  78. $this->applyAutomaticAnticipationSettings($provider->id, $recipientId);
  79. return $recipientId;
  80. }
  81. private function applyAutomaticAnticipationSettings(int $providerId, string $recipientId): void
  82. {
  83. $request = UpdateAutomaticAnticipationSettingsRequestBuilder::init()
  84. ->enabled(false)
  85. ->build();
  86. $this->client()->getRecipientsController()->updateAutomaticAnticipationSettings(
  87. $recipientId,
  88. $request,
  89. $this->idempotencyKey($providerId, 'auto-anticipation')
  90. );
  91. }
  92. private function client(): PagarmeApiSDKClient
  93. {
  94. if ($this->client) {
  95. return $this->client;
  96. }
  97. $secretKey = config('services.pagarme.secret_key');
  98. if (empty($secretKey)) {
  99. throw new \RuntimeException('PAGARME_SECRET_KEY is not configured.');
  100. }
  101. $serviceRefererName = (string) config('services.pagarme.service_referer_name', config('app.name'));
  102. $this->client = PagarmeApiSDKClientBuilder::init()
  103. ->basicAuthCredentials(
  104. BasicAuthCredentialsBuilder::init($secretKey, '')
  105. )
  106. ->serviceRefererName($serviceRefererName)
  107. ->build();
  108. return $this->client;
  109. }
  110. private function idempotencyKey(int $providerId, string $suffix = 'recipient'): string
  111. {
  112. return "provider-{$providerId}-{$suffix}";
  113. }
  114. }