Php авторизация и отправка контактов в amocrm api

Amocrm — хорошая русская система, но когда читаешь документацию к её api, создаётся впечатление, что писал это явно туркмен. Не в обиду туркменам.

Авторизация по api в amocrm имеет интересную особенность, получения токенов доступа, обновления, этот доступ получается один раз, по коду авторизации, потом для его получения нужен токен обновления, в общем у «туркменов» какие то свои понятия о безопасности, почему то они считают что токен доступа перехватить можно, а токен обновления уже нельзя. Короче простейший код:

Вот у нас есть такой класс для упрощения взаимодействия с апи, статический метод отправляет запросы

class API
{

    public static function amocrm($request, $method = 'GET', $data = '', $headers = ['Content-Type:application/json'])
    {
        global $amocrm_domain;
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-oAuth-client/1.0');
        curl_setopt($curl, CURLOPT_URL, 'https://' . $amocrm_domain . $request);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        $out = curl_exec($curl);
        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        $code = (int)$code;
        $errors = [
            400 => 'Bad request',
            401 => 'Unauthorized',
            403 => 'Forbidden',
            404 => 'Not found',
            500 => 'Internal server error',
            502 => 'Bad gateway',
            503 => 'Service unavailable',
        ];

        try {
            if ($code < 200 || $code > 204) {
                throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
            }
        } catch (Exception $e) {
            die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
        }

        return json_decode($out);
    }
}

Теперь обработчик собственно отправки форм, если ещё нет у нас токена обновления то получаем токен доступа по коду авторизации, его берем в интеграции, он 20 мин действует. Далее получаем уже по кодам обновления токен доступа и отправляем в апи данные

<?php

/** amocrm обработчик форм */

$client_id = 'xxxxxxxxx';
$client_secret = 'xxxxxxxx';
$amocrm_domain = 'xxxx.amocrm.ru';
$redirect_uri = 'https://xxxxx.com/api/action/amocrm';


$refresh_token = file_exists('temp/refresh_token') ? file_get_contents('temp/refresh_token') : '';
$access_token = file_exists('temp/access_token') && filemtime('temp/access_token') > time() ? file_get_contents('temp/access_token') : '';


if (!$refresh_token) {
    $response = API::amocrm('/oauth2/access_token', 'POST', [
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'grant_type' => 'authorization_code',
        'code' => 'ваш первичный код авторизации из вашей интеграции, который 20 минут действует',
        'redirect_uri' => $redirect_uri,
    ]);
    file_put_contents('temp/refresh_token', $response->refresh_token);
    file_put_contents('temp/access_token', $response->access_token);
    touch('temp/access_token', time() + $response->expires_in - 1800);
    $access_token = $response->access_token;
    $refresh_token = $response->refresh_token;
}

if ($refresh_token && !$access_token) {
    $response = API::amocrm('/oauth2/access_token', 'POST', [
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'grant_type' => 'refresh_token',
        'refresh_token' => $refresh_token,
        'redirect_uri' => $redirect_uri,
    ]);
    file_put_contents('temp/refresh_token', $response->refresh_token);
    file_put_contents('temp/access_token', $response->access_token);
    touch('temp/access_token', time() + $response->expires_in - 1800);
    $access_token = $response->access_token;
    $refresh_token = $response->refresh_token;
}

!empty($_POST['contact']) or exit;
$_POST['name'] = $_POST['name'] ?? $_POST['contact'];

$data = [];
$data[0]['pipeline_id'] = 9999999;
$data[0]['_embedded']['tags'][0]['name'] = 'Сайт: Заявка на подбор';
$data[0]['_embedded']['contacts'][0]['name'] = $_POST['name'];
$data[0]['_embedded']['contacts'][0]['first_name'] = $_POST['name'];
$data[0]['_embedded']['contacts'][0]['custom_fields_values'] = [[
    "field_code" => "PHONE",
    "values" => [
        [
            "enum_code" => "WORK",
            "value" => $_POST['contact']
        ]
    ]
]];


$response = API::amocrm('/api/v4/leads/complex', 'POST', $data, [
    'Content-Type: application/json',
    'Authorization: Bearer ' . $access_token,
]);

exit(json_encode(['result' => 'ok', 'message' => 'Спасибо, заявка отправлена!']));

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *