REST в бизнес-процессах
Используем REST |
Чтобы приложение Битрикс24 могло зарегистрировать действие в дизайнере бизнес-процессов, при загрузке нужно указать ему разрешение на работу с ними.
В это разрешение входят следующие методы:
- bizproc.activity.add
- bizproc.activity.delete
- bizproc.activity.list
- bizproc.activity.log
- bizproc.event.send
Приложение при помощи метода bizproc.activity.add регистрирует свое действие бизнес-процесса, которое будет отображаться во вкладке дизайнера Действия приложений. При этом для действия необходимо задать:
- названия и описания для разных языков,
- список входных и выходных параметров действия,
- ссылка на обработчик,
- применимость к различным типам документов,
- дополнительные параметры типа флага, предполагается ли ожидание завершения, или типа авторизации.
var params = { 'CODE': 'md5', 'HANDLER': 'http://sigurd.office.bitrix.ru/bp/ping.php', 'AUTH_USER_ID': 1, 'USE_SUBSCRIPTION': 'Y', 'NAME': { 'ru': 'MD5 генератор', 'en': 'MD5 generator' }, 'DESCRIPTION': { 'ru': 'Действие возвращает MD5 хеш от входящего параметра', 'en': 'Activity returns MD5 hash of input parameter' }, 'PROPERTIES': { 'inputString': { 'Name': { 'ru': 'Входящая строка', 'en': 'Input string' }, 'Description': { 'ru': 'Введите строку, которую вы хотите хешировать', 'en': 'Input string for hashing' }, 'Type': 'string', 'Required': 'Y', 'Multiple': 'N', 'Default': '{=Document:NAME}', } }, 'RETURN_PROPERTIES': { 'outputString': { 'Name': { 'ru': 'MD5', 'en': 'MD5' }, 'Type': 'string', 'Multiple': 'N', 'Default': null } } }; BX24.callMethod( 'bizproc.activity.add', params, function(result) { if(result.error()) alert("Error: " + result.error()); else alert("Успешно: " + result.data()); } );
Результат:
Когда исполняющийся бизнес-процесс, содержащий данное действие, доходит до зарегистрированного приложением действия, то совершается вызов ссылки, указанной в параметре HANDLER
. В POST-данных передаются идентификатор бизнес-процесса и идентификатор действия бизнес-процесса, входные параметры действия, а также, параметры REST-авторизации. Все происходит аналогично вызовам обработчиков событий.
Пример входных данных:
array( 'workflow_id' => '55c1dc1c3f0d75.78875596', 'event_token' => '55c1dc1c3f0d75.78875596|A51601_82584_96831_81132|hsyUws1j4XiwqPqN45eH66CcQtEvpUIP.47dd5d888e8e549d2c984713e12a4268e6e87d0208ca1f093ba1075e77f92e90' 'code' => 'md5', 'properties' => array( 'inputString' => 'Тестовый текст: Тест событий для поста в ЖЛ', ), 'auth' => array( 'access_token' => '2irn0939uscuk7xxacc8tgn7vyjs4xn3', 'expires_in' => '3600', 'scope' => 'bizproc,user', 'user_id' => '1', 'status' => 'L', 'member_id' => 'd41d8cd98f00b204e9800998ecf8427e', 'domain' => 'b24.sigurd.bx', ), 'ts' => '1442580723', )
Затем бизнес-процесс либо продолжается, либо останавливается и ждет ответа от приложения. Это зависит от настроек действия.
Приложение должно сообщить бизнес-процессу результат своей работы и дать сигнал, что можно продолжать бизнес-процесс дальше. Делается это при помощи метода bizproc.event.send, которому передаются значения выходных параметров, заданных в описании действия, а также, информация для записи в лог бизнес-процесса. Пока приложение не сообщило ответ на свое действие, оно может записывать информацию в лог процесса при помощи метода bizproc.activity.log.
В следующем примере содержится код простейшего обработчика, возвращающего бизнес-процессу md5 от полученной строки:
<?php file_put_contents(dirname(__FILE__)."/db/log.log", date('c').": ".var_export($_REQUEST, 1)."\n", FILE_APPEND); if(is_array($_REQUEST["auth"]) && isset($_REQUEST["auth"]["access_token"])) { $portal = $_REQUEST["auth"]["domain"]; $requestValue = $_REQUEST["properties"]["inputString"]; $responseValue = md5($requestValue); $c = curl_init("http://" . $portal . "/rest/bizproc.event.send.json"); $params = array( "auth" => $_REQUEST["auth"]["access_token"], "event_token" => $_REQUEST["event_token"], "log_message" => "Got '".$requestValue."' string!", "return_values" => array( "outputString" => $responseValue, ) ); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_HEADER, true); curl_setopt($c, CURLINFO_HEADER_OUT, true); curl_setopt($c, CURLOPT_VERBOSE, true); curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($params)); $response = curl_exec($c); file_put_contents(dirname(__FILE__)."/db/log.log", "response: ".$response."\n", FILE_APPEND); }
В самом процессе это выглядит следующим образом:
и Ваше мнение важно для нас