Форум программистов, компьютерный форум, киберфорум
CMS, конструкторы, форумы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/50: Рейтинг темы: голосов - 50, средняя оценка - 4.70
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51

Передача данных из формы сайта в AMO crm

04.05.2021, 15:21. Показов 11076. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Возникла необходимость интегрировать сайт с AMO crm. Раньше один раз приходилось делать интеграцию: в сети нашла готовый код и по аналогии сделала. А тут)) Они там изменения внесли -и как теперь настраивать интеграцию, я понять не могу.
В учетной записи crm в разделе "Настройки -> Интеграции" создала интеграцию. В документации взяла вот этот код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
$subdomain = 'test'; //Поддомен нужного аккаунта
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса
 
/** Соберем данные для запроса */
$data = [
    'client_id' => 'xxxx',
    'client_secret' => 'xxxx',
    'grant_type' => 'authorization_code',
    'code' => 'xxxxxx',
    'redirect_uri' => 'https://test.ru/',
];
 
/**
 * Нам необходимо инициировать запрос к серверу.
 * Воспользуемся библиотекой cURL (поставляется в составе PHP).
 * Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP.
 */
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
/** Устанавливаем необходимые опции для сеанса cURL  */
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST');
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); //Инициируем запрос к API и сохраняем ответ в переменную
$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());
}
 
/**
 * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
 * нам придётся перевести ответ в формат, понятный PHP
 */
$response = json_decode($out, true);
 
$access_token = $response['access_token']; //Access токен
$refresh_token = $response['refresh_token']; //Refresh токен
$token_type = $response['token_type']; //Тип токена
$expires_in = $response['expires_in']; //Через сколько действие токена истекает
, вставила значения ключа, id, кода авторизации, имя субдомена ииии.... что делать дальше - не понимаю(((
Может быть, кто-нибудь сможет объяснить на пальцах, пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2021, 15:21
Ответы с готовыми решениями:

Программист CRM AMO
Добрый день Нужен Программист CRM AMO для разработке модуля. Детально в личке по разработке

Передача данных из формы в тело страницы сайта
Приветствую! Есть некая задача: После отправки данных из формы (метод POST) пользователь перенаправляется на страницу благодарности....

Bitrix. CRM. Формирование данных нового заказа перед отправкой в CRM
Когда покупатель оформляет заказ на сайте (подтверждает его) ему на почту приходит письмо, так же заказ приходит в CRM Bitrix24 (Портал) в...

16
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
04.05.2021, 16:44
Этот код отрабатывает штатно? В $response содержатся токены и время истечения действия?
Теперь сохраните то, что содержится в $response куда-либо (БД или JSON-файл, например).

Далее просто работайте с API, передавая Access token согласно инструкции того API.
При инициализации клиента (кода, который будет работать с API) проверяйте, не истек ли срок действия Access token, указанный в expires_in.
Если истек, автоматически обновляйте его, как написано тут в разделе "4. Получение нового access token по его истечении":
https://www.amocrm.ru/develope... ep-by-step
1
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
05.05.2021, 10:50  [ТС]
В свое оправдание могу сказать, что я верстальщик. С PHP знакома на уровне функции mail() и вывода произвольных полей в WP...
Не понимаю. Ну вот этот код, который в 4м шаге,
PHP
1
2
3
4
5
6
7
$data = [
    'client_id' => 'xxxx',
    'client_secret' => 'xxxx',
    'grant_type' => 'refresh_token',
    'refresh_token' => 'xxxxxx',
    'redirect_uri' => 'https://test.ru/',
];
откуда должен refresh_token появиться? Что надо вместо 'xxxxxx' ставить? Переменную?
Грусть-печаль, короче.
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
05.05.2021, 11:11
Цитата Сообщение от Alice Romanova Посмотреть сообщение
С PHP знакома на уровне функции mail()
Лучше бы и с этим были не знакомы. Видел я, как верстальщики используют mail()
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.05.2021, 11:16
Цитата Сообщение от Alice Romanova Посмотреть сообщение
откуда должен refresh_token появиться?
Отсюда:
Цитата Сообщение от Para bellum Посмотреть сообщение
В $response содержатся токены и время истечения действия?
Теперь сохраните то, что содержится в $response куда-либо (БД или JSON-файл, например).
1) Один раз запускаете скрипт из вашего первого сообщения и забываете про него. Можете даже вообще удалить, так как ваше приложение далее уже будет оперировать с Access и Refresh token.
2) Доработайте скрипт из первого сообщения так, чтобы при его запуске значение из $response (там и Refresh token есть) сохранялось куда либо.
3) Вместо 'xxxxxx' подставляйте тот токен, который вы сохранили из $response при запуске первого скрипта.
1
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
05.05.2021, 11:17
Цитата Сообщение от Alice Romanova Посмотреть сообщение
Они там изменения внесли -и как теперь настраивать интеграцию, я понять не могу.
Все изменения описаны в документации. Может, там и примерный код есть. Но я не советую вам этим заниматься.
0
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
05.05.2021, 11:25  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Лучше бы и с этим были не знакомы. Видел я, как верстальщики используют mail()
Сочувствую.
Цитата Сообщение от estic Посмотреть сообщение
Все изменения описаны в документации. Может, там и примерный код есть. Но я не советую вам этим заниматься.
Большое спасибо! Очень ценный пост. Не знаю, обратили ли Вы внимание, но я не спрашивала совета, заниматься мне этим или нет.
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
05.05.2021, 12:05
Alice Romanova, я много раз видел, что бывает, когда верстальщики пытаются программировать. Но вы, конечно, можете не обращать внимания на мой совет.

