Jump to content
Fivewin Brasil

Consumir API sem usar cURL, como fazer ?


sunset

Recommended Posts

Bom dia 

Já tentei de tudo (rs), bem pelo menos com meus limitados conhecimentos, gostaria de consumir a api da Stone para uma integração do conciliador de cartão, então montei todo o esquema, no POSTMAN tudo ok, usando o cURL tudo ok tambem, mas quanto tento usar os metos contidos em 'MSXML2.ServerXMLHTTP' , sempre me retornar o erro 401, que seria falta ou parâmetros errados, na verdade não sei nem se chega a conectar porque o 401 não tem como debugar melhor, mas seria basicamente assim meu envio.

Aqui funciona 100% com cURL 

curl.exe --location --request PUT "https://conciliation.stone.com.br/v1/merchant/394972625/access-authorization?affiliationCode=f3129ad18f994abbb014e53dffb1b0c3" --header "X-Authorization-Raw-Data: 07956658000110" --header "X-Authorization-Encrypted-Data: 43d2be2913d2ce3e3042e8c6115e41bfe4a2bd90ef71ea3660eaa2201bead1c28b17243c958b47d90e5d2ec3dcd38c7066a710e9f18238cb8b7809c8817fcfe1" --header "Authorization: Bearer 5f260209-7169-4477-ac3c-f802d558a24b" -o resposta.xml -s

Mas aqui não funciona.

