vendor/univapay/php-sdk/src/Univapay/UnivapayClient.php line 182

Open in your IDE?
  1. <?php
  2. namespace Univapay;
  3. use Composer\DependencyResolver\Request;
  4. use DateTime;
  5. use DateTimeZone;
  6. use Exception;
  7. use Univapay\Enums\CursorDirection;
  8. use Univapay\Enums\Field;
  9. use Univapay\Enums\PaymentType;
  10. use Univapay\Enums\Period;
  11. use Univapay\Enums\Reason;
  12. use Univapay\Enums\TokenType;
  13. use Univapay\Enums\WebhookEvent;
  14. use Univapay\Errors\UnivapayInvalidWebhookData;
  15. use Univapay\Errors\UnivapaySDKError;
  16. use Univapay\Errors\UnivapayUnknownWebhookEvent;
  17. use Univapay\Errors\UnivapayValidationError;
  18. use Univapay\Requests\HttpRequester;
  19. use Univapay\Requests\RequestContext;
  20. use Univapay\Requests\Requester;
  21. use Univapay\Requests\Handlers\RateLimitHandler;
  22. use Univapay\Requests\Handlers\RequestHandler;
  23. use Univapay\Resources\BankAccount;
  24. use Univapay\Resources\Cancel;
  25. use Univapay\Resources\CardConfiguration;
  26. use Univapay\Resources\Charge;
  27. use Univapay\Resources\CheckoutInfo;
  28. use Univapay\Resources\Merchant;
  29. use Univapay\Resources\Refund;
  30. use Univapay\Resources\Store;
  31. use Univapay\Resources\Subscription;
  32. use Univapay\Resources\Transaction;
  33. use Univapay\Resources\TransactionToken;
  34. use Univapay\Resources\Transfer;
  35. use Univapay\Resources\WebhookPayload;
  36. use Univapay\Resources\Authentication\AppJWT;
  37. use Univapay\Resources\Authentication\MerchantAppJWT;
  38. use Univapay\Resources\Authentication\StoreAppJWT;
  39. use Univapay\Resources\Mixins\GetBankAccounts;
  40. use Univapay\Resources\Mixins\GetCharges;
  41. use Univapay\Resources\Mixins\GetStores;
  42. use Univapay\Resources\Mixins\GetSubscriptions;
  43. use Univapay\Resources\Mixins\GetTransactions;
  44. use Univapay\Resources\Mixins\GetTransactionTokens;
  45. use Univapay\Resources\Mixins\GetTransfers;
  46. use Univapay\Resources\PaymentMethod\PaymentMethod;
  47. use Univapay\Resources\Subscription\InstallmentPlan;
  48. use Univapay\Resources\Subscription\ScheduledPayment;
  49. use Univapay\Resources\Subscription\ScheduleSettings;
  50. use Univapay\Utility\FunctionalUtils;
  51. use Univapay\Utility\HttpUtils;
  52. use Univapay\Utility\RequesterUtils;
  53. use Money\Money;
  54. class UnivapayClient
  55. {
  56.     use GetBankAccountsGetChargesGetStoresGetSubscriptionsGetTransactionsGetTransactionTokensGetTransfers {
  57.         GetCharges::validate insteadof GetBankAccounts,
  58.         GetStores,
  59.         GetSubscriptions,
  60.         GetTransactions,
  61.         GetTransactionTokens,
  62.         GetTransfers;
  63.     }
  64.     private $appToken;
  65.     private $clientOptions;
  66.     private $requester;
  67.     public function __construct(
  68.         AppJWT $appToken,
  69.         UnivapayClientOptions $clientOptions null
  70.     ) {
  71.         if (is_null($clientOptions)) {
  72.             $clientOptions = new UnivapayClientOptions();
  73.         }
  74.         $this->appToken $appToken;
  75.         $this->clientOptions $clientOptions;
  76.         $this->requester = new HttpRequester(...$this->clientOptions->getRequestHandlers());
  77.     }
  78.     public function getContext()
  79.     {
  80.         return new RequestContext($this->requester$this->clientOptions->endpoint'/'$this->appToken);
  81.     }
  82.     public function getStoreBasedContext()
  83.     {
  84.         if (!$this->appToken instanceof StoreAppJWT) {
  85.             throw new UnivapaySDKError(Reason::REQUIRES_STORE_APP_TOKEN());
  86.         }
  87.         return $this->getContext();
  88.     }
  89.     public function addHandlers(RequestHandler ...$handlers)
  90.     {
  91.         $this->requester->addHandlers(...$handlers);
  92.     }
  93.     public function setHandlers(RequestHandler ...$handlers)
  94.     {
  95.         $this->requester->setHandlers(...array_merge($this->clientOptions->getRequestHandlers(), $handlers));
  96.     }
  97.     public function getMe()
  98.     {
  99.         return RequesterUtils::executeGet(
  100.             Merchant::class,
  101.             $this->getContext()->withPath('me')
  102.         );
  103.     }
  104.     public function getCheckoutInfo()
  105.     {
  106.         return RequesterUtils::executeGet(
  107.             CheckoutInfo::class,
  108.             $this->getStoreBasedContext()->withPath('checkout_info')
  109.         );
  110.     }
  111.     public function getStore($id)
  112.     {
  113.         $context $this->getStoreContext()->appendPath($id);
  114.         return RequesterUtils::executeGet(Store::class, $context);
  115.     }
  116.     public function getBankAccount($id)
  117.     {
  118.         $context $this->getBankAccountContext()->appendPath($id);
  119.         return RequesterUtils::executeGet(BankAccount::class, $context);
  120.     }
  121.     public function createToken(PaymentMethod $payment$localCustomerId null)
  122.     {
  123.         $context $this->getStoreBasedContext()->withPath('tokens');
  124.         if (isset($localCustomerId) && $payment->type === TokenType::RECURRING()) {
  125.             $customerId $this->getCustomerId($localCustomerId);
  126.             if (!isset($payment->metadata)) {
  127.                 $payment->metadata = [];
  128.             }
  129.             $payment->metadata += ['gopay-customer-id' => $customerId];
  130.         }
  131.         return RequesterUtils::executePost(TransactionToken::class, $context$payment);
  132.     }
  133.     public function getTransactionToken($transactionTokenId)
  134.     {
  135.         $context $this->getStoreBasedContext()->withPath([
  136.             'stores',
  137.             $this->appToken->storeId,
  138.             'tokens',
  139.             $transactionTokenId
  140.         ]);
  141.         return RequesterUtils::executeGet(TransactionToken::class, $context);
  142.     }
  143.     public function createCharge(
  144.         $transactionTokenId,
  145.         Money $money,
  146.         $capture null,
  147.         DateTime $captureAt null,
  148.         array $metadata null,
  149.         $onlyDirectCurrency null
  150.     ) {
  151.         return $this
  152.             ->getTransactionToken($transactionTokenId)
  153.             ->createCharge(
  154.                 $money,
  155.                 $capture,
  156.                 $captureAt,
  157.                 $metadata,
  158.                 $onlyDirectCurrency
  159.             );
  160.     }
  161.     public function getCharge($storeId$chargeId)
  162.     {
  163.         $context $this->getContext()->withPath(['stores'$storeId'charges'$chargeId]);
  164.         return RequesterUtils::executeGet(Charge::class, $context);
  165.     }
  166.     public function createSubscription(
  167.         $transactionTokenId,
  168.         Money $money,
  169.         Period $period,
  170.         Money $initialAmount null,
  171.         ScheduleSettings $scheduleSettings null,
  172.         InstallmentPlan $installmentPlan null,
  173.         array $metadata null
  174.     ) {
  175.         return $this
  176.             ->getTransactionToken($transactionTokenId)
  177.             ->createSubscription(
  178.                 $money,
  179.                 $period,
  180.                 $initialAmount,
  181.                 $scheduleSettings,
  182.                 $installmentPlan,
  183.                 $metadata
  184.             );
  185.     }
  186.     public function getSubscription($storeId$subscriptionId)
  187.     {
  188.         $context $this->getContext()->withPath(['stores'$storeId'subscriptions'$subscriptionId]);
  189.         return RequesterUtils::executeGet(Subscription::class, $context);
  190.     }
  191.     public function createSubscriptionSimulation(
  192.         PaymentType $paymentType,
  193.         Money $amount,
  194.         Period $period,
  195.         Money $initialAmount null,
  196.         ScheduleSettings $scheduleSettings null,
  197.         InstallmentPlan $installmentPlan null
  198.     ) {
  199.         $payload $amount->jsonSerialize() + [
  200.             'payment_type' => $paymentType->getValue(),
  201.             'period' => $period->getValue(),
  202.             'schedule_settings' => $scheduleSettings,
  203.             'installment_plan' => $installmentPlan,
  204.         ];
  205.         if (isset($initialAmount)) {
  206.             if ($initialAmount->isNegative()) {
  207.                 throw new UnivapayValidationError(Field::INITIAL_AMOUNT(), Reason::INVALID_FORMAT());
  208.             } else {
  209.                 $payload += $initialAmount->jsonSerialize();
  210.             }
  211.         }
  212.         $context $this->getStoreBasedContext()->appendPath(['subscriptions''simulate_plan']);
  213.         return RequesterUtils::executePostSimpleList(
  214.             ScheduledPayment::class,
  215.             $context,
  216.             FunctionalUtils::stripNulls($payload)
  217.         );
  218.     }
  219.     public function getTransfer($id)
  220.     {
  221.         $context $this->getTransferContext()->appendPath($id);
  222.         return RequesterUtils::executeGet(Transfer::class, $context);
  223.     }
  224.     public function parseWebhookData($data)
  225.     {
  226.         try {
  227.             $event WebhookEvent::fromValue($data['event']);
  228.             $parser null;
  229.             switch ($event) {
  230.                 case WebhookEvent::TOKEN_CREATED():
  231.                 case WebhookEvent::TOKEN_UPDATED():
  232.                 case WebhookEvent::TOKEN_CVV_AUTH_UPDATED():
  233.                 case WebhookEvent::RECURRING_TOKEN_DELETED():
  234.                     $parser TransactionToken::getContextParser($this->getTransactionTokenContext());
  235.                     break;
  236.                 case WebhookEvent::CHARGE_UPDATED():
  237.                 case WebhookEvent::CHARGE_FINISHED():
  238.                     $parser Charge::getContextParser($this->getChargeContext());
  239.                     break;
  240.                 case WebhookEvent::SUBSCRIPTION_PAYMENT():
  241.                 case WebhookEvent::SUBSCRIPTION_COMPLETED():
  242.                 case WebhookEvent::SUBSCRIPTION_FAILURE():
  243.                 case WebhookEvent::SUBSCRIPTION_CANCELED():
  244.                 case WebhookEvent::SUBSCRIPTION_SUSPENDED():
  245.                     $parser Subscription::getContextParser($this->getSubscriptionContext());
  246.                     break;
  247.                 
  248.                 case WebhookEvent::REFUND_FINISHED():
  249.                     $parser Refund::getContextParser($this->getStoreBasedContext());
  250.                     break;
  251.                 case WebhookEvent::CANCEL_FINISHED():
  252.                     $parser Cancel::getContextParser($this->getStoreBasedContext());
  253.                     break;
  254.                 case WebhookEvent::TRANSFER_CREATED():
  255.                 case WebhookEvent::TRANSFER_UPDATED():
  256.                 case WebhookEvent::TRANSFER_FINALIZED():
  257.                     $parser Transfer::getContextParser($this->getTransferContext());
  258.                     break;
  259.             }
  260.             return new WebhookPayload($event$parser($data['data']));
  261.         } catch (OutOfRangeException $exception) {
  262.             throw new UnivapayUnknownWebhookEvent($data['event']);
  263.         } catch (Exception $exception) {
  264.             throw new UnivapayInvalidWebhookData($data);
  265.         }
  266.     }
  267.     protected function getCustomerId($localCustomerId)
  268.     {
  269.         return $this->getStore($this->appToken->storeId)->getCustomerId($localCustomerId);
  270.     }
  271.     protected function getBankAccountContext()
  272.     {
  273.         return $this->getContext()->withPath('bank_accounts');
  274.     }
  275.     protected function getChargeContext()
  276.     {
  277.         return $this->getContext()->withPath('charges');
  278.     }
  279.     protected function getStoreContext()
  280.     {
  281.         return $this->getContext()->withPath('stores');
  282.     }
  283.     protected function getSubscriptionContext()
  284.     {
  285.         return $this->getContext()->withPath('subscriptions');
  286.     }
  287.     protected function getTransactionTokenContext()
  288.     {
  289.         return $this->getStoreBasedContext()->withPath('tokens');
  290.     }
  291.     protected function getTransactionContext()
  292.     {
  293.         return $this->getContext()->withPath('transaction_history');
  294.     }
  295.     protected function getTransferContext()
  296.     {
  297.         return $this->getContext()->withPath('transfers');
  298.     }
  299. }