Перейти к публикации
timurrodya

Подскажите по работе Api

Рекомендованные сообщения

Здравствуйте!

1. В справке ошибка

$header = 'Authorization: ' . $userKey . ':' . $sign);

лишняя скобка

 

Делаем callback для сайтов, написали след. код все равно 401 ошибка, подскажите что не так

 

$method ='/v1/request/callback';

$userKey = '*';

$secret = '*';

$data['from'] = '*';

$data['to'] = '*';

 

 

$params=$data;

 

$url = 'https://api.zadarma.com';

ksort($params);

$paramsStr = http_build_query($params);

$sign = base64_encode(hash_hmac('sha1', $method . $paramsStr . md5($paramsStr), $secret));

 

$header = 'Authorization: ' . $userKey . ':' . $sign;

 

 

$options = array(

'http' => array(

'header' => $header,

'method' => 'POST',

'content' => $paramsStr

),

);

 

$context = stream_context_create($options);

 

$result = file_get_contents($url, false, $context);

 

return $result;

Поделиться сообщением


Ссылка на сообщение

Нужно исправить

1)

 

$method ='/v1/request/callback';

 

на

 

$method ='/v1/request/callback/';

 

2)

 

$url = 'https://api.zadarma.com';

 

на

 

$url = 'https://api.zadarma.com/v1/request/callback/';

Поделиться сообщением


Ссылка на сообщение

Это работает и отдает баланс без проблем

import urllib
import base64
import hmac
import hashlib
import requests

user_key = '123123123123'
user_secret = '321321321321'

url = 'https://api.zadarma.com/v1/info/balance/'
method = '/v1/info/balance/'
params = {}

def ksort(params):
    return [(k,params[k]) for k in sorted(params.keys())]

ksort_params = ksort(params)
params_str = urllib.urlencode(ksort_params)
md5_sum = hashlib.md5()
md5_sum.update(params_str)

full_method = method+params_str+md5_sum.hexdigest()

sign = base64.b64encode(hmac.new(user_secret,full_method,hashlib.sha1).hexdigest())
header = user_key + ':' + sign
headers = {'Authorization':header}

#request_url = endpoint + '?' + canonical_querystring

r = requests.get(url, headers=headers)

print 'Response code: %d\n' % r.status_code
print r.text

 

А вот здесь не работает и смс не отправляет. Хотя вроде все правильно сделал. Параметры отсортировал, строку сформировал (получилось message=test&number=79658700517), сделал всё то же самое, но не работает, пишет 401.

Чувствую, что накосячил в подписи. Но как? Правильно же вроде как все.

import urllib
import base64
import hmac
import hashlib
import requests

user_key = '123123123123'
user_secret = '321321321321'

url = 'https://api.zadarma.com/v1/sms/send/'
method = '/v1/sms/send/'
params = {'number': '79658700517', 'message': 'test'}

def ksort(params):
    return [(k,params[k]) for k in sorted(params.keys())]

ksort_params = ksort(params)

params_str = urllib.urlencode(ksort_params)
md5_sum = hashlib.md5()
md5_sum.update(params_str)

full_method = method + params_str + md5_sum.hexdigest()

sign = base64.b64encode(hmac.new(user_secret,full_method,hashlib.sha1).hexdigest())

headers = {'Authorization':user_key + ':' + sign}
url = url + params_str

# ************* SEND THE REQUEST *************

print '\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++'
print 'Request URL = ' + url
r = requests.post(url, headers=headers)

print '\nRESPONSE++++++++++++++++++++++++++++++++++++'
print 'Response code: %d\n' % r.status_code
print r.text

Изменено пользователем Aladex

Поделиться сообщением


Ссылка на сообщение

Чувствую, что накосячил в подписи. Но как? Правильно же вроде как все.

Как говорят "слона я и не заметил" :)

 

Прямо в описании этого метода большой полосой выделен текст:

"Обратите внимание: отправка SMS доступна только за пределы РФ."

Поделиться сообщением


Ссылка на сообщение

Как говорят "слона я и не заметил" :)

 

Прямо в описании этого метода большой полосой выделен текст:

