1
votes

micro uniquestamp, qu'est-ce que c'est?

Je développe un petit logiciel basé sur les requêtes API avec php cURL.

J'ai rencontré un problème avec les requêtes privées d'API. L'un des paramètres de la requête est "nonce" (horodatage unix), mais la réponse est "nonce invalide".

En contactant l'assistance, ils me répondent que:

" Nonce non valide est envoyé lorsque le nonce que vous avez envoyé est inférieur ou égal au nonce qui a été envoyé précédemment. "

Et,

" si vous faites 2 requêtes à la même seconde, vous devez augmenter le nonce pour la 2ème requête (vous pouvez utiliser micro uniquestamp afin qu'en une seconde vous puissiez créer 1000000 nonces uniques en 1 seconde). "

Ma question est : Quelle fonction puis-je utiliser pour résoudre ce problème !? J'ai essayé la fonction microtime (), mais j'obtiens la même erreur.

Merci et désolé pour mon mauvais anglais.

Mon code:

$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);

}


9 commentaires

peut-être que le format microtime de PHP sec msec n'est pas reconnu par cette API, vérifiez ici php.net/ microtime


@PeterM En fait, j'obtiens la même erreur. Mais je ne sais pas comment résoudre le problème. Dois-je quand même demander de l'aide?


$ message = $ unix_time. $ customer_id. $ API_KEY; doit être $ message = $ microtime. $ customer_id. $ API_KEY; as $ microtime est le nonce que vous envoyez et utilisez dans le message. Supprimez $ unix_time = time (); cela vous déroute.


@LawrenceCherone merci mais c'est la même chose


@ClaudioFiamingo Avez-vous résolu votre problème?


@ user2203703 non .. ils m'ont répondu: "Veuillez noter que le dernier" nonce invalide "que nous avons reçu était parce que nonce était identique à un nonce précédent: clé (clé), signature (signature), autorisation (solde), adresse IP (adresse_ip ), Nonce ( 1555243382886328 ), Nonce stocké ( 1555243382886328 ) "


@ user2203703 je ne sais pas comment résoudre :(


@ user2203703 ok ... merci beaucoup


@ user2203703 Cette page a été supprimée .... pouvez-vous réécrire l'adresse e-mail pls?!


3 Réponses :


0
votes

microtime () est l'horodatage Unix actuel en microsecondes et il est différent du temps normal en microsecondes (1 sceond = 1000000 microsecondes), donc ce n'est pas la même chose.

Si le fournisseur de services demande vous devez envoyer l'heure dans un horodatage Unix en microsecondes, puis vous devez utiliser:

$time = rand(1000,10000000);

Vous pouvez également la rendre aléatoire en utilisant rand () pour être comme ça:

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

S'ils vous demandent de le faire en quelques microsecondes, utilisez rand () comme ça:

$time = microtime(true);


10 commentaires

Ils me demandent "horodatage unix". J'ai essayé: time (), microtime (true) et rand (1000,10000000) mais l'erreur est la même.


time () je travaille juste avec des fonctions publiques ... je ne comprends pas ce que ça veut dire avec "micro uniquestamp"


pour la deuxième requête, essayez d'utiliser: microtime (true) + rand (10, 100)


Vous devez leur demander de vous expliquer davantage et vous donner quelques exemples.


@ user2203703 rand ne fonctionnera pas correctement? Puisqu'il doit maintenir des valeurs incrémentielles.


@DivyaMamgai à droite ... je pense que le problème est peut-être qu'avec rand et microtime (true) la valeur est un float (1555147863.1191) ... peut-être que cela devrait être un entier? Sans chiffres décimaux?


@ClaudioFiamingo Oui, vous devriez vérifier la spécification de l'API ou faire un appel OPTIONS dessus pour obtenir les détails (s'ils le supportent). La suppression de la décimale peut fonctionner.


@ClaudioFiamingo Utilisez number_format (microtime (true), 5, '', '') , augmentez la valeur 5 selon vos besoins d'utilisation simultanée.


@ClaudioFiamingo votre code ne fonctionnera pas comme prévu, je viens de lire le guide, certains manquent dans votre code, je ne pense pas que vous obtiendrez l'aide que vous cherchez ici, vous devez embaucher un pigiste.


@ClaudioFiamingo contacter leurs développeurs, ils pourront peut-être vous aider.



0
votes

Il semble que l'API nécessite des microsecondes, voici une fonction pour obtenir des microsecondes:

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


echo microseconds();
echo "\n";


0 commentaires

0
votes

Ma meilleure estimation est qu'ils signifient:

$stamp2=bcmul(number_format(microtime(true),18,".",""),"1000000",0);

ce tampon changera 1 million de fois par seconde, selon le moment où vous le générez, il ressemble à quelque chose comme

string(16) "1555177383042022"

.. notez simplement que ce code ne fonctionnera pas correctement sur un système 32 bits, si votre code nécessite une compatibilité php 32 bits, faites-le à la place:

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


0 commentaires