ssplast 0 Опубликовано: 15 апреля 2020 Share Опубликовано: 15 апреля 2020 (изменено) Не удаётся авторизоваться /v1/sms/send/ javascript node.js { status: 'error', message: 'Not authorized' } GET /v1/info/price/ с параметрами : есть ответ OK POST /v1/sms/send/ с параметрами: error 401 Подскажите что не так? песочница : https://runkit.com/ssplast/5e974d1b0c400600130754a0 const crypto = require('crypto'); const fetch = require('node-fetch'); const Bluebird = require('bluebird'); fetch.Promise = Bluebird; const userKey = "b46b5676866e01003bab"; const userSecret = "938b9c6d4bb7d2e262a4"; const prepare = (method, params) => { let params_str = Object.keys(params) .sort((a, b) => a === b ? 0 : a > b ? 1 : -1) .map(key => `${key}=${params[key]}`) .join('&'); let md5 = crypto.createHash('md5').update(params_str).digest('hex'); let hex = crypto.createHmac('sha1', userSecret) .update(method + params_str + md5).digest('hex'); let sign = new Buffer.from(hex).toString('base64'); return { authorization: userKey + ":" + sign, url: "https://api.zadarma.com" + method + "?" + params_str } } const fetch_request = async ({url, method, params, authorization}) => { let opt = { method: method, headers: { "Authorization": authorization, 'Content-Type': 'application/json' } } if(method === 'POST'){ opt.body = JSON.stringify(params) } let res = await fetch(url, opt) .then(res => res.json()) .catch(err => {console.log(err)}); return res; } let send_to_api = async ({get_post, method, params}) => { let {url, authorization} = prepare(method, params); return fetch_request({ url: url, method: get_post, params: params, authorization: authorization }); } (async _ => { let result = await send_to_api({ get_post: 'GET', method: '/v1/info/price/', params: { 'number': encodeURI('380959897908'), 'caller_id': encodeURI('380948232794') } }); console.log('\n----/v1/info/price/\n', result); result = await send_to_api({ get_post: 'POST', method: '/v1/sms/send/', params: { 'number': encodeURI('380959897908'), 'message': encodeURI('test тест 123') } }); console.log('\n\n------/v1/sms/send/\n', result); })() Изменено 15 апреля 2020 пользователем ssplast Ссылка на сообщение
mikeKlech 0 Опубликовано: 16 апреля 2020 Share Опубликовано: 16 апреля 2020 (изменено) Извините, нет времени разбираться в вашем коде, возьмите мои готовые функции, работают на 100%: // шифровка const crypto = require('crypto'); const { base64encode } = require('nodejs-base64'); const httpBuildQuery = require('http-build-query'); // для запросов const fetch = require('node-fetch'); sortObjKeys = (obj) => { var ordered = {}; Object.keys(obj).sort().forEach(function (key) { ordered[key] = obj[key]; }); return ordered; } //только тут стоит метод GET замените на POST const makeRequest = async (method, params) => { let sortedParams = sortObjKeys(params); let querry = httpBuildQuery(sortedParams); let md5 = crypto.createHash('md5').update(querry).digest('hex'); let text = method + querry + md5; let hash = crypto.createHmac('sha1', secretKey).update(text).digest('hex'); let sign = base64encode(hash); // создаем заголовок let Authorization = `${key}:${sign}`; let request = await fetch(`https://api.zadarma.com${method}?${querry}`, { headers: { Authorization: Authorization }, method: 'GET' }); let response = await request.json(); console.log(response) return response; }; Изменено 16 апреля 2020 пользователем mikeKlech Ссылка на сообщение
Igor 0 Опубликовано: 17 апреля 2020 Share Опубликовано: 17 апреля 2020 Напишите пожалуйста заявку в поддержку, там подскажут что как не сработало. Ссылка на сообщение
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас