BTCTrader / broker-api-docs

The documentation for BTCTrader's white label exchange platform API. Use this documentation to access the APIs of BTCTurk other BTCTrader partners.
110 stars 32 forks source link

X-Signature Invalid Public Key code:401 #151

Closed EmreKara5aya closed 4 years ago

EmreKara5aya commented 4 years ago

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 ;

           $message = $this->apiKey.time();
            $signatureBytes = hash_hmac('sha256', $message, base64_decode($this->apiSecret), true);
            $signature = base64_encode($signatureBytes);
            $nonce = time();
            $headers = array(
                'X-PCK: '.$this->apiKey,
                'X-Stamp: '.$nonce,
                'X-Signature: '.$signature,
            );
onurgozupek commented 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?

EmreKara5aya commented 4 years ago

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.

Screenshot_2019-10-09 https www emrekarakaya com tr

Acaba hata yaptığım bir yer mi var?

onurgozupek commented 4 years ago

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'
);
EmreKara5aya commented 4 years ago

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.

onurgozupek commented 4 years ago

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>';
EmreKara5aya commented 4 years ago

@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
)
onurgozupek commented 4 years ago

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

EmreKara5aya commented 4 years ago

@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
onurgozupek commented 4 years ago

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?

EmreKara5aya commented 4 years ago

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>';
EmreKara5aya commented 4 years ago

Ayrıca @onurgozupek sizin kullandığınız private key başarılı bir şekilde base64_decode edilebiliyor mu?

EmreKara5aya commented 4 years ago

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 )

onurgozupek commented 4 years ago

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.

onurgozupek commented 4 years ago

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
)
onurgozupek commented 4 years ago

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.)

EmreKara5aya commented 4 years ago

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?

onurgozupek commented 4 years ago

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.

EmreKara5aya commented 4 years ago

@onurgozupek yardımlarınız için teşekkürler.