2021-06-02 17:00:32 +03:00
[![Build Status ](https://github.com/retailcrm/api-client-php/workflows/CI/badge.svg )](https://github.com/retailcrm/api-client-php/actions)
[![Coverage ](https://img.shields.io/codecov/c/gh/retailcrm/api-client-php/master.svg?logo=codecov&logoColor=white )](https://codecov.io/gh/retailcrm/api-client-php)
2020-11-24 14:23:44 +03:00
[![Latest stable ](https://img.shields.io/packagist/v/retailcrm/api-client-php.svg )](https://packagist.org/packages/retailcrm/api-client-php)
2020-12-15 13:32:52 +03:00
[![PHP from Packagist ](https://img.shields.io/packagist/php-v/retailcrm/api-client-php.svg?logo=php&logoColor=white )](https://packagist.org/packages/retailcrm/api-client-php)
2018-02-21 09:42:10 +03:00
2013-07-02 12:37:54 +04:00
2020-12-15 13:32:52 +03:00
# RetailCRM API PHP client
2013-07-03 18:13:25 +04:00
2021-06-02 17:00:32 +03:00
This is the PHP RetailCRM API client. This library allows using of the actual API version.
You can find more info in the [documentation ](doc/index.md ).
# Table of contents
* [Requirements ](#requirements )
* [Installation ](#installation )
* [Usage ](#usage )
* [Examples ](#examples )
* [Notes ](#notes )
* [Documentation ](doc/index.md )
2014-11-13 13:04:11 +03:00
2016-03-12 01:54:33 +03:00
## Requirements
2013-07-03 18:13:25 +04:00
2021-06-02 17:00:32 +03:00
* PHP 7.3 and above
2016-03-12 01:54:33 +03:00
* PHP's cURL support
2019-08-30 14:10:52 +03:00
* PHP's JSON support
2021-06-02 17:00:32 +03:00
* Any HTTP client compatible with PSR-18 (covered by the installation instructions).
* Any HTTP factories implementation compatible with PSR-17 (covered by the installation instructions).
* Any HTTP messages implementation compatible with PSR-7 (covered by the installation instructions).
* Other dependencies listed in the `composer.json` (covered by the installation instructions)
2013-07-04 12:44:41 +04:00
2021-06-02 17:00:32 +03:00
## Installation
2013-07-04 12:44:41 +04:00
2021-06-02 17:00:32 +03:00
Follow those steps to install the library:
2013-07-04 12:44:41 +04:00
2021-06-02 17:00:32 +03:00
1. Download and install [Composer ](https://getcomposer.org/download/ ) package manager.
2. Install the library from the Packagist by executing this command:
2014-11-06 02:44:52 +03:00
```bash
2021-06-02 17:00:32 +03:00
composer require retailcrm/api-client-php:"~6.0"
```
2022-11-17 12:18:34 +03:00
During the installation you will see this message. Press `'y'` when you do:
```sh
civicrm/composer-compile-plugin contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins
Do you trust "civicrm/composer-compile-plugin" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?]
```
After that, you may see a message which will look like this:
2021-06-02 17:00:32 +03:00
```sh
The following packages have new compilation tasks:
- retailcrm/api-client-php has 1 task
Allow these packages to compile? ([y]es, [a]lways, [n]o, [l]ist, [h]elp)
2013-10-08 11:19:38 +04:00
```
2021-06-02 17:00:32 +03:00
2022-11-17 12:18:34 +03:00
Choose `[a]lways` by typing `a` and pressing Enter.
2021-12-13 10:46:08 +03:00
2022-11-17 12:18:34 +03:00
**Note:** You should choose `'y'` and `[a]lways` if your application is using CI/CD pipeline because the interactive terminal is not available
2021-12-13 10:46:08 +03:00
in that environment which will result in failure during the dependencies installation.
2021-06-02 17:00:32 +03:00
2022-11-17 12:18:34 +03:00
If you chose something else during the installation and API client doesn't work properly - please follow [these instructions ](doc/compilation_prompt.md#ive-chosen-something-else-now-api-client-doesnt-work ) to fix the problem.
2021-06-02 17:00:32 +03:00
2022-11-17 12:18:34 +03:00
3. Include the autoloader if it's not included, or you didn't use Composer before.
2014-11-07 13:05:40 +03:00
```php
require 'path/to/vendor/autoload.php';
```
2021-06-02 17:00:32 +03:00
Replace `path/to/vendor/autoload.php` with the correct path to Composer's `autoload.php` .
**Note:** API client uses `php-http/curl-client` and `nyholm/psr7` as a PSR-18, PSR-17 and PSR-7 implementation.
You can replace those implementations during installation by installing this library with the implementation of your choice, like this:
```sh
composer require symfony/http-client guzzlehttp/psr7 retailcrm/api-client-php:"~6.0"
```
More information about that can be found in the [documentation ](doc/customization/different_psr_implementations.md ).
2016-03-12 01:54:33 +03:00
## Usage
2014-11-06 02:55:09 +03:00
2021-06-02 17:00:32 +03:00
Firstly, you should initialize the Client. The easiest way to do this is to use the `SimpleClientFactory` :
```php
$client = \RetailCrm\Api\Factory\SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
```
The client is separated into several resource groups, all of which are accessible through the Client's public properties.
You can call API methods from those groups like this:
2014-11-07 11:31:33 +03:00
```php
2021-06-02 17:00:32 +03:00
$client->api->credentials();
```
For example, you can retrieve the customers list:
```php
$client = \RetailCrm\Api\Factory\SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
$response = $client->customers->list();
```
Or the orders list:
```php
$client = \RetailCrm\Api\Factory\SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
$response = $client->orders->list();
```
To handle errors you must use two types of exceptions:
* `RetailCrm\Api\Interfaces\ClientExceptionInterface` for the network or other runtime errors.
* `RetailCrm\Api\Interfaces\ApiExceptionInterface` for the errors from the API.
An example of error handling can be found in the next section of this document.
Each resource group is responsible for the corresponding API section. For example, `costs` resource group provide methods
for costs manipulation and `loyalty` resource group allows interacting with loyalty programs, accounts, bonuses, etc.
Use annotations to determine which DTOs you need for sending the requests. If annotations are not provided by your IDE - you
probably should configure them. It'll ease your work with this (and any other) library a lot.
More information about the usage including examples can be found in the [documentation ](doc/usage/usage.md ).
## Examples
Listing orders:
```php
< ?php
use RetailCrm\Api\Interfaces\ClientExceptionInterface;
use RetailCrm\Api\Factory\SimpleClientFactory;
use RetailCrm\Api\Interfaces\ApiExceptionInterface;
use RetailCrm\Api\Model\Entity\CustomersCorporate\CustomerCorporate;
$client = SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
2014-11-06 02:55:09 +03:00
try {
2021-06-02 17:00:32 +03:00
$response = $client->orders->list();
} catch (ApiExceptionInterface | ClientExceptionInterface $exception) {
echo $exception; // Every ApiExceptionInterface and ClientExceptionInterface instance implements __toString() method.
exit(-1);
2014-11-06 02:55:09 +03:00
}
2021-06-02 17:00:32 +03:00
foreach ($response->orders as $order) {
printf("Order ID: %d\n", $order->id);
printf("First name: %s\n", $order->firstName);
printf("Last name: %s\n", $order->lastName);
printf("Patronymic: %s\n", $order->patronymic);
printf("Phone #1: %s\n", $order->phone);
printf("Phone #2: %s\n", $order->additionalPhone);
printf("E-Mail: %s\n", $order->email);
if ($order->customer instanceof CustomerCorporate) {
echo "Customer type: corporate\n";
} else {
echo "Customer type: individual\n";
}
foreach ($order->items as $item) {
echo PHP_EOL;
printf("Product name: %s\n", $item->productName);
printf("Quantity: %d\n", $item->quantity);
printf("Initial price: %f\n", $item->initialPrice);
}
echo PHP_EOL;
printf("Discount: %f\n", $order->discountManualAmount);
printf("Total: %f\n", $order->totalSumm);
echo PHP_EOL;
2014-11-06 02:55:09 +03:00
}
2014-11-06 03:18:39 +03:00
```
2021-06-02 17:00:32 +03:00
Fetching a specific order by it's ID:
2014-11-06 03:18:39 +03:00
```php
2021-06-02 17:00:32 +03:00
< ?php
use RetailCrm\Api\Interfaces\ClientExceptionInterface;
use RetailCrm\Api\Interfaces\ApiExceptionInterface;
use RetailCrm\Api\Enum\ByIdentifier;
use RetailCrm\Api\Factory\SimpleClientFactory;
use RetailCrm\Api\Model\Request\BySiteRequest;
2014-11-06 03:18:39 +03:00
2021-06-02 17:00:32 +03:00
$client = SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
2014-11-06 03:18:39 +03:00
try {
2021-06-02 17:00:32 +03:00
$response = $client->orders->get(1234, new BySiteRequest(ByIdentifier::ID, 'site'));
} catch (ApiExceptionInterface | ClientExceptionInterface $exception) {
echo $exception; // Every ApiExceptionInterface instance should implement __toString() method.
exit(-1);
2014-11-06 03:18:39 +03:00
}
2021-06-02 17:00:32 +03:00
echo 'Order: ' . print_r($response->order, true);
```
Creating a new customer:
```php
< ?php
use RetailCrm\Api\Interfaces\ClientExceptionInterface;
use RetailCrm\Api\Interfaces\ApiExceptionInterface;
use RetailCrm\Api\Factory\SimpleClientFactory;
use RetailCrm\Api\Model\Entity\Customers\Customer;
use RetailCrm\Api\Model\Request\Customers\CustomersCreateRequest;
$client = SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
$request = new CustomersCreateRequest();
$request->customer = new Customer();
$request->site = 'aliexpress';
$request->customer->email = 'john.doe@example.com';
$request->customer->firstName = 'John';
$request->customer->lastName = 'Doe';
try {
$response = $client->customers->create($request);
} catch (ApiExceptionInterface | ClientExceptionInterface $exception) {
echo $exception; // Every ApiExceptionInterface instance should implement __toString() method.
exit(-1);
2014-11-06 03:18:39 +03:00
}
2021-06-02 17:00:32 +03:00
echo 'Customer ID: ' . $response->id;
2014-11-06 17:24:44 +03:00
```
2018-03-20 21:28:14 +03:00
2021-06-02 17:00:32 +03:00
Creating a task for the user with a specific email:
2020-08-21 10:24:55 +03:00
```php
2021-06-02 17:00:32 +03:00
< ?php
use RetailCrm\Api\Interfaces\ClientExceptionInterface;
use RetailCrm\Api\Interfaces\ApiExceptionInterface;
use RetailCrm\Api\Factory\SimpleClientFactory;
use RetailCrm\Api\Model\Entity\Tasks\Task;use RetailCrm\Api\Model\Filter\Users\ApiUserFilter;
use RetailCrm\Api\Model\Request\Tasks\TasksCreateRequest;
use RetailCrm\Api\Model\Request\Users\UsersRequest;
$client = SimpleClientFactory::createClient('https://test.retailcrm.pro', 'apiKey');
$usersRequest = new UsersRequest();
$usersRequest->filter = new ApiUserFilter();
$usersRequest->filter->email = 'john.doe@example.com';
try {
$usersResponse = $client->users->list($usersRequest);
} catch (ApiExceptionInterface | ClientExceptionInterface $exception) {
echo $exception; // Every ApiExceptionInterface instance should implement __toString() method.
exit(-1);
}
if (0 === count($usersResponse->users)) {
echo 'User is not found.';
exit(-1);
}
$tasksRequest = new TasksCreateRequest();
$tasksRequest->task = new Task();
$tasksRequest->task->performerId = $usersResponse->users[0]->id;
$tasksRequest->task->text = 'Do something!';
$tasksRequest->site = 'site';
try {
$tasksResponse = $client->tasks->create($tasksRequest);
} catch (ApiExceptionInterface | ClientExceptionInterface $exception) {
echo $exception; // Every ApiExceptionInterface instance should implement __toString() method.
exit(-1);
}
echo 'Created task with ID: ' . $tasksResponse->id;
2020-08-21 10:24:55 +03:00
```
2021-06-02 17:00:32 +03:00
The error handling in the examples above is good enough for real production usage.
You can safely assume that `ApiExceptionInterface` is an error from the API, and `ClientExceptionInterface` is a client error
(e.g. network error or any runtime error, use `HttpClientException` to catch only PSR-18 client errors).
However, you can implement more complex error handling if you want.
Also, both `ApiExceptionInterface` and `ClientExceptionInterface` implements `__toString()` . This means that you can just
convert those exceptions to string and put the results into logs without any special treatment for the exception data.
More examples can be found in the [documentation ](doc/usage/examples/index.md ).
You can use a PSR-14 compatible event dispatcher to receive events from the client. See [documentation ](doc/index.md ) for details.
## Notes
This library uses HTTPlug abstractions. Visit [official documentation ](http://docs.php-http.org/en/latest/httplug/users.html ) to learn more about it.