Fernando não sei se este modelo pode lhe ajudar, mas segue para ter uma ideia.
#INCLUDE 'JSON.CH'
#INCLUDE 'TOTVS.CH'
#INCLUDE 'AARRAY.CH'
#INCLUDE 'RWMAKE.CH'
#INCLUDE 'AP5MAIL.CH'
#INCLUDE 'RESTFUL.CH'
#INCLUDE 'TOPCONN.CH'
#INCLUDE 'TBICONN.CH'
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'PARMTYPE.CH'
User Function EnvHttp()
/// MERCHANTID informado pela empresa prestadora de servicos de pagamento online. Utilizado para obter o token de comunicacao entre as APIs da empresa.
Local cIddLog := SuperGetMV( "PS_IDDLOG", .F., 'UEYQIUEYQWIUEYQWIUEYQWUIEYQW' )
/// MERCHANTKEY informado pela empresa prestadora de servicos de pagamento online. Utilizado para obter o token de comunicacao entre as apis da empresa.
Local cIddPsw := SuperGetMV( "PS_IDDPSW", .F., '$R$R$FRFEXSXSXSZAWDEFRGTHGVRE$#%4534332' )
/// URL principal para comunicacao com APIs da empresa prestadora de servicos
Local cUrlPri := SuperGetMV( "PS_URLPRI", .F., 'https://apisandbox.empresaqualquer.com.br' )
/// URL de acesso a API para geracao do TOKEN que sera usado para validar demais comunicacoes com APIs.
Local cUrlTko := SuperGetMV( "PS_URLTKO", .F., '/oauth/token' )
/// URL de acesso a API para geracao de titulo.
Local cUrlPed := SuperGetMV( "PS_URLPED", .F., '/sales/v1/order' )
Local aHeadOut := {}
Local aPostRet := {}
Local aPostDad := {} //// DADOS PARA MONTAGEM DO ARQUIVO JSON A SER ENVIADO
/*============== [TRANSFORMA PARA O PADRAO JSON - U_fEnvShp()] ==============*/
cJsnDad := ToJson( aPostDad )
/*============== [9. AUTENTICAÇÃO TOKENS DE ACESSO - sIDToken()] ==============*/
cKeyTko := sIDToken( cUrlPri, cUrlTko, cIddLog, cIddPsw )
/*---------------------*/
/*============== [10. GERAÇÃO DO PEDIDO DE COMPRA - U_fEnvShp()] ==============*/
aHeadOut := {}
aPostRet := {}
cHeaderRet := ""
cStatus := ""
cLogRes += "<br>" + "<br>" + CRLF + CRLF
cLogRes += "10.cKeyTko => " + cKeyTko + "<br>" + CRLF
aAdd( aHeadOut, 'Accept: */*' )
aAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')')
aAdd( aHeadOut, 'Content-Type: application/json')
aAdd( aHeadOut, 'Authorization: Bearer ' + AllTrim( cKeyTko ) )
aAdd( aHeadOut, 'Client-Id: ' + Encode64( cIddLog + ":" + cIddPsw ) )
/*============== [EXECUTA 5x EM CASO DE ERRO de comunicação] ==============*/
For nI := 1 To 5
sPostRet := HttpPost( ( cUrlPri + cUrlPed ), cMsgPst, cJsnDad, nTimeOut, aHeadOut, @cHeaderRet )
cStatus := SubStr( cHeaderRet, AT( ' ', cHeaderRet ) + 1, 3 )
If( ! Empty( sPostRet ) )
aPostRet := FromJson( sPostRet )
nI := 5
EndIf
Next nI
/// SE ESTIVER VÁLIDO EXIBE OS LINKS GERADOS
If( cStatus == '200' .AND. ValType( aPostRet ) == 'O' )
cLnkLoj := aPostRet:ADATA[13][2][1]:ADATA[2][2] /// LINK PARA LOJA
cLnkCli := aPostRet:ADATA[13][2][2]:ADATA[2][2] /// LINK PARA CLIENTE
...
.
..
.
EndIf
REturn
Static Function sIDToken( cUrlPri, cUrlTko, cIddLog, cIddPsw )
/*============== [DEFINIÇÃO DAS VARIÁVEIS] ==============*/
Local nTimeOut := 120
Local cKeyTko := ""
Local cStatus := ""
Local cMsgPst := ""
Local sPostTko := ""
Local cHeaderRet:= ""
Local aHeadOut := {}
Local aPostRet := {}
/*============== [9. AUTENTICAÇÃO TOKENS DE ACESSO - ] ==============*/
aAdd( aHeadOut, 'Accept: */*' )
aAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')')
aAdd( aHeadOut, 'Content-Type: application/json')
aAdd( aHeadOut, 'Authorization: Basic ' + Encode64( cIddLog + ':' + cIddPsw ) )
sPostTko := HttpPost( ( cUrlPri + cUrlTko ), cMsgPst, "", nTimeOut, aHeadOut, @cHeaderRet )
aPostRet := FromJson( sPostTko )
cStatus := SubStr( cHeaderRet, AT( ' ', cHeaderRet) + 1, 3)
If( cStatus == '200')
cKeyTko := aPostRet:adata[1][2]:adata[1][2]
EndIf
/*---------------------*/
Return cKeyTko
json := jLogin:ToJson() seria na verdade cjson := jLogin:ToJson() ?
— Douglas Bichir 09 de Jul de 2020Infelizmente é só um erro de transcrição. Queria que fosse o problema!
— Fernando Pinottio 09 de Jul de 2020O autorization é Basic mesmo? HTTPS normalmente tende a ser utikizado bearer...
— Douglas Bichir 09 de Jul de 2020É basic mesmo, no postman funciona normal.
— Fernando Pinottio 10 de Jul de 2020Acho que é o seguinte aadd(aHeadOut,'Authorization: Basic SUNTOnRvdGFs') esse SUNTOnRvdGFs já é base 64? Se for invés de digitar o base 64, faz com encode64 exemplo -> Aadd(aHeadStr, "Authorization: Basic " + Encode64("protheus:t@t890"))
— Douglas Bichir 10 de Jul de 2020Alias, é importante passar na url, os mesmos parâmetros que vai nos params, grant_type, no postman ele adiciona automaticamente, no protheus deve adicionar no path também
— Douglas Bichir 10 de Jul de 2020Exemplo: Local cUrl := 'https://apiplataforma.com.br/oauth/token' Local cPath := '?grant_type=password&username=000105&password=hEtr8rASGfdOadalyA27clV8Z14RET'
— Douglas Bichir 10 de Jul de 2020Mas eu informo o login e senha no corpo, se fosse informar no cabeçalho, eu teria que utilizar o encode64(). Mas vou testar!
— Fernando Pinottio 10 de Jul de 2020Testei, mesmo erro.
— Fernando Pinottio 10 de Jul de 2020