Цитата Сообщение от Alice Romanova Посмотреть сообщение
Очень ценный пост.
Видимо, вы пока не понимаете, насколько ценный. Со временем, надеюсь, поймете.

Все, прекращаем оффтоп.
0
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
05.05.2021, 15:04  [ТС]
estic, дело в том, что советы дают по запросу. Запроса, делать или нет, не было. Видимо, есть такая необходимость, сделать. Иначе бы не лезла, куда уж мне.
Совет про документацию и примеры прекрасен, с учетом того, что выше было написано, что вот, взяла код-пример из документации))) Создаётся впечатление, что просто проходя мимо, решили указать мне моё место)))
Ну и (это я не о себе, а в общем), верстальщик может научиться программировать, представляете?

Добавлено через 1 минуту
Цитата Сообщение от Para bellum Посмотреть сообщение
2) Доработайте скрипт из первого сообщения так, чтобы при его запуске значение из $response (там и Refresh token есть) сохранялось куда либо.
3) Вместо 'xxxxxx' подставляйте тот токен, который вы сохранили из $response при запуске первого скрипта.
2 - сохранила в json-файл
3 - подставила
4 - взяла из документации пример запроса к методу account (5й шаг)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
$subdomain = 'test'; //Поддомен нужного аккаунта
$link = 'https://' . $subdomain . '.amocrm.ru/api/v2/account'; //Формируем URL для запроса
/** Получаем access_token из вашего хранилища */
$access_token = 'xxxx';
/** Формируем заголовки */
$headers = [
    'Authorization: Bearer ' . $access_token
];
/**
 * Нам необходимо инициировать запрос к серверу.
 * Воспользуемся библиотекой cURL (поставляется в составе PHP).
 * Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP.
 */
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
/** Устанавливаем необходимые опции для сеанса cURL  */
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$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());
}
$access_token = 'xxxx'; - сюда подставила Access токен. В итоге - "Ошибка: Unauthorized Код ошибки: 401"
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.05.2021, 15:34
Цитата Сообщение от Alice Romanova Посмотреть сообщение
сюда подставила Access токен
Как подставили, просто вручную? Чтения из файла там не вижу.
0
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
05.05.2021, 15:51  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
просто вручную?
угу...

создала файл data.json
в первой части кода (там, где одноразовый пароль) написала так
PHP
1
2
3
4
5
$resp  = file_put_contents('php/data.json',json_encode($response)); 
 
$str = file_get_contents('php/data.json');
$json = json_decode($str, true);
$token = $json['refresh_token'];
,
все-таки вот это 'refresh_token' => 'xxxxxx', должно выглядеть 'refresh_token' => $token так? Или вместо "ххххх" - длинный набор символов из data.json?

