Italian Da PHP a B4J

Discussion in 'Italian Forum' started by claudiob4, Feb 7, 2018.

Tags:
  1. claudiob4

    claudiob4 Member Licensed User

    Devo utilizzare delle API ma qualcosa non funziona. Come tradurreste questo esempio PHP in B4J:

    <?
    $apiKey="a869b1547c56c5ce37ee9acfd92de8b8c8ca7df6";
    $apiSecret="732a65b7abed7991d7229188d7b97a8c54d3149f";

    $url="https://api.therocktrading.com/v1/balances";

    $nonce=microtime(true)*10000;
    $signature=hash_hmac("sha512",$nonce.$url,$apiSecret);

    $headers=array(
    "Content-Type: application/json",
    "X-TRT-KEY: ".$apiKey,
    "X-TRT-SIGN: ".$signature,
    "X-TRT-NONCE: ".$nonce
    );

    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $callResult=curl_exec($ch);
    curl_close($ch);

    $result=json_decode($callResult,true);

    print_r($result);
    ?>

    La mia versione:

    Dim job_GetInfo As HttpJob
    Dim API_Key, API_Secret, API_Signed As String
    Dim Post_URL, Post_Data As String
    Dim Byte_Conv As ByteConverter
    Dim Nonce As String

    Post_URL = "https://api.therocktrading.com/v1/balances"
    API_Key = "a869b1547c56c5ce37ee9acfd92de8b8c8ca7df6"
    API_Secret = "732a65b7abed7991d7229188d7b97a8c54d3149f"
    Nonce=DateTime.Now/1000
    Post_Data = "apikey=" & API_Key & "&nonce=" & Nonce

    Dim Sign() As Byte = HashHmac(Nonce & Post_URL , API_Secret)
    API_Signed = Byte_Conv.HexFromBytes(Sign) 'convert to HEX
    API_Signed = API_Signed.ToLowerCase

    job_GetInfo.Initialize("job_GetInfo", Me)
    job_GetInfo.Download(Post_URL)
    job_GetInfo.GetRequest().SetHeader("Content-Type","application/json")
    job_GetInfo.GetRequest().SetHeader("X-TRT-KEY",API_Key)
    job_GetInfo.GetRequest().SetHeader("X-TRT-SIGN",API_Signed)
    job_GetInfo.GetRequest().SetHeader("X-TRT-NONCE",Nonce)



    Response:
    ResponseError. Reason: Unauthorized, Response: {"errors":[{"message":"Not Authorized","code":"01"}]}

    Grazie
     
    Last edited: Feb 7, 2018
  2. LordZenzo

    LordZenzo Well-Known Member Licensed User

    forse il sito web verifica la sorgente da cui gli arriva il comando e blocca le sorgenti sconosciute?
     
  3. claudiob4

    claudiob4 Member Licensed User

    io sono regolarmente iscritto, non credo che sia questo il problema. Penso che la traduzione abbia qualcosa di sbagliato, ma non capisco cosa.
     
  4. udg

    udg Expert Licensed User

    Code:
    job_GetInfo.Download(Post_URL)
    esegue una GET e da quello che scrivi direi che sia necessaria una POST
    HAi anche una variabile Post_Data inutilizzata
    HashHmac è definita per ritornare SHA-512 dei parametri?
     
  5. udg

    udg Expert Licensed User

    Ho provato con il codice seguente:
    Code:
    Sub MyTest
       
    Dim API_Key, API_Secret, API_Signed As String
       
    Dim Post_URL As String
       
    Dim Nonce As String

       Post_URL = 
    "https://api.therocktrading.com/v1/balances"
       API_Key = 
    "a869b1547c56c5ce37ee9acfd92de8b8c8ca7df6"
       API_Secret = 
    "732a65b7abed7991d7229188d7b97a8c54d3149f"
      
       
    Dim l1 As Long = DateTime.Now/DateTime.TicksPerSecond
       Nonce=l1
      
       API_Signed = HashMac512(Nonce & Post_URL , API_Secret).ToLowerCase
          
       
    Dim job As HttpJob
       job.Initialize(
    "job", Me)
       job.Download(Post_URL)
       
    'job.PostString(Post_URL, "")
       job.GetRequest.SetHeader("ContentType","application/json")
       job.GetRequest.SetHeader(
    "X-TRT-KEY",API_Key)
       job.GetRequest.SetHeader(
    "X-TRT-SIGN",API_Signed)
       job.GetRequest.SetHeader(
    "X-TRT-NONCE",Nonce)
      
       
    Wait For (job) JobDone(j As HttpJob)
       
    If j.Success Then
           
    Log(j.GetString)
       
    Else
           
    Log(j.ErrorMessage)
       
    End If
       j.Release
    End Sub

    Sub HashMac512(message As String, API_Secret As StringAs String
       
    Log(message)
       
    Dim signature As String
       
    Dim m As Mac
       
    Dim k As KeyGenerator
       k.Initialize(
    "HMACSHA512")
       k.KeyFromBytes(API_Secret.GetBytes(
    "UTF8"))
       m.Initialise(
    "HMACSHA512", k.Key)
       m.Update(message.GetBytes(
    "UTF8"))
       
    Dim b() As Byte
       b = m.Sign
       
    Dim bc As ByteConverter
       
    signature=bc.HexFromBytes(b)
       
    Log(signature)
       
    Return signature
    End Sub
    ma il risultato è sempre "Non autorizzato" . Sei sicuro che le Api_key/API_secret siano corrette? A parte che pubblicare sul forum quelle reali non sarebbe una gran mossa comunque... :)
     
  6. claudiob4

    claudiob4 Member Licensed User

    Provato Post ma niente da fare.
    Le Api_Key e Api_Secret publicate sono quelle dell'esempio PHP. Nel programma che eseguo utilizzo quelle reali.
    Questa è la routine HashHmac che uso:

    Sub HashHmac(data As String, secret As String) As Byte()
    Dim m As Mac
    Dim kg As KeyGenerator
    kg.Initialize("HmacSHA512")
    kg.KeyFromBytes(secret.GetBytes("UTF8"))
    m.Initialise("HmacSHA512", kg.Key)
    m.Update(data.GetBytes("UTF8"))
    Return m.Sign
    End Sub
     
    Last edited: Feb 8, 2018
  7. udg

    udg Expert Licensed User

    Ok, vedo che è praticamente identica a quella che avevo scritto io.
    Quindi, alla fine, che utilizzi le key dell'esempio o quelle reali, ti ritorna sempre il "Non autorizzato", giusto?
    Hai modo di sentire da loro cosa effettivamente ricevono e quidi cosa risulti errato?
     
  8. sirjo66

    sirjo66 Well-Known Member Licensed User

    innanzitutto prima di tradurlo in B4J devi essere sicuro che il codice in PHP funzioni.
    Ho creato un file PHP, gli ho messo dentro quello che avevi riportato, l'ho mandato in esecuzione e mi ha risposto:

    Code:
    Array ( [errors] => Array ( [0] => Array ( [message] => Not Authorized [code] => 01 ) ) )
    E' ovvio quindi che se lo porti in B4J non funzioni, qui c'è qualcosa che non va
     
  9. claudiob4

    claudiob4 Member Licensed User

    Ho provato la tua versione ma non da risultato. Ho dato per scontato che api_key e api_secret si intendessero solo di esempio, di conseguenza il risultato sarebbe stato comunque negativo. I due riferimenti api sono riservati e non posso publicarli.
    Intanto grazie
     
  10. udg

    udg Expert Licensed User

    Ti riferisci al post #5? Quando dici che no dà risultato, intendi che non ti ritorna né GetString né ErrorMessage? In pratica si perde nel nulla?
    A me con le fake key ritorna:
    Waiting for debugger to connect...
    Program started.
    1518077507
    1518077507https://api.therocktrading.com/v1/balances
    8038965F082FD1642169D83D9C47927F2D8F43C709C34F693E6AB9A43DC4928E8285D79AAD06EE55A5808316591D16CFC712C2FB24BD43AFA1D8C6228E6809C3
    ResponseError. Reason: Unauthorized, Response: {"errors":[{"message":"Not Authorized","code":"01"}]}
    {"errors":[{"message":"Not Authorized","code":"01"}]}
     
  11. claudiob4

    claudiob4 Member Licensed User

    Ho contattato il support di TRT per sapere se ci sono ulteriori permessi da richiedere. Per ora sono in attesa.
    Prima di questo parte ho fatto la richiesta pubblica del comando Market funds, che non prevede la signature e tutto ha funzionato. Il server risponde e l'esempio PHP è congruo.

    https://api-staging.therocktrading.com/doc/v1/index.html#api-Market_API-Funds

    Get all funds at once.

    https://api.therocktrading.com/v1/funds

    <?
    $url="https://api.therocktrading.com/v1/funds";

    $headers=array(
    "Content-Type: application/json"
    );

    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $callResult=curl_exec($ch);
    curl_close($ch);

    $result=json_decode($callResult,true);

    print_r($result);
    ?>
     
  12. claudiob4

    claudiob4 Member Licensed User

    non da risultato intendo non riceve i dati ma ritorna l'errore {"errors":[{"message":"Not Authorized","code":"01"}]}
     
  13. claudiob4

    claudiob4 Member Licensed User

    Mi potresti passare il file in PHP e come si fa per lanciarlo così provo con i codici corretti?
    Grazie
     
  14. sirjo66

    sirjo66 Well-Known Member Licensed User

    ecco qui il file, devi rinominarlo in .php
     

    Attached Files:

    • test.txt
      File size:
      655 bytes
      Views:
      71
  15. claudiob4

    claudiob4 Member Licensed User

    Grazie ora lo provo.
     
  16. claudiob4

    claudiob4 Member Licensed User

    Ho i codici api per una account demo, potete provare se comunicate correttamente? Io continuo ad avere lo stesso errore.

    Post_URL=https://staging.therocktrading.com

    API_Key="65b15898cdba04dd73145d507613faa565bd310d"
    API_Secret="976e428578839eabe72cae95cf83787b8f543882"

    Grazie
     
    Last edited: Feb 9, 2018
  17. sirjo66

    sirjo66 Well-Known Member Licensed User

    Sembra funzionare :)
    Inserendo i codici che hai scritto, non mi appare più il messaggio di errore Not Authorized, per cui sembra ok, però non dà nessuna risposta, ma secondo me già questo è una buona cosa.
     
  18. claudiob4

    claudiob4 Member Licensed User

    Ottimo, io stavo cercando di settare il pc per lanciare il file .php, ma è complicato e visto che mi sono arrivati i codici api_key ed api_secret corretti lascio stare.

    Comunque ripetendo la prova in BAj con i nuovi codici io ottengo il solito errore,
    il codice API_Signed generato ponendo nonce=1 e Post_URL = "https://api.therocktrading.com/v1/balances" è
    API_Signed=0fdf702b484515b82acd3665b3ae7b65f3c067ec4061bbd8a367293f455d671c80af26fb210b8b07d0b71ee37e25d9a87f5220238b55ab04196874e19c81e7f0

    ti risulta uguale sul PHP?
     
  19. sirjo66

    sirjo66 Well-Known Member Licensed User

    non ho capito cosa devo fare
     
  20. claudiob4

    claudiob4 Member Licensed User

    cercavo di capire se l'api_signed prodotta da PHP fosse la stessa prodotta da B4J. Comunque non ha più importanza.
    Ho utilizzato le api reali ed improvvisamente tutto si è messo a funzionare. Probabilmente hanno dato un permesso che mancava. Con le api demo non funziona ancora e dà il solito errore di not autorized.
    Questa è la versione di codice che funziona.

    Grazie a tutti

    Code:
    Sub GetBalances
        
        
    Dim job_GetInfo As HttpJob
        
    Dim API_Key, API_Secret, API_Signed As String
        
    Dim Post_URL, Post_Data As String
        
    Dim Byte_Conv As ByteConverter
        
    Dim Nonce As String
        
        Post_URL = 
    "https://api.therocktrading.com/v1/balances"

        
    ' API DEMO
        API_Key="65b15898cdba04dd73145d507613faa565bd310d"
        API_Secret=
    "976e428578839eabe72cae95cf83787b8f543882"

        
    Dim l1 As Long = DateTime.Now/DateTime.TicksPerSecond
        Nonce=l1
        
        API_Signed = HashMac512(Nonce & Post_URL , API_Secret)
        
    Log("API_Signed=" & API_Signed)
        
        job_GetInfo.Initialize(
    "job_GetInfo", Me)
        job_GetInfo.Download(Post_URL)
        job_GetInfo.GetRequest().SetHeader(
    "Content-Type","application/json")
        job_GetInfo.GetRequest().SetHeader(
    "X-TRT-KEY",API_Key)
        job_GetInfo.GetRequest().SetHeader(
    "X-TRT-SIGN",API_Signed)
        job_GetInfo.GetRequest().SetHeader(
    "X-TRT-NONCE",Nonce)
        
        
    Wait For (job_GetInfo) JobDone(j As HttpJob)
        
    If j.Success Then
            Res = j.GetString
            
    Log(j.GetString)
        
    Else
            
    Log(j.ErrorMessage)
        
    End If
        j.Release

    End Sub

    Sub HashMac512(message As String, API_Secret As StringAs String
        
    Log(message)
        
    Dim signature As String
        
    Dim m As Mac
        
    Dim k As KeyGenerator
        k.Initialize(
    "HMACSHA512")
        k.KeyFromBytes(API_Secret.GetBytes(
    "UTF8"))
        m.Initialise(
    "HMACSHA512", k.Key)
        m.Update(message.GetBytes(
    "UTF8"))
        
    Dim b() As Byte
        b = m.Sign
        
    Dim bc As ByteConverter
        
    signature=bc.HexFromBytes(b)
        
    Log(signature)
        
    Return signature.ToLowerCase
    End Sub
     
    Last edited: Feb 10, 2018
    sirjo66 likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice