Closed EmreKara5aya closed 4 years ago
Merhaba,
Aldığınız bu hata, yanlış API Açık Anahtarı ile doğrulama yapmaya çalışmanızdan kaynaklanıyor.
Kodunuzda $this->apiKey değişkeninde BtcTurk | PRO'dan aldığınız API Public Key, $this->apiSecret değişkeninde ise API Secret Key olmalı.
Ayrıca, eğer sunucunuz zamanı milisaniye olarak vermiyorsa, time() değerini time()*1000 ile milisaniyeye çevirmelisiniz.
Bu şekilde doğrulama yaparak tekrar deneyebilir misiniz?
Merhaba @onurgozupek
Öncelikle cevabınız için teşekkürler. Dediğiniz gibi $this->apiKey de public key $this->apiSecret de secret key ekli. Ancak BtcTurkun bana verdiği secret key herhangi bir şekilde base64_decode edilemiyor ve resimdeki gibi oluyor.
Acaba hata yaptığım bir yer mi var?
Secret Key olarak kullandığınız değeri, kopyalayıp önce bir metin belgesine ya da komut (cmd) satırına yapıştırdıktan sonra yeniden kopyalamayı deneyebilir misiniz? Secret Key, PHP dosyanızın içerisine düz metin olarak gelmiyor olabilir.
Bir de PHP dosyanızı farklı bir adla kaydederek kodlamanın UTF-8 olduğundan emin olabilir misiniz? Türkçe karakter kodlaması ile (Windows-1254, ISO-8859 vb) kaydettiyseniz, karakter hatası almanız muhtemel.
Bir de, çıktıyı JSON olarak aldığınızdan da emin olun lütfen. Örnek olarak, PHP doğrulama kodunuz aşağıdaki gibi olabilir:
$message = $this->apiKey.(time()*1000);
$signatureBytes = hash_hmac('sha256', $message, base64_decode($this->apiSecret), true);
$signature = base64_encode($signatureBytes);
$nonce = time()*1000;
$headers = array(
'X-PCK: '.$this->apiKey,
'X-Stamp: '.$nonce,
'X-Signature: '.$signature,
'Cache-Control: no-cache',
'Content-Type: application/json'
);
Merhaba @onurgozupek
Dosya utf8 olarak kayıtlı. Emin olmak için adını değiştirip tekrardan kontrol ettim ama sonuç halen aynı. Private key halen tam olarak daha base64_decode yapılamıyor.
Define alanlarına, yeni alacağınız kendi API anahtarınız ve API Secret Key'i koyup sorguyu çalıştırır mısınız?
define('API_KEY',"api_anahtari");
define('API_SECRET', "api_secret");
$message = API_KEY.time()*1000;
$signatureBytes = hash_hmac('sha256', $message, base64_decode(API_SECRET), true);
$signature = base64_encode($signatureBytes);
$nonce = time()*1000;
$headers = array(
'X-PCK: '.API_KEY,
'X-Stamp: '.$nonce,
'X-Signature: '.$signature,
'Cache-Control: no-cache',
'Content-Type: application/json'
);
$post_data = '{}';
$url="https://api.btcturk.com/api/v1/users/balances";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURL_HTTP_VERSION_1_2');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (curl_errno($ch)) {
print_r(curl_error($ch));
}
$answer = json_decode($result);
echo 'Sonuç:<pre>';
print_r($answer);
echo '</pre>';
@onurgozupek Verdiğin kodu denedim ama timestampların arasındaki fark yüzünden kodu çalıştıramadım. Timestamp :
Benim kodda : 1570628481000 BTCTURK de : 1570628420793
Aldığım hata da ;
Sonuç:
stdClass Object
(
[success] => 1
[message] => Unauthorized - Invalid Nonce
[code] => 1037
)
Timestamp arasındaki fark 1 saniye. O fark hatalı nonce sonucu dönecek kadar büyük değil. Ama zaman sorununu çözmek için PHP kodunun başına şunu ekleyip deneyebilir misiniz?
date_default_timezone_set('Europe/Istanbul');
@onurgozupek kullandığım hosting ile btcturk arasındaki timestamp farkını 60'a kadar indirdim ama bu seferde ;
stdClass Object ( [success] => 1 [message] => Unauthorized - Invalid Public key [code] => 1037 )
hatasını alıyorum. Timestamp değerleri ;
Bende : 1570634995592
BtcTurk : 1570634995573
Kullandığınız kodu, api anahtarlarına ait bilgiler olmadan paylaşabilmeniz mümkün mü? Ama API anahtarı ve API Secret'ı belirlediğiniz değişkenlerin isimlerini de yazın lütfen.
define('API_KEY',"api_anahtari");
define('API_SECRET', "api_secret");
veya
$apikey = "api_anahtarı";
$apisecret = "api_secret";
gibi...
Yukarıda gönderdiğim kodu, kendi bilgisayarımda, Türkiye'de ve yurt dışındaki 3 farklı sunucuda denedim.
Bir de API Anahtarını hangi siteden almıştınız? BtcTurk mü pro.btcturk.com mu?
Merhaba
Sizin örnek olarak eklediğiniz kodu kullandığım zaman ;
[success] => 1 [message] => Unauthorized - Invalid Nonce [code] => 1037
hatasını alıyorum. Aşağıda eklediğim kodu kullandığım zaman ;
[success] => 1 [message] => Unauthorized - Invalid Public key [code] => 1037
hatasını alıyorum. Kullandığım kodlar ;
date_default_timezone_set('Europe/Istanbul');
define('API_KEY',"api_anahtari");
define('API_SECRET', "api_secret");
function get_millis(){
list($usec, $sec) = explode(' ', microtime());
return (int) ((int) $sec * 1000 + ((float) $usec * 1000));
}
$nonce = get_millis();
$nonce = $nonce - 60700;
$message = API_KEY.$nonce;
$signatureBytes = hash_hmac('sha256', $message, base64_decode(API_SECRET), true);
$signature = base64_encode($signatureBytes);
$headers = array(
'X-PCK: '.API_KEY,
'X-Stamp: '.$nonce,
'X-Signature: '.$signature,
'Cache-Control: no-cache',
'Content-Type: application/json'
);
$post_data = '{}';
$url="https://api.btcturk.com/api/v1/users/balances";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURL_HTTP_VERSION_1_2');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (curl_errno($ch)) {
print_r(curl_error($ch));
}
$answer = json_decode($result);
echo 'Sonuç:<pre>';
print_r($answer);
echo '</pre>';
Ayrıca @onurgozupek sizin kullandığınız private key başarılı bir şekilde base64_decode edilebiliyor mu?
Merhaba @onurgozupek
Sanal bir sunucu kurup oradan denedim sonuç halen aynı. Apileri BtcTurk Prodan alıyorum.
stdClass Object ( [success] => 1 [message] => Unauthorized - Invalid Public key [code] => 1037 )
Ayrıca @onurgozupek sizin kullandığınız private key başarılı bir şekilde base64_decode edilebiliyor mu?
Tüm kodları deneyip gönderiyorum. Size tam kod göndereceğim.
Bu tam php kodu. <?php ve ?> arasına ekleyip, kaydedip çalıştırabilirsiniz.
define('DEV_API_KEY', 'd6fad679-cac4-4408-bd13-f6e639617207');
define('DEV_API_SECRET', 'TR4ZtbVx2oBNC2KO44R2ETCpA8qZ3JCF');
$nonce = time()*1000;
$message = DEV_API_KEY.$nonce;
$signatureBytes = hash_hmac('sha256', $message, base64_decode(DEV_API_SECRET), true);
$signature = base64_encode($signatureBytes);
$headers = array(
'X-PCK: '.DEV_API_KEY,
'X-Stamp: '.$nonce,
'X-Signature: '.$signature,
'Cache-Control: no-cache',
'Content-Type: application/json'
);
// Bakiye sorgusu olduğu için POST boş.
$post_data = '{}';
// Test sunucusu API adresi:
$url="https://api-dev.btcturk.com/api/v1/users/balances";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURL_HTTP_VERSION_1_2');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// post verisi yok
// curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (curl_errno($ch)) {
print_r(curl_error($ch));
}
$answer = json_decode($result);
echo 'Sonuç:<pre>';
print_r($answer);
echo '</pre>';
Bu da sonuç çıktısı:
Sonuç:
stdClass Object
(
[data] => Array
(
[0] => stdClass Object
(
[asset] => TRY
[assetname] => Türk Lirası
[balance] => 67284.8966544043971838
[locked] => 103.54
[free] => 67181.3566544043971838
[precision] => 2
)
[1] => stdClass Object
(
[asset] => BTC
[assetname] => Bitcoin
[balance] => 5.6427329572945909
[locked] => 0.0202
[free] => 5.6225329572945909
[precision] => 8
)
[2] => stdClass Object
(
[asset] => ETH
[assetname] => Ethereum
[balance] => 0.1000000017003635
[locked] => 0
[free] => 0.1000000017003635
[precision] => 4
)
[3] => stdClass Object
(
[asset] => XRP
[assetname] => Ripple
[balance] => 0
[locked] => 0
[free] => 0
[precision] => 2
)
[4] => stdClass Object
(
[asset] => LTC
[assetname] => Litecoin
[balance] => 38.7285103230010289
[locked] => 31.46691463
[free] => 7.2615956930010289
[precision] => 4
)
[5] => stdClass Object
(
[asset] => USDT
[assetname] => Tether
[balance] => 375.826351464592
[locked] => 212.6299991938
[free] => 163.196352270792
[precision] => 2
)
[6] => stdClass Object
(
[asset] => XLM
[assetname] => Stellar
[balance] => 0
[locked] => 0
[free] => 0
[precision] => 2
)
[7] => stdClass Object
(
[asset] => NEO
[assetname] => Neo
[balance] => 1.7993
[locked] => 1.7992
[free] => 0.0001
[precision] => 4
)
)
[success] => 1
[message] =>
[code] => 0
)
Yukarıdaki kodu test ettim, çıktı çalışan kodun çıktısıdır. Bu kodu bire bir denediğinizde çalıştıramıyorsanız,
Kendi kodunuzda nonce değeri ile +/- oynamanıza gerek yok. Europe/Istanbul timezone'da time()*1000 yapmanız yeterli.
Api Key ve Api Secret Key'i pro.btcturk.com adresinden almalısınız (API anahtarı üretilirken Hesap Hareketleri, Varlıklarım ve Al Sat seçili olursa, tüm işlemler için kullanabilirsiniz.)
Merhaba
@onurgozupek kod şu anda çalıştı. Eski oluşturduğum apiler çalışmıyor ama yeni oluşturduğum apiler sıkıntısız bir şekilde çalışıyor. Yardımlarınız için teşekkürler. Ayrıca bir isteğim olacak. Sanırım eklediğiniz api keyler global olarak her yerde çalışıp hesap bilgilerimi gösteriyor. Kodları düzenlemeniz mümkünmüdür?
Verdiğim API anahtarı test sunucusundan alınmıştır ve sadece api-dev.btcturk.com/api adresindeki TEST API'ı için kullanıcı bakiyesini gösterme yetkisi vardır.
Kendi API anahtarlarınız ile, api.btcturk.com/api adresini ve yukarıda verdiğim kod örneğini kullanarak işlem yapabilirsiniz.
Daha detaylı kod örneği isterseniz github.com/onurgozupek/btcturkpro adresinde PHP Class'ı ve kullanım örneği mevcut.
@onurgozupek yardımlarınız için teşekkürler.
Merhaba
Api ile bağlanmaya çalıştığım zaman "code":401,"message":"Unauthorized - Invalid Public key" hatası alıyorum. Ayrıca verilen private key base64 decode yapılamıyor. Kullanıdığım kod ;