"Обратите внимание: отправка SMS доступна только за пределы РФ."

Честно говоря, я именно это и подумал. Странно только, что ответ приходит

user_secret = '321321321321'

url = 'https linenums:0'>import urllibimport base64import hmacimport hashlibimport requestsuser_key = '123123123123'user_secret = '321321321321'url = 'https://api.zadarma.com/v1/request/callback/'method = '/v1/request/callback/'params = {'from': '155494', 'to': '79658700517'}sorted_params = {}for i in sorted(params): sorted_params = paramsdef ksort(params): return [(k,params[k]) for k in sorted(params.keys())]ksort_params = ksort(params)params_str = urllib.urlencode(ksort_params)md5_sum = hashlib.md5()md5_sum.update(params_str)full_method = method + url + md5_sum.hexdigest()sign = base64.b64encode(hmac.new(user_secret,full_method,hashlib.sha1).hexdigest())header = user_key + ':' + signheaders = {'Authorization':header}url = url + params_str# ************* SEND THE REQUEST *************print '\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++'print 'Request URL = ' + urlr = requests.post(url, headers=headers)print '\nRESPONSE++++++++++++++++++++++++++++++++++++'print 'Response code: %d\n' % r.status_codeprint r.text

Выдает ту же 401-ю.

Вот что собралось:

Строка после сортировки: from=155494&to=79658700517

Полный URL https://api.zadarma.com/v1/request/callback...;to=79658700517

 

full_method = method + params_str + md5_sum.hexdigest()

Fullmethod: /v1/request/callback/from=155494&to=79658700517ewqrwefwedfwefwefwefwefr

 

В общем, точно вижу, что где-то косячу. Скорее всего в строке отправки метода и параметров.

Сегодня попробую сравнить с PHP

Поделиться сообщением


Ссылка на сообщение

сделал всё то же самое, но не работает, пишет 401.

401 код говорит о том что авторизоваться не получилось, а не о том что нельзя отправлять смс.

В общем итог трех дней битвы с api у нас получилось только получить баланс http://medali.biz/callback2/ , потому как для него не требуется отправлять никаких параметров

В методах callback или /v1/info/price/ авторизоваться не получилось. Проблема в именно в передаваемых данных.

При этом если в методе /v1/info/price/ я опущу передачу параметра number, то мне выводит 400 Bad request

Как надо передавать параметры

Передаем их так

 

$options = array(
			'http' => array(
				'header'  => $header,
				'method'  => 'GET',
				'content' => $paramsStr
			),
		);

		$context  = stream_context_create($options);
		
		$result = file_get_contents($url, false, $context);
		echo $result;

Поделиться сообщением


Ссылка на сообщение

401 код говорит о том что авторизоваться не получилось, а не о том что нельзя отправлять смс.

В общем итог трех дней битвы с api у нас получилось только получить баланс http://medali.biz/callback2/ , потому как для него не требуется отправлять никаких параметров

В методах callback или /v1/info/price/ авторизоваться не получилось. Проблема в именно в передаваемых данных.

При этом если в методе /v1/info/price/ я опущу передачу параметра number, то мне выводит 400 Bad request

Судя по всему, мне на php проверять не придется. За меня вот уже проверили

Поделиться сообщением


Ссылка на сообщение

На php получилось

Полный URL https://api.zadarma.com/v1/request/callback...;to=79658700517
помоему пропущен символ ?

 

Вы неверно передаете параметры GET.

Пример правильной передачи:

$result = file_get_contents("https://api.zadarma.com/v1/request/callback/?from=XXX&to=YYY", false, $context);

Изменено пользователем timurrodya

Поделиться сообщением


Ссылка на сообщение

На php получилось

Полный URL https://api.zadarma.com/v1/request/callback...;to=79658700517
помоему пропущен символ ?

 

Вы неверно передаете параметры GET.

Пример правильной передачи:

$result = file_get_contents("https://api.zadarma.com/v1/request/callback/?from=XXX&to=YYY", false, $context);

Спасибо!

UPD. Да, это работает. Я в программировании вообще не в зуб ногой ) А про пропущенный знак вообще бы не догадался.

Изменено пользователем Aladex

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...