petun Posted July 24, 2016 Share Posted July 24, 2016 Как хэшировать - понятно, не понятно чего . Вот имеется задача посмотреть баланс. GET /v1/info/balance/ Базовый URL https://api.zadarma.com ключи для примера, не реальные. Key: e13343e3aр178fa6a0c4 Secret: 5063b5d096c625a9b532 далее по инструкции https://zadarma.com/ru/support/api/ " массив из передаваемых параметров (GET, POST, PUT, DELETE) сортируется по названию ключа по алфавиту;" в моем случае параметров нет, сортировать нечего и значит он пустой. Так? "из полученного массива формируется строка запроса (например, функция http_build_query в PHP), пример "from=DATEFROM&to=DATETO…"; значит и строка пустая. Так? "и далее - соединяется по формуле: строка = имя_метода + строка_запроса + md5( строка_запроса ), где "имя_метода" - строка запроса, начиная от домена (с указанием версии АПИ), до начала перечисления параметров, например - /v1/sip/" беру md5 от "пустоты", получаю d41d8cd98f00b204e9800998ecf8427e да? имя_метода="/v1/info/balance/" строка_запроса="" md5( строка_запроса ) d41d8cd98f00b204e9800998ecf8427e получаю строку /v1/info/balance/d41d8cd98f00b204e9800998ecf8427e "полученная строка хешируется по алгоритму sha1 с секретным ключом пользователя: хеш = hash( строка, секретный_ключ )" т.е. я хеширую своим секретным ключом 5063b5d096c625a9b532 строку /v1/info/balance/d41d8cd98f00b204e9800998ecf8427e да? echo -n '/v1/info/balance/d41d8cd98f00b204e9800998ecf8427e'|openssl dgst -sha1 -hmac "5063b5d096c625a9b532" получаю f0fbedf8ce31cd404054fbf0e950c9fe42e2a51a "и далее хеш кодируется в base64 подпись = base64_encode( хеш )" кодирую: echo -n 'f0fbedf8ce31cd404054fbf0e950c9fe42e2a51a' | base64 получаю: ZjBmYmVkZjhjZTMxY2Q0MDQwNTRmYmYwZTk1MGM5ZmU0MmUyYTUxYQ== "Каждый запрос, который нуждается в авторизации, сопровождается дополнительным заголовком, вида: "Authorization: ключ_пользователя: подпись" Ключи для авторизации необходимо получить в личном кабинете." Формирую запрос: curl -H "Authorization: e13273e3af178fa6a0c4 : ZjBmYmVkZjhjZTMxY2Q0MDQwNTRmYmYwZTk1MGM5ZmU0MmUyYTUxYQ==" https://api.zadarma.com/v1/info/balance/ и получаю ответ: {"status":"error","message":"Not authorized"} Чего не так? Может чего не то подставляю для хеширования в самом начале? Если кто поможет огромное СПС. Link to comment
Igor Posted July 24, 2016 Share Posted July 24, 2016 К сожалению я не разработчик, но быть может вам поможет библиотека на PHP? https://github.com/zadarma/user-api-v1 Link to comment
petun Posted July 25, 2016 Author Share Posted July 25, 2016 СПС. Это но это немного не то. Физически как делать, как кодить я понимаю. Я не понимаю что брать за параметры. Сам физ. поцесс. Link to comment
Igor Posted July 25, 2016 Share Posted July 25, 2016 Тогда напишите пожалуйста заявку в поддержку (именно заявку) и вам ответят разработчики. Link to comment
petun Posted July 26, 2016 Author Share Posted July 26, 2016 ОК. СПС. Ещё денёк подожду и обращусь в суппорт. Беспокоить их не хотелось по такому вопросу. Link to comment
petun Posted July 29, 2016 Author Share Posted July 29, 2016 Посмотрел чего выдаёт php hash_hmac('sha1', '/v1/info/balance/', md5(''), 'секретный код') Выдаёт sha1 в binary, сделал sha1 в бинари, результат тотже {"status":"error","message":"Not authorized"} Есть коммерческое предложение по этому вопросу. Так как я устал с этим API трахаться, то готов оплатить в частном порядке разумную сумму xNIX-ту за пошаговое решение этого примера на утилитах xNIX. Делов здесь на пять минут. Скрипт не нужен. Если это подходит, то могу дать своё мыло и реальную пару ключ-секрет. Деньги могу скинуть на номер телефона, карточку и т.д. Link to comment
pbx.gal.cv.ua Posted July 29, 2016 Share Posted July 29, 2016 Может, вам подойдет эзешник под виндовс? Тогда бесплатно, ссылка вот. Если на коммерческой основе, могу и под другую ос сваять. Link to comment
petun Posted July 30, 2016 Author Share Posted July 30, 2016 (edited) Может, вам подойдет эзешник под виндовс? Тогда бесплатно, ссылка вот. Если на коммерческой основе, могу и под другую ос сваять Linux или win. В win и curl.exe и openssl.exe - тоже есть. Просто xNIX нативнее. НЕ СКРИПТ, и тем более не lib или bin, а просто по-шагово. Как вверху писал, но чтобы работало. Если интересно мыло petunpetun0 AT gmail.com key: e13273e3af178fa6a0c4 secret: 4773b5d096c625a9b532 GET /v1/info/balance/ Далее по шагово, но чтобы оно заработало. У меня не работает md5 echo -n '' |openssl dgst -md5 d41d8cd98f00b204e9800998ecf8427e sha1 echo -n '/v1/info/balance/d41d8cd98f00b204e9800998ecf8427e4773b5d096c625a9b532' | openssl dgst -sha1 523f299bebf732104b8b6fe48aac78d1bacc8077 base64 echo -n '523f299bebf732104b8b6fe48aac78d1bacc8077' | openssl enc -base64 NTIzZjI5OWJlYmY3MzIxMDRiOGI2ZmU0OGFhYzc4ZDFiYWNjODA3Nw== curl -H "Authorization: e13273e3af178fa6a0c4:NTIzZjI5OWJlYmY3MzIxMDRiOGI2ZmU0OGFhYzc4ZDFiYWNjODA3Nw==" https://api.zadarma.com/v1/info/balance/ Edited July 30, 2016 by petun Link to comment
pbx.gal.cv.ua Posted July 30, 2016 Share Posted July 30, 2016 У меня с вашими кредитами тоже, not authorized. Может, ключ с секретом местами попутали? Link to comment
petun Posted July 30, 2016 Author Share Posted July 30, 2016 У меня с вашими кредитами тоже, not authorized. Может, ключ с секретом местами попутали? приводил ключи для примера. Как-то не хочется их выкладывать в общее обозрение. :) Напишите мне на мыло petunpetun0 at gmail.com Я Вам реальные пришлю. Link to comment
Igor Posted July 30, 2016 Share Posted July 30, 2016 Есть коммерческое предложение по этому вопросу.Так как я устал с этим API трахаться, то готов оплатить в частном порядке разумную сумму Честно говоря не понимаю, зачем сюда повторно писать и предлагать еще деньги? Создать заявку в поддержку я так понимаю религия не позволяет? :) Да, разработчиков мы редко грузим вопросами поддержки, но в данном случае кроме разработчика вам никто и не поможет. Link to comment
petun Posted July 30, 2016 Author Share Posted July 30, 2016 Решено. Разобрался. Спасибо за помощь. $ bash zadarma.sh /v1/info/balance/ #!/bin/bash # $1 это сюда запрос помещается /v1/info/balance/ declare -r key="мой ключ" declare -r secret="мой секрет" declare signature="" declare -r baseurl="https://api.zadarma.com" signature=`echo -n '' |openssl dgst -md5 | cut -d" " -f2` #echo "md5 = $signature" signature=`echo -n "$1$signature" | openssl dgst -sha1 -hmac "$secret" -hex | cut -d" " -f2` #echo "sha1 = $signature" signature=`echo -n "$signature" | openssl enc -base64 | cut -d" " -f2` #echo "base64 = $signature" #echo ""Authorization: $key:$signature"" "$baseurl""$1" curl -H "Authorization: $key:$signature" "$baseurl""$1" А вот в описании API на сайте https://zadarma.com/ru/support/api/ Не дурственно логику хеширования расписать. Пример на PHP - это хорошо. Но на PHP мир клином не сошёлся. Сиди тут и вычитывай, чего и как эта функция выделывает. Пример может по-шаговый привести по логике. типа. Ключ: 00332be6e9aae9ecad6d Секрет: 3ae4987babc9c8fbd808 1. Запрос без параметров /v1/info/balance/ 2. Значит md5 от пустоы. Оно всегда будет: d41d8cd98f00b204e9800998ecf8427e 3. Хэшируем в SHA1 в режиме вывода HEX в нижнем регистре, с использованием нашего секрета т.е. создаём хэш строки "/v1/info/balance/d41d8cd98f00b204e9800998ecf8427e" используя наш секрет 3ae4987babc9c8fbd808 и т.д. Link to comment
Igor Posted July 31, 2016 Share Posted July 31, 2016 Спасибо за описание и пожелание, передам. Link to comment
Clevelus Posted October 22, 2016 Share Posted October 22, 2016 У вас везде в примерах (в личном кабинете) пример кода: <?php if (isset($_GET['zd_echo'])) exit($_GET['zd_echo']); ?> Но данный код уязвим к атакам XSS. Проверьте, и замените код в примерах, например на этот. <?php if (isset($_GET['zd_echo'])) exit(htmlspecialchars($_GET['zd_echo'])); ?> Хотя, еще лучше использовать тернарный оператор. ЗЫ: не люблю PHP, так этот код по умолчанию на C# не будет уязвим. Link to comment
SergAxt Posted January 31, 2018 Share Posted January 31, 2018 Может, вам подойдет эзешник под виндовс? Тогда бесплатно, ссылка вот. Если на коммерческой основе, могу и под другую ос сваять. Привет! Прикольный экзешник. Было бы еще прикольнее передавать key и secret в коммандной строке. А то аккаунтов много, на всех папок не насоздаешься.... Link to comment
Igor Posted February 10, 2018 Share Posted February 10, 2018 А зачем создавать много аккаунтов? Link to comment
pbx.gal.cv.ua Posted February 11, 2018 Share Posted February 11, 2018 Было бы еще прикольнее передавать key и secret в коммандной строке. Такая возможность предусмотрена, любые параметры можно задавать и в командной строке, и в файле конфигурации. А зачем создавать много аккаунтов?Мультивалютные прайсы.Или, разные организации на обслуживании со своими балансами. Link to comment
SergAxt Posted February 13, 2018 Share Posted February 13, 2018 (edited) А зачем создавать много аккаунтов? Разные прайсы для разных направлений звонков. По России мне выгодно звонить с безлимита, по Казахстану, Армении, и пр. - со стандарта с посекундной тарификацией... Мы с вами уже на эту тему лет пять назад общались... И, насколько помню - вы сказали что невозможно обьединить внешние номера с других аккаунтов - в один. Edited February 13, 2018 by SergAxt Link to comment
Igor Posted February 13, 2018 Share Posted February 13, 2018 Да я и считаю что в сумме использовать несколько аккаунтов для разных прайсов не очень выгодно :) Но тут уж только вам решать. Link to comment
ms2002 Posted February 21, 2019 Share Posted February 21, 2019 Тогда напишите пожалуйста заявку в поддержку (именно заявку) и вам ответят разработчики. Ничего вразумительного они не отвечают Link to comment
mikeKlech Posted April 6, 2020 Share Posted April 6, 2020 Если кто-то как и я пользуется node.js вместо php: // шифровка var crypto = require('crypto'); const { base64encode, base64decode } = require('nodejs-base64'); // для запросов const fetch = require('node-fetch'); let secretKey = 'ваш секретный ключ' let key = 'ключ пользователя' let method = `/v1/info/balance/`; // для проверки баланса параметров указывать не нужно, поэтому вставляем пустую строку let md5 = crypto.createHash('md5').update('').digest('hex'); let text = method + md5; let hash = crypto.createHmac('sha1', secretKey).update(text).digest('hex'); var sign = base64encode(hash); // создаем заголовок let Authorization = `${key}:${sign}`; fetch('https://api.zadarma.com/v1/info/balance/', { headers: { Authorization }, }, ).then(res => res.json()).then(console.log) // { status: 'success', balance: 3.269, currency: 'USD' } Link to comment
Igor Posted April 6, 2020 Share Posted April 6, 2020 Спасибо за пример! Может на node также примеры опишем. Link to comment
mikeKlech Posted April 7, 2020 Share Posted April 7, 2020 Было бы очень хорошо, Igor. Увидел что у многих проблемы при отправлении запроса с параметрами. Параметры нужно вставить: let querry = httpBuildQuery({ number: '38063*******' }); 1. В md5 кодер let md5 = crypto.createHash('md5').update(querry).digest('hex'); 2. В строку запроса для кодирования sha1 let text = method + querry + md5; let hash = crypto.createHmac('sha1', secretKey).update(text).digest('hex'); 3. Непосредственно в саму строку запроса, где перед параметрами ставим знак вопроса. https://api.zadarma.com/v1/info/price/?number=38063********* Link to comment
Igor_L Posted April 14, 2020 Share Posted April 14, 2020 Привет! Может быть есть пример как из Node Red работать с API? Хотел бы автоматически звонить на несколько номеров в случае возникновения событий и проговаривать короткие тексты (1-2 фразы) . Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now