httpClient = $httpAdapterPicker->pickHttpAdapter($httpClient); $compatibilityChecker = new \Mollie\Api\CompatibilityChecker(); $compatibilityChecker->checkCompatibility(); $this->initializeEndpoints(); $this->initializeVersionStrings(); $this->initializeIdempotencyKeyGenerator($idempotencyKeyGenerator); } public function initializeEndpoints() { $this->balanceReports = new \Mollie\Api\Endpoints\BalanceReportEndpoint($this); $this->balanceTransactions = new \Mollie\Api\Endpoints\BalanceTransactionEndpoint($this); $this->balances = new \Mollie\Api\Endpoints\BalanceEndpoint($this); $this->chargebacks = new \Mollie\Api\Endpoints\ChargebackEndpoint($this); $this->clientLinks = new \Mollie\Api\Endpoints\ClientLinkEndpoint($this); $this->clients = new \Mollie\Api\Endpoints\ClientEndpoint($this); $this->customerPayments = new \Mollie\Api\Endpoints\CustomerPaymentsEndpoint($this); $this->customers = new \Mollie\Api\Endpoints\CustomerEndpoint($this); $this->invoices = new \Mollie\Api\Endpoints\InvoiceEndpoint($this); $this->mandates = new \Mollie\Api\Endpoints\MandateEndpoint($this); $this->methods = new \Mollie\Api\Endpoints\MethodEndpoint($this); $this->methodIssuers = new \Mollie\Api\Endpoints\MethodIssuerEndpoint($this); $this->onboarding = new \Mollie\Api\Endpoints\OnboardingEndpoint($this); $this->orderLines = new \Mollie\Api\Endpoints\OrderLineEndpoint($this); $this->orderPayments = new \Mollie\Api\Endpoints\OrderPaymentEndpoint($this); $this->orderRefunds = new \Mollie\Api\Endpoints\OrderRefundEndpoint($this); $this->orders = new \Mollie\Api\Endpoints\OrderEndpoint($this); $this->organizationPartners = new \Mollie\Api\Endpoints\OrganizationPartnerEndpoint($this); $this->organizations = new \Mollie\Api\Endpoints\OrganizationEndpoint($this); $this->paymentCaptures = new \Mollie\Api\Endpoints\PaymentCaptureEndpoint($this); $this->paymentChargebacks = new \Mollie\Api\Endpoints\PaymentChargebackEndpoint($this); $this->paymentLinkPayments = new \Mollie\Api\Endpoints\PaymentLinkPaymentEndpoint($this); $this->paymentLinks = new \Mollie\Api\Endpoints\PaymentLinkEndpoint($this); $this->paymentRefunds = new \Mollie\Api\Endpoints\PaymentRefundEndpoint($this); $this->paymentRoutes = new \Mollie\Api\Endpoints\PaymentRouteEndpoint($this); $this->payments = new \Mollie\Api\Endpoints\PaymentEndpoint($this); $this->permissions = new \Mollie\Api\Endpoints\PermissionEndpoint($this); $this->profileMethods = new \Mollie\Api\Endpoints\ProfileMethodEndpoint($this); $this->profiles = new \Mollie\Api\Endpoints\ProfileEndpoint($this); $this->refunds = new \Mollie\Api\Endpoints\RefundEndpoint($this); $this->salesInvoices = new \Mollie\Api\Endpoints\SalesInvoiceEndpoint($this); $this->settlementCaptures = new \Mollie\Api\Endpoints\SettlementCaptureEndpoint($this); $this->settlementChargebacks = new \Mollie\Api\Endpoints\SettlementChargebackEndpoint($this); $this->settlementPayments = new \Mollie\Api\Endpoints\SettlementPaymentEndpoint($this); $this->settlementRefunds = new \Mollie\Api\Endpoints\SettlementRefundEndpoint($this); $this->settlements = new \Mollie\Api\Endpoints\SettlementsEndpoint($this); $this->sessions = new \Mollie\Api\Endpoints\SessionEndpoint($this); $this->shipments = new \Mollie\Api\Endpoints\ShipmentEndpoint($this); $this->subscriptionPayments = new \Mollie\Api\Endpoints\SubscriptionPaymentEndpoint($this); $this->subscriptions = new \Mollie\Api\Endpoints\SubscriptionEndpoint($this); $this->terminals = new \Mollie\Api\Endpoints\TerminalEndpoint($this); $this->wallets = new \Mollie\Api\Endpoints\WalletEndpoint($this); } protected function initializeVersionStrings() { $this->addVersionString("Mollie/" . self::CLIENT_VERSION); $this->addVersionString("PHP/" . \phpversion()); $httpClientVersionString = $this->httpClient->versionString(); if ($httpClientVersionString) { $this->addVersionString($httpClientVersionString); } } /** * @param \Mollie\Api\Idempotency\IdempotencyKeyGeneratorContract $generator * @return void */ protected function initializeIdempotencyKeyGenerator($generator) { $this->idempotencyKeyGenerator = $generator ? $generator : new \Mollie\Api\Idempotency\DefaultIdempotencyKeyGenerator(); } /** * @param string $url * * @return MollieApiClient */ public function setApiEndpoint($url) { $this->apiEndpoint = \rtrim(\trim($url), '/'); return $this; } /** * @return string */ public function getApiEndpoint() { return $this->apiEndpoint; } /** * @return array */ public function getVersionStrings() { return $this->versionStrings; } /** * @param string $apiKey The Mollie API key, starting with 'test_' or 'live_' * * @return MollieApiClient * @throws ApiException */ public function setApiKey($apiKey) { $apiKey = \trim($apiKey); if (!\preg_match('/^(live|test)_\\w{30,}$/', $apiKey)) { throw new \Mollie\Api\Exceptions\ApiException("Invalid API key: '{$apiKey}'. An API key must start with 'test_' or 'live_' and must be at least 30 characters long."); } $this->apiKey = $apiKey; $this->oauthAccess = \false; return $this; } /** * @param string $accessToken OAuth access token, starting with 'access_' * * @return MollieApiClient * @throws ApiException */ public function setAccessToken($accessToken) { $accessToken = \trim($accessToken); if (!\preg_match('/^access_\\w+$/', $accessToken)) { throw new \Mollie\Api\Exceptions\ApiException("Invalid OAuth access token: '{$accessToken}'. An access token must start with 'access_'."); } $this->apiKey = $accessToken; $this->oauthAccess = \true; return $this; } /** * Returns null if no API key has been set yet. * * @return bool|null */ public function usesOAuth() { return $this->oauthAccess; } /** * @param string $versionString * * @return MollieApiClient */ public function addVersionString($versionString) { $this->versionStrings[] = \str_replace([" ", "\t", "\n", "\r"], '-', $versionString); return $this; } /** * Enable debugging mode. If debugging mode is enabled, the attempted request will be included in the ApiException. * By default, debugging is disabled to prevent leaking sensitive request data into exception logs. * * @throws \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException */ public function enableDebugging() { if (!\method_exists($this->httpClient, 'supportsDebugging') || !$this->httpClient->supportsDebugging()) { throw new \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException("Debugging is not supported by " . \get_class($this->httpClient) . "."); } $this->httpClient->enableDebugging(); } /** * Disable debugging mode. If debugging mode is enabled, the attempted request will be included in the ApiException. * By default, debugging is disabled to prevent leaking sensitive request data into exception logs. * * @throws \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException */ public function disableDebugging() { if (!\method_exists($this->httpClient, 'supportsDebugging') || !$this->httpClient->supportsDebugging()) { throw new \Mollie\Api\Exceptions\HttpAdapterDoesNotSupportDebuggingException("Debugging is not supported by " . \get_class($this->httpClient) . "."); } $this->httpClient->disableDebugging(); } /** * Set the idempotency key used on the next request. The idempotency key is a unique string ensuring a request to a * mutating Mollie endpoint is processed only once. The idempotency key resets to null after each request. Using * the setIdempotencyKey method supersedes the IdempotencyKeyGenerator. * * @param $key * @return $this */ public function setIdempotencyKey($key) { $this->idempotencyKey = $key; return $this; } /** * Retrieve the idempotency key. The idempotency key is a unique string ensuring a request to a * mutating Mollie endpoint is processed only once. Note that the idempotency key gets reset to null after each * request. * * @return string|null */ public function getIdempotencyKey() { return $this->idempotencyKey; } /** * Reset the idempotency key. Note that the idempotency key automatically resets to null after each request. * @return $this */ public function resetIdempotencyKey() { $this->idempotencyKey = null; return $this; } /** * @param \Mollie\Api\Idempotency\IdempotencyKeyGeneratorContract $generator * @return \Mollie\Api\MollieApiClient */ public function setIdempotencyKeyGenerator($generator) { $this->idempotencyKeyGenerator = $generator; return $this; } /** * @return \Mollie\Api\MollieApiClient */ public function clearIdempotencyKeyGenerator() { $this->idempotencyKeyGenerator = null; return $this; } /** * Perform a http call. This method is used by the resource specific classes. Please use the $payments property to * perform operations on payments. * * @param string $httpMethod * @param string $apiMethod * @param string|null $httpBody * * @return \stdClass * @throws ApiException * * @codeCoverageIgnore */ public function performHttpCall($httpMethod, $apiMethod, $httpBody = null) { $url = $this->apiEndpoint . "/" . self::API_VERSION . "/" . $apiMethod; return $this->performHttpCallToFullUrl($httpMethod, $url, $httpBody); } /** * Perform a http call to a full url. This method is used by the resource specific classes. * * @see $payments * @see $isuers * * @param string $httpMethod * @param string $url * @param string|null $httpBody * * @return \stdClass|null * @throws ApiException * * @codeCoverageIgnore */ public function performHttpCallToFullUrl($httpMethod, $url, $httpBody = null) { if (empty($this->apiKey)) { throw new \Mollie\Api\Exceptions\ApiException("You have not set an API key or OAuth access token. Please use setApiKey() to set the API key."); } $userAgent = \implode(' ', $this->versionStrings); if ($this->usesOAuth()) { $userAgent .= " OAuth/2.0"; } $headers = ['Accept' => "application/json", 'Authorization' => "Bearer {$this->apiKey}", 'User-Agent' => $userAgent]; if ($httpBody !== null) { $headers['Content-Type'] = "application/json"; } if (\function_exists("php_uname")) { $headers['X-Mollie-Client-Info'] = \php_uname(); } $headers = $this->applyIdempotencyKey($headers, $httpMethod); $response = $this->httpClient->send($httpMethod, $url, $headers, $httpBody); $this->resetIdempotencyKey(); return $response; } /** * Conditionally apply the idempotency key to the request headers * * @param array $headers * @param string $httpMethod * @return array */ private function applyIdempotencyKey(array $headers, string $httpMethod) { if (!\in_array($httpMethod, [self::HTTP_POST, self::HTTP_PATCH, self::HTTP_DELETE])) { unset($headers['Idempotency-Key']); return $headers; } if ($this->idempotencyKey) { $headers['Idempotency-Key'] = $this->idempotencyKey; return $headers; } if ($this->idempotencyKeyGenerator) { $headers['Idempotency-Key'] = $this->idempotencyKeyGenerator->generate(); return $headers; } unset($headers['Idempotency-Key']); return $headers; } /** * Serialization can be used for caching. Of course doing so can be dangerous but some like to live dangerously. * * \serialize() should be called on the collections or object you want to cache. * * We don't need any property that can be set by the constructor, only properties that are set by setters. * * Note that the API key is not serialized, so you need to set the key again after unserializing if you want to do * more API calls. * * @deprecated * @return string[] */ public function __sleep() { return ["apiEndpoint"]; } /** * When unserializing a collection or a resource, this class should restore itself. * * Note that if you have set an HttpAdapter, this adapter is lost on wakeup and reset to the default one. * * @throws IncompatiblePlatform If suddenly unserialized on an incompatible platform. */ public function __wakeup() { $this->__construct(); } }