Italian Da PHP a B4J

claudiob4

Member
Licensed User
Longtime 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:

claudiob4

Member
Licensed User
Longtime User
io sono regolarmente iscritto, non credo che sia questo il problema. Penso che la traduzione abbia qualcosa di sbagliato, ma non capisco cosa.
 

udg

Expert
Licensed User
Longtime User
B4X:
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?
 

udg

Expert
Licensed User
Longtime User
Ho provato con il codice seguente:
B4X:
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 String) As 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... :)
 

claudiob4

Member
Licensed User
Longtime 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:

udg

Expert
Licensed User
Longtime 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?
 

sirjo66

Well-Known Member
Licensed User
Longtime 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:

B4X:
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
 

claudiob4

Member
Licensed User
Longtime 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
 

udg

Expert
Licensed User
Longtime User
Ho provato la tua versione ma non da risultato.
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"}]}
 

claudiob4

Member
Licensed User
Longtime 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);
?>
 

claudiob4

Member
Licensed User
Longtime User
non da risultato intendo non riceve i dati ma ritorna l'errore {"errors":[{"message":"Not Authorized","code":"01"}]}
 

claudiob4

Member
Licensed User
Longtime User
Mi potresti passare il file in PHP e come si fa per lanciarlo così provo con i codici corretti?
Grazie
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ecco qui il file, devi rinominarlo in .php
 

Attachments

  • test.txt
    655 bytes · Views: 291

sirjo66

Well-Known Member
Licensed User
Longtime 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.
 

claudiob4

Member
Licensed User
Longtime 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?
 

claudiob4

Member
Licensed User
Longtime 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

B4X:
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 String) As 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:
Top