Ну и тут $access_token = 'xxxx', соответственно.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.05.2021, 16:04
Цитата Сообщение от Alice Romanova Посмотреть сообщение
все-таки вот это 'refresh_token' => 'xxxxxx', должно выглядеть 'refresh_token' => $token так?
Да.
Только считывать из файла нужно, само собой, в скрипте, где нужны эти refresh_token и access_token, а не прямо в том скрипте из первого сообщения.
Т.е. эту часть из предпоследнего вашего сообщения:
PHP
1
2
3
4
5
6
/** Получаем access_token из вашего хранилища */
$access_token = 'xxxx';
/** Формируем заголовки */
$headers = [
    'Authorization: Bearer ' . $access_token
];
Меняем на:
PHP
1
2
3
4
5
6
7
/** Получаем access_token из вашего хранилища */
$data = json_decode(file_get_contents(__DIR__ . '/php/data.json'), true);
 
/** Формируем заголовки */
$headers = [
    'Authorization: Bearer ' . $data['access_token']
];
И, если файл data.json есть по указанному пути и в нем содержатся корректные данные, скрипт должен нормально отработать.

P.S. Это, конечно, я для примера привожу. По-хорошему, тут нужно нормальный клиент присать. Иначе -- дублирование кода, куча этих file_get_contents с жестко прописанным путем к файлу.
1
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
05.05.2021, 17:03  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
И, если файл data.json есть по указанному пути и в нем содержатся корректные данные, скрипт должен нормально отработать.
файл есть, данные содержатся, скрипт не отрабатывает.
Опять:
"Ошибка: Unauthorized Код ошибки: 401"
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.05.2021, 17:30
1) Включите в PHP вывод всех ошибок на экран.
2) Распечатайте на экран то, что считали из файла. После этого:
PHP
1
$data = json_decode(file_get_contents(__DIR__ . '/php/data.json'), true);
Добавьте:
PHP
1
var_dump($data);
Результат скопируйте сюда, на форум (токены затрите, само собой). Мне нужно структуру массива видеть.
3) Если вы уверены, что в $data есть ключ access_token с верным токеном, можете сюда ничего не выкладывать. Тогда смотрите настройки в вашем кабинете на amocrm.ru. Может, там ограничения какие по IP или "Поддомен нужного аккаунта" вы не заменили с "test" на свой в коде.
1
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
06.05.2021, 08:38  [ТС]
Para bellum,
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
06.05.2021, 09:21
Ну, есть там access_token. Тогда смотрите пункт 3 из моего предыдущего сообщения:
Цитата Сообщение от Para bellum Посмотреть сообщение
Тогда смотрите настройки в вашем кабинете на amocrm.ru. Может, там ограничения какие по IP или "Поддомен нужного аккаунта" вы не заменили с "test" на свой в коде.
0
2 / 2 / 0
Регистрация: 15.06.2020
Сообщений: 51
06.05.2021, 10:17  [ТС]
Там тариф не позволяет ограничения по IP настроить. Поддомен заменен.

Para bellum, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2021, 10:17
Помогаю со студенческими работами здесь

Передача данных с DataGridView одной формы в TextBox другой формы
Ребята, мне необходимо передать значения с выбранной строки Datagridview в textboxы второй формы, но есть одно но! Нужно чтобы доступ был...

Передача данных из одной формы в таблицу dataGridView другой формы
Есть две формы на одной таблица на второй поля в которые пользователь вводит значения. Не получает со второй формы добавить больше одного...

Передача данных из одной формы в другую - ошибка в параметрах при открытии второй формы из первой
Здравствуйте! Имеется проект Windows Forms в среде CLR. Есть основная форма MainForm. По нажатию в ней кнопки input_addblock должна...

Передача данных в DGV 1-ой формы из textBox-ов 2-ой формы
У меня есть две формы, пытаюсь добавить новую строчку в datagridview 1-ой формы через textBox-ы 2-ой формы. Для этого пишу во 2-ой форме...

Передача данных из одной формы в БД другой формы
Сразу скажу, что я новичок в программирование. Суть следующая, имеются две формы, на первой форме несколько textboxов и кнопка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru