микро uniquetamp, что это? - PullRequest
1 голос
/ 13 апреля 2019

Я занимаюсь разработкой небольшого программного обеспечения на основе запросов API с помощью php cURL.

Я столкнулся с проблемой частных запросов API. Одним из параметров запроса является «nonce» (метка времени unix), но ответом является «недопустимое nonce».

Обращаясь в службу поддержки, они отвечают мне, что:

" Неверный одноразовый номер отправляется, когда отправленный вами одноразовый номер меньше или равен ранее отправленному одноразовому номеру. "

И

" если вы делаете 2 запроса в секунду, вам нужно увеличить одноразовый номер для второго запроса (вы можете использовать микро уникальную метку, чтобы за одну секунду вы могли создать 1000000 уникальных одноразовых номеров за 1 секунду). "

Мой вопрос : Какую функцию я могу использовать для решения этой проблемы !? Я пробовал функцию microtime (), но я получаю ту же ошибку.

Спасибо и извините за мой плохой английский.

Мой код:

$unix_time = time();
$microtime = number_format(microtime(true), 5, '', '')
$message = $unix_time.$customer_id.$API_KEY; //nonce + customer id + api key
$signature = hash_hmac('sha256', $message, $API_SECRET);

$ticker_url = "https://www.bitstamp.net/api/v2/ticker/btceur";
$balance_url = "https://www.bitstamp.net/api/v2/balance/btceur/";

$param_array = array(
    "key" => $API_KEY,
    "signature" => strtoupper($signature),
    "nonce" => $microtime  
);

switch($_POST['action']){
    case 'ticker_btceur':
        ticker_btceur($param_array, $ticker_url);
        break;
    case 'balance_btceur':
        balance_btceur($param_array, $balance_url);
        break;
}

function ticker_btceur($da, $b_url){ // cURL GET 

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $b_url."?key=".$da['key']."&signature=".$da['signature']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/cacert.pem");

    if(curl_exec($ch) === false){
        echo "Errore: ". curl_error($ch)." - Codice errore: ".curl_errno($ch);
    }
    else{
        $result = curl_exec($ch);
        echo $result;
    }
    curl_close($ch);
}

 function balance_btceur($pa, $b_url){ // cURL POST 

 $ch = curl_init();

 curl_setopt($ch,CURLOPT_URL, $b_url);
 curl_setopt($ch,CURLOPT_POST, count($pa));
 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pa));

 if(curl_exec($ch) === false){
    echo "Errore: ". curl_error($ch)." - Codice errore: ".curl_errno($ch);
 }
 else{
     $result = curl_exec($ch);
     echo $result;
 }
 curl_close($ch);

}

Ответы [ 3 ]

0 голосов
/ 13 апреля 2019

Кажется, что API требует микросекунд, вот функция для получения микросекунд:

function microseconds()
{
    list($usec, $sec) = explode(" ", microtime());
    return $sec . ($usec * 1000000);
}


echo microseconds();
echo "\n";
0 голосов
/ 13 апреля 2019

я думаю, что они значат:

$stamp=(string)(int)(microtime(true)*1000000);

этот штамп будет меняться 1 миллион раз в секунду, в зависимости от того, когда вы его генерируете, он выглядит примерно так:

string(16) "1555177383042022"

.. просто обратите внимание, что этот код не будет работать должным образом в 32-битной системе, если ваш код требует 32-битной совместимости с php, сделайте это вместо:

$stamp2=bcmul(number_format(microtime(true),18,".",""),"1000000",0);
0 голосов
/ 13 апреля 2019

microtime() - текущая метка времени Unix с микросекундами, и она отличается от обычного времени микросекунд (1 сценарий = 1000000 микросекунд), поэтому они не совпадают.

Если поставщик услуг просит вас отправить время в метке времени Unix с микросекундами, то вам нужно использовать:

$time = microtime(true);

Также вы можете сделать его случайным, используя rand(), например:

// Increase the time in random value between 10 and 100 in microtime
$time = microtime(true) + rand(10, 100);

Если они просят вас сделать это за микросекунды, используйте rand() вот так:

$time = rand(1000,10000000);
...