Function Comunica_api_stone_put(vstonecd,vafiliat,vcliappl,vsecretk,vauthraw,vauthenc)
            cUrl:= 'https://conciliation.stone.com.br/v1/merchant/'+vstonecd+'/access-authorization'
            oHttp:= CreateObject( 'MSXML2.ServerXMLHTTP' )    
            oHttp:Open( "PUT" , cUrl, .f. )
            oHttp:setRequestHeader("X-Authorization-Raw-Data",vauthraw)
            oHttp:setRequestHeader("X-Authorization-Encrypted-Data",vsecretk)
            oHttp:setRequestHeader("Authorization","Bearer "+vcliappl)
            oHttp:setRequestHeader("Content-Type","application/json")
            oHttp:send()
            MSGINFO(ALLTRIM(oHttp:ResponseText),"OK 1")
            MSGALERT(oHttp:status,"OK 2")
            IF oHttp:status = 504 
                MsgAlert("Atenção Erro 504 Ocorreu um timeout e não foi possível concluir o trabalho, tente novamente","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 503
                MsgAlert("Atenção Erro 503 Um dos sistemas da Stone falhou, por favor nos informe","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 500
                MsgAlert("Atenção Erro 500 Ocorreu um erro interno na API, por favor nos informe","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 404
                MsgAlert("Atenção Erro 404 Erro no formato da URL ou no método enviado","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 401
                MsgAlert("Atenção Erro 401 Erro no envio Não autorizado para API","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 400
                MsgAlert("Atenção Erro 400 Erro nos dados informados para a API","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 202
                MsgAlert("Atenção 202 empresa, identificada pelo {application-key}, ainda não tem acesso aos dados de conciliação do lojista identificado pelo {stone-code} informado na URL. O e-mail de solicitação foi enviado para o lojista, para que ele conceda o acesso ou não.","Atenção") 
                RETURN .T.
            ELSEIF oHttp:status = 200
                MsgAlert("Atenção 200 A empresa, identificada pelo {application-key}, já está autorizada a acessar os dados de conciliação do lojista identificado pelo {stone-code} informado na URL.","Atenção") 
                RETURN .T.
            ENDIF                     
            RETURN .T.             
 

Alguma Dica, ou vou ter que morrer usando o BAT mesmo com o cURL ?

Link to comment
Share on other sites

23 minutos atrás, macs disse:

CreateObject( 'MSXML2.ServerXMLHTTP.6.0' ) ou CreateObject( 'MSXML2.ServerXMLHTTP.5.0' )

Já tentei com as 2 variantes também não funcionou, então deixa a padrão.

Quanto ao PUT seria um envio de TOKEN para registrar tem ele a mesma variação com GET para consultar se o token esta gerado, mas ambos retorna 401.

https://conciliacao.stone.com.br/reference#concessao-de-acesso 

 

 

Link to comment
Share on other sites

3 horas atrás, macs disse:

Você chegou a registrar as Dll's

\windows\syswow64\regsvr32.exe msxml5.dll ou \windows\system32\regsvr32.exe msxml5.dll

Nunca tentei, nem sabia que deveria , mas apresenta a mensagem , executei dentro da pasta syswow64 e na system em ambas da a mesma mensagem.

image.png.57409aceecae617833d346fbd8af4906.png

Link to comment
Share on other sites

 

Em 29/06/2021 at 09:55, sunset disse:

oHttp:Open( "PUT" , cUrl, .f. )

O certo seria:

oHttp:Open("POST",cUrl,.F.)

 

Tente desta maneira:

  oHttp:setRequestHeader("Authorization","Bearer "+vcliappl)
  oHttp:setRequestHeader("Content-Type","application/json")
  oHttp:Send("X-Authorization-Raw-Data=07956658000110&X-Authorization-Encrypted-Data=43d2be2913d2ce3e3042e8c6115e41bfe4a2bd90ef71ea3660eaa2201bead1c28b17243c958b47d90e5d2ec3dcd38c7066a710e9f18238cb8b7809c8817fcfe1")

 

Link to comment
Share on other sites

O comando e com PUT mas tenho outros para teste, com POST e GET, mas ambos também não funcionam, ja usando o cURL em maquinas que não estão com windows 10 toda atulizada tambem apresenta erros de autenticação, que provavelmente e o erro do CreateObject, na STONE ele faz uma autenticação com TLS 1.2 segundo a documentação e acredito que com  esse instanciamento não e possível.

no cURL acrescentei um parâmetro -k e deu certo, em outras maquinas.

 

Grato a todos pelas dicas, mas vamos ficar no bat com cURL mesmo.

Outra dica importante o hb_unzipfile não descompacta GZIP tiver que colocar o 7z.exe e dll na pasta para poder descompactar. 

Link to comment
Share on other sites

  • 2 weeks later...

Érick,

Se você colocar o link a gente promete colaborar baixando sem problemas a sua classe. Pode ser que a galera não use, pois tem muita dica boa aqui no fórum e em outros locais gratuitos, mas fica em paz a gente te ajuda sim, alias sempre ajudamos sem cobrar nada.

Link to comment
Share on other sites

Sugiro você aprender a usar o pacote cURL, sem necessidade de utilitários externos. O exemplo e a forma habitual que poucos sabem usar, é burocrático e confuso.
API/REST é amplamente utilizado e fiz algumas integrações com este pacote. Construí uma classe que facilita o desenvolvimento e a integração. Um pequeno exemplo em DevClub

Em certo momento, eu gostaria de tornar a minha classe open source, se os usuários [x]Harbour colaborarem financeiramente. Técnicas e recursos muito úteis aos sistemas.

[],
idlagam.com
facebook.com/DevClubForDevelopers

 

Em 29/06/2021 at 09:55, sunset disse:

Bom dia 

Já tentei de tudo (rs), bem pelo menos com meus limitados conhecimentos, gostaria de consumir a api da Stone para uma integração do conciliador de cartão, então montei todo o esquema, no POSTMAN tudo ok, usando o cURL tudo ok tambem, mas quanto tento usar os metos contidos em 'MSXML2.ServerXMLHTTP' , sempre me retornar o erro 401, que seria falta ou parâmetros errados, na verdade não sei nem se chega a conectar porque o 401 não tem como debugar melhor, mas seria basicamente assim meu envio.

Aqui funciona 100% com cURL 

curl.exe --location --request PUT "https://conciliation.stone.com.br/v1/merchant/394972625/access-authorization?affiliationCode=f3129ad18f994abbb014e53dffb1b0c3" --header "X-Authorization-Raw-Data: 07956658000110" --header "X-Authorization-Encrypted-Data: 43d2be2913d2ce3e3042e8c6115e41bfe4a2bd90ef71ea3660eaa2201bead1c28b17243c958b47d90e5d2ec3dcd38c7066a710e9f18238cb8b7809c8817fcfe1" --header "Authorization: Bearer 5f260209-7169-4477-ac3c-f802d558a24b" -o resposta.xml -s

Mas aqui não funciona.

Function Comunica_api_stone_put(vstonecd,vafiliat,vcliappl,vsecretk,vauthraw,vauthenc)
            cUrl:= 'https://conciliation.stone.com.br/v1/merchant/'+vstonecd+'/access-authorization'
            oHttp:= CreateObject( 'MSXML2.ServerXMLHTTP' )    
            oHttp:Open( "PUT" , cUrl, .f. )
            oHttp:setRequestHeader("X-Authorization-Raw-Data",vauthraw)
            oHttp:setRequestHeader("X-Authorization-Encrypted-Data",vsecretk)
            oHttp:setRequestHeader("Authorization","Bearer "+vcliappl)
            oHttp:setRequestHeader("Content-Type","application/json")
            oHttp:send()
            MSGINFO(ALLTRIM(oHttp:ResponseText),"OK 1")
            MSGALERT(oHttp:status,"OK 2")
            IF oHttp:status = 504 
                MsgAlert("Atenção Erro 504 Ocorreu um timeout e não foi possível concluir o trabalho, tente novamente","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 503
                MsgAlert("Atenção Erro 503 Um dos sistemas da Stone falhou, por favor nos informe","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 500
                MsgAlert("Atenção Erro 500 Ocorreu um erro interno na API, por favor nos informe","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 404
                MsgAlert("Atenção Erro 404 Erro no formato da URL ou no método enviado","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 401
                MsgAlert("Atenção Erro 401 Erro no envio Não autorizado para API","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 400
                MsgAlert("Atenção Erro 400 Erro nos dados informados para a API","Atenção") 
                RETURN .F.
            ELSEIF oHttp:status = 202
                MsgAlert("Atenção 202 empresa, identificada pelo {application-key}, ainda não tem acesso aos dados de conciliação do lojista identificado pelo {stone-code} informado na URL. O e-mail de solicitação foi enviado para o lojista, para que ele conceda o acesso ou não.","Atenção") 
                RETURN .T.
            ELSEIF oHttp:status = 200
                MsgAlert("Atenção 200 A empresa, identificada pelo {application-key}, já está autorizada a acessar os dados de conciliação do lojista identificado pelo {stone-code} informado na URL.","Atenção") 
                RETURN .T.
            ENDIF                     
            RETURN .T.             
 

Alguma Dica, ou vou ter que morrer usando o BAT mesmo com o cURL ?

Link to comment
Share on other sites

Segue o fonte que uso sem problemas já a um bom tempo. Hoje é usada diariamente pra subir arquivos para o S3 da AWS milhares de vezes ao dia e sem problemas.

 

// ****************** COLOCAR A CALLENDPOINT no FUNGENA.PRG
 
// cMode   = POST/PUT/DELETE/GET
// cJSon   = JSon de chamada da API
// aHeader = {{"Content-Type","application/json" }}  (ESTE É O DEFAULT CASO NAO INFORMADO)
Function CallEndPoint(cMode,cLink,cJSon,aHeader,nStatus_code)
Local cResp := ""
Local nI
Static oHTTP
 
nStatus_code := 0
 
If aHeader == NIL
        aHeader := {{"Content-Type","application/json" }}
EndIf
 
// oHTTP := CreateObject( "MSXML2.XMLHTTP" )
If oHTTP == nil
    oHTTP := CreateObject"MSXML2.ServerXMLHTTP.6.0" )
    oHTTP:SetTimeouts(600000600000600000600000)
EndIf
 
oHTTP:OpencModecLink.F. )
 
For nI := 1 to Len(aHeader)
        oHTTP:SetRequestHeaderaHeader[nI,1],aHeader[nI,2] )
Next
Try
    oHTTP:Send(cJson)
    while oHTTP:readyState # 4
        oHTTP:waitForResponse(1000)
    enddo
    nStatus_code := oHTTP:status
 
    cResp := oHTTP:responseText
Catch
End
oHTTP:Abort()
// Release oHttp
// oHTTP := NIL
 
HB_GCALL(.t.)
 
Return cResp
Link to comment
Share on other sites

Bom Dia.

Eu consigo consumir a API em outros projetos também sem problemas, meu único problema e de fato com a STONE, mas acredito que seja por este motivo anexo na imagem image.png.7ccc217a34edcdb78423e6a8d616d6a9.png

usando o cURL.EXE tive que adicionar o parâmetro -k que é um modo inseguro para ele conseguir autenticar também, acredito que a ativação no objeto não se seja de forma nativa, então e bola frente ja que esta funcionando, ou problema também seria no formato devolvido esta compactado com gZIP e não temos como descompactar via FW, então usei mais uma vez algo externo, mas para o usuário esta tudo escondido, somente aquele sentimento de gambiarras para resolver coisas simples. 

Link to comment
Share on other sites

43 minutos atrás, sunset disse:

Bom Dia.

Eu consigo consumir a API em outros projetos também sem problemas, meu único problema e de fato com a STONE, mas acredito que seja por este motivo anexo na imagem image.png.7ccc217a34edcdb78423e6a8d616d6a9.png

usando o cURL.EXE tive que adicionar o parâmetro -k que é um modo inseguro para ele conseguir autenticar também, acredito que a ativação no objeto não se seja de forma nativa, então e bola frente ja que esta funcionando, ou problema também seria no formato devolvido esta compactado com gZIP e não temos como descompactar via FW, então usei mais uma vez algo externo, mas para o usuário esta tudo escondido, somente aquele sentimento de gambiarras para resolver coisas simples. 

após o oHTTP := CreateObject"MSXML2.ServerXMLHTTP.6.0" )

coloque:

oHttp:setOption(2) := 13056

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...