Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Megaplan API 
:(
    Опции темы
infarch
Дата 5.12.2014, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Приходилось ли кому нибудь работать с api мегаплана? Я уже второй день бьюсь над ним, пока получилось только залогиниться. Запросы данных не проходят, получаю сообщение "unauthorized". Использую RestSharp. Вот мой код:

Код

    class Api
    {
        const string Host = "mydomain.megaplan.ru";
        const string BaseUrl = "http://" + Host;
        const string ContentType = "application/x-www-form-urlencoded";

        private Login Login { get; set; }

        public Api(string username, string password)
        {
            Login = GetLogin(username, GetMd5Hash(password));
        }

        private static string BytesToHex(byte[] data)
        {
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            return sBuilder.ToString();
        }

        static string GetMd5Hash(string input)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
                return BytesToHex(data);
            }
        }

        public T Execute<T>(RestRequest request) where T : new()
        {
            var client = new RestClient(BaseUrl);
            var response = client.Execute<T>(request);
            if (response.ErrorException != null)
            {
                const string message = "Error retrieving response.  Check inner details for more info.";
                var exception = new ApplicationException(message, response.ErrorException);
                throw exception;
            }
            return response.Data;
        }

        private Login GetLogin(string login, string passwordMd5)
        {
            var request = new RestRequest();
            request.Resource = "/BumsCommonApiV01/User/authorize.api";
            request.RootElement = "data";
            request.AddParameter("Login", login);
            request.AddParameter("Password", passwordMd5);
            return Execute<Login>(request);
        }

        private string GetXAuthHeader(string signature, string accessId, string secretKey)
        {
            var cryptoProvider = new HMACSHA1(Encoding.UTF8.GetBytes(secretKey));
            byte[] encriptedBytes = cryptoProvider.ComputeHash(Encoding.UTF8.GetBytes(signature));
            string encryptedString = encriptedBytes.Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s);
            return accessId + ":" + Convert.ToBase64String(Encoding.UTF8.GetBytes(encryptedString));
        }
        
        private void SignRequest(RestRequest request)
        {
            DateTime requestDate = DateTime.UtcNow;
            string requestDateRfc = requestDate.ToString("r", CultureInfo.InvariantCulture);
            string signhost = Host + request.Resource;
            string signature = string.Join("\n",
                new string [] { request.Method.ToString(), "", ContentType, requestDateRfc, signhost });
            
            string xAutHeader = GetXAuthHeader(signature, Login.AccessId, Login.SecretKey);

            request.AddHeader("Accept-Encoding", "identity");
            request.AddHeader("Accept", "application/json");
            request.AddHeader("User-Agent", "SdfApi_Request");
            request.AddHeader("Date", requestDateRfc);
            request.AddHeader("X-Authorization", xAutHeader);
        }

        public Client FindClient(string phone)
        {
            var request = new RestRequest();
            request.Resource = "/BumsCrmApiV01/Contractor/list.api";
            request.Method = Method.GET;
            request.RootElement = "data";
            request.AddParameter("FilterId", "all");
            request.AddParameter("Limit", "1");
            request.AddParameter("Phone", "223322");

            SignRequest(request);

            return Execute<Client>(request);
        }

    }



Авторизация работает, а метод FindClient - нет. Вроде все сделал как положено. Кто подскажет в чем дело?

PM MAIL   Вверх
Экскалупатор
Дата 5.12.2014, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Сталкивался в некоторых сервисах. При авторизации выдается ключ, который потом нужно использовать в каждом запросе. Иначе получаем ошибку авторизации. Возможно тут так же.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL ICQ   Вверх
infarch
Дата 8.12.2014, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Цитата(Экскалупатор @  5.12.2014,  20:37 Найти цитируемый пост)
При авторизации выдается ключ, который потом нужно использовать в каждом запросе


Да, это понятно... Но я и залогинился, и ключи получил. А вот с подписями неувязка, что то не то. Копаю дальше...
PM MAIL   Вверх
Ivankult
Дата 23.9.2016, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Добрый вечер. Прошу прощения за оффтоп, но...
Вам удалось решить проблему? Ибо четвертый день долблю эту тему, насилую мозг техподдержке, но на все пподписанные запросы приходит 401. Сигнатура считается верно, ТП подтвердило. Но ТП расписалось в своем бессилии и предложило переписать все на ПХП, т.к. "на ПХП все работает". Чудики.
Может, там есть какая хитрость?
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
infarch
Дата 23.9.2016, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Помню, а как же ) Вот тут посмотрите: https://help.megaplan.ru/API_authentication . Тогда еще была старая версия документации, и параметр Content-MD5 никак небыл отмечен особо. Ну я его и передавал. А оказалось что его не нужно. Забрал, все заработало. Хотя у вас может быть и иная проблема, они же там затейники.

Добавлено через 8 минут и 59 секунд
Ну и насчет php тоже верно, там кое что имеет свою специфику. Вот вам пару классов из того проекта, поглядите.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  megaplan.rar 3,67 Kb
PM MAIL   Вверх
Ivankult
Дата 23.9.2016, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Уиии! Спасибо.. сча глянем!
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
Ivankult
Дата 23.9.2016, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Добрый день. По их докам и работал, но там все тухло. Отправлял посредством HttWebRequest, а с рестшарпом так и не разобрался. Ковырял ваши исходники - классно написано, но как и прочие примеры рестшарпа - валит ошибками:

Код


Не удалось найти имя типа или пространства имен "Login" (пропущена директива using или ссылка на сборку?)    

Comagic2Megaplan.Megaplan.Api.Login" является "свойство", но используется как "тип"    

Не удалось найти имя типа или пространства имен "Client" (пропущена директива using или ссылка на сборку?)    

Не удалось найти имя типа или пространства имен "Deal" (пропущена директива using или ссылка на сборку?)    


NuGet пакет рестшарпа подключен, что ему еще может быть надо?

Добавлено через 3 минуты и 15 секунд
Илии же Login, Client и Deal - ваши классы, которые в том же namesace, но другом файле, обертки ответов на запросы для десериализации ответов в объект класса?

Добавлено через 8 минут и 21 секунду
И что тогда такое ResponseWrapper? Тоже кастомный класс - парсер - преобразователь строки в экземплр заданного класса?
Можно попросить исодники всех вышеперечисленных классов, ежели это не будет излишней наглостью? Рестшарп оказался для меня слишком странным.
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
infarch
Дата 26.9.2016, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Врапер, как  Login, Client и Deal - это сущности которые заполняются рестшарпом согласно полученного json. Почитайте рестшарповские доки, там все это есть. Весь солюшен я вам дать не могу, там определенные ограничения. Вот прикладываю неймспейс мегаплана, его должно хватить для понимания.

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Megaplan.rar 5,64 Kb
PM MAIL   Вверх
Ivankult
Дата 26.9.2016, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Спасибо! Буду анализировать! 
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1327 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.