Кто нибудь работал с BPM через odata на PHP?

Я с codeplex'а скачал SDK, но ничего не получается с самого начала, не генерится proxy класс...

Нравится

9 комментариев

Здравствуйте, Александр!

Мы не работали с OData, используя PHP. Проконсультировались с департаментом разработки, они предоставили нам несколько примеров. Возможно они Вам помогут.

1. Реализация авторизации на php к BPMonline и вызов Web-метода

Пример реализации:
<?php
//*********************************************
//Обращение к методу AuthService (Авторизация)
//*********************************************
//Ссылка на метод авторизации
$url = "https://site_example/ServiceModel/AuthService.svc/Login";
//Формируем данные для запроса
$requestData["Language"] = "ru";
$requestData["SolutionName"] = "TSBpm";
$requestData["TimeZoneOffset"] = -180;
$requestData["UserName"] = "User1";
$requestData["UserPassword"] = "User1";
//Формируем json-представление данных
$jcres = json_encode($requestData);

//Инициируем сеанс cUrl
$ch = curl_init($url);
//Определяем файл для хранения cookies
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
//Указываем метод запроса
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
//Подставляем данные для передачи в запросе
curl_setopt($ch, CURLOPT_POSTFIELDS, $jcres);
//Указываем, что результат вернем в строку при вызове метода curl_exec()
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Формируем массив http-заголовков. Формат json.
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jcres))
);
//Выполняем запрос cURL
$result = curl_exec($ch);
//Закрываем соединение
curl_close($ch);

//*********************************************
//Обращение к методу GetCardInfo
//*********************************************
//Ссылка на метод авторизации GetCardInfo
//CardNumber -- входящий парметр метода GetCardInfo
$urlGetCardInfo = "https://site_example/0/Services/CardInfoService/GetCardInfo?CardNumber=";
//Номер карты, по которому получим результат при обращении к сервису
$cardNumber = "000000000010";
//Инициируем сеанс cUrl
$ch = curl_init($urlGetCardInfo . $cardNumber);
//Cчитываем cookie с файла, которые получили после авторизации по методу AuthService.svc
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
//Записываем cookie
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
//Указываем метод запроса
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
//Указываем, что результат вернем в строку при вызове метода curl_exec()
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Получаем результат обрещения
$result = curl_exec($ch);
//Закрываем соединение
curl_close($ch);
echo "
";
//Выводим результат обращения
echo var_dump($result);
?>

2. Пример обращения к Odata из 1С

Site = "http://site:8081/WebApp/";//СокрЛП(Константа.BPMonline_Site);
DeletedEntityQueryTextTitle = "0/ServiceModel/EntityDataService.svc/DeletedEntityCollection?$select=";
DeletedEntityQueryText1 = "Id,ID1C,EntityUId,ModifiedOn,Date,DocumentDate,Entity,DocumentDate,AccountType/Id,AccountType/Name,DocumentType/Id,DocumentType/Name,Division/Id,Division/Code1C,Division/Name";
DeletedEntityQueryText2 = "&$expand=AccountType,DocumentType,Division";
DeletedEntityQueryTextConditions = "&$filter=(ModifiedOn gt datetime'" + ModifiedDateFrom + "' and Division/Code1C eq '"+ DivisionCode + "') ";
DeletedEntityRequestText = Site + DeletedEntityQueryTextTitle + DeletedEntityQueryText1 + DeletedEntityQueryText2 + DeletedEntityQueryTextConditions;
OdataRequest = PreapareRequestHeader(DeletedEntityRequestText);
OdataRequest.SetCredentials("O.Kotko", "O.Kotko", 0);
OdataRequest.Send();

Уже что то, большое спасибо. Буду посмотреть. :smile:

Коллеги, реализация на PHP не заработала. В ответ приходит ошибка 401 {"Message":"Проверка подлинности не пройдена.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}. Логин и пароль очень внимательно проверяли.

Подскажите, пожалуйста, в чём может быть проблема? Нужно ли в самом bpm что то донастроить?

Возможно, кука, полученная при вызове сервиса авторизации, не передалась или передалась неправильно при вызове последующих сервисов?

Ошибка приходит на каком сервисе, авторизации или другом?

И что за версия bpm'online используется?

Ошибка на сервисе авторизации, т.е. это первый запрос отправляется, для прохождения авторизации, до кукис не доходит.

Версия bpm'online sales team 7.8

Не знаю, как в 7.8, но ранее в правах доступа на операции была «Доступ к OData» (код «CanUseODataService»). По умолчанию у админов такое право есть. Проверьте, может, у этого пользователя забыли добавить?

И ещё проверьте, пускает ли в OData под этим пользователем не из PHP, а вручную из браузера.

"Зверев Александр" написал:правах доступа на операции была «Доступ к OData» (код «CanUseODataService»). По умолчанию у админов такое право есть.

Александр, спасибо! Добавил права на доступ к oData для конкретного пользователя и авторизация стала проходить. Стояли групповые права, почему то с ними не работал доступ.

Есть пример на php или js post (добавление данных) для OData ?

делаю так:

https://community.terrasoft.ua/questions/odata-php#comment-72267

По сути не важно какими средствами отправлять запрос, главное, что бы ушел корректный http-запрос. 

Показать все комментарии