我正在使用api cURL开发基于API请求的小软件。
我遇到了API的私有请求问题。请求的参数之一是“ nonce”(unix时间戳),但响应是“ invalid nonce”。
联系援助人员,他们回答我:
“ 当您发送的随机数小于或等于先前发送的随机数时,将发送无效的随机数。”
然后
“ 如果同时发出2个请求,则需要增加第二个请求的随机数(可以使用micro uniquestamp,这样一秒钟内您可以在1秒钟内创建1000000个唯一随机数)。
我的问题是:我可以使用什么功能来解决此问题!?我尝试了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);
}
答案 0 :(得分:0)
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);
答案 1 :(得分:0)
似乎API需要微秒,这是获取微秒的函数:
d
答案 2 :(得分:0)
我最好的猜测是它们的意思:
$stamp=(string)(int)(microtime(true)*1000000);
此图章每秒将改变一百万次,具体取决于您生成它的时间
string(16) "1555177383042022"
..请注意,此代码将无法在32位系统上正常运行,如果您的代码需要32位php兼容性,则请执行以下操作:
$stamp2=bcmul(number_format(microtime(true),18,".",""),"1000000",0);