Página 1 de 1

DISP_E_MEMBERNOTFOUND (a saga...)

Enviado: 05 Jan 2022 09:39
por Adson
Bom dia, senhores(as).

No xHarbour, eu uso o seguinte método para acessar uma URL e obter um token para acesso:

Código: Selecionar todos

*******************************************************
*
* Obtém um novo token.
*
*******************************************************
METHOD ObterToken() CLASS TXYWZ

LOCAL oServer, nPos := 0, cCredentials, nExpireTime := 0
   
   ::cTokenTemp   := ""
   ::cTokenType   := ""
   ::tTokenExpira := CTOT("")
   ::aResultado   := Hash()
   ::nCode        := 0
   
   // Obtém um novo token
   oServer:=CreateObject( "MSXML2.ServerXMLHTTP")
// oServer:=CreateObject( "MSXML2.ServerXMLHTTP.5.0") (já testei com todos esses objetos mas sem sucesso)
// oServer:=CreateObject( "Microsoft.XMLHTTP" )
// oServer:=CreateObject( "MSXML2.XMLHTTP" )

   oServer:Open( "POST", ::cURL + "/oauth2/token", .F. )
   
   oServer:setRequestHeader( "Content-Type",    "application/x-www-form-urlencoded; charset=utf-8")
   oServer:SetRequestHeader( "accept",          "*/*" )
   oServer:SetRequestHeader( "Accept-Encoding", "gzip, deflate, br" )
   oServer:SetRequestHeader( "Connection",      "keep-alive" )
   
   cCredentials := "client_id=" + ::cClientID + ;
                   "&client_secret=" + ::cClientSecret + ;
                   "&grant_type=client_credentials" + ;
                   "&scope=partner_all"

   TRY
      oServer:Send(cCredentials)
      oServer:WaitForResponse( 1000 )
   CATCH
      FA_GravarLog( "OBTÉM TOKEN TRY CATCH (FALHA)" + LF + Ole2TxtError() + LF + valtoprg( oServer ) )
      If ::lMsgErro
         MsgExclamation("Falha ao obter um novo token de acesso."+LF+LF+;
                        "Erro na conexão com o site "+::cURL + "/oauth2/token"+LF+LF+;
                        "Erro: " + Ole2TxtError() +LF+LF+;
                        "Tente novamente mais tarde", PROCNAME() )
      EndIf
      oServer := NIL
      Return
   END
   
   ::nCode := oServer:status
   nPos    := aScan( aCode, {|x| x[1] == ::nCode } )
   
   If nPos > 0
      ::cMsg  := aCode[nPos,2]
   Else
      ::cMsg  := 'CÓDIGO DE RETORNO NÃO ENCONTRADO '+STR(::nCode,3)
   EndIf
   
   hb_jsonDecode( oServer:ResponseBody, @::aResultado )

   // Salva o retorno 
   If ::lSalvaRet
      If EMPTY( vJSonFile )
         vJSonFile := STRZERO( HB_RandomInt( 999999 ), 6 )+".JSON"
      EndIf   
      MemoWrit(vpUserDir+"\FCIAS_APP\RET_TOKEN_"+vJSonFile, oServer:ResponseText, .F.)
   EndIf

   If "ERRO INTERNO" $ UPPER(oServer:ResponseBody)

      If ::lMsgErro
         MsgExclamation("Houve um erro ao consultar o portal. Tente novamente mais tarde e se o problema persistir, "+;
                        "entre em contato com o seu suporte." )
      EndIf

   Else

      If HHasKey(::aResultado,'access_token') .AND. ::aResultado['access_token'] != NIL
         ::cTokenTemp := ::aResultado['access_token']
      endif

      If HHasKey(::aResultado,'token_type') .AND. ::aResultado['token_type'] != NIL
         ::cTokenType := ::aResultado['token_type']
      endif

      If HHasKey(::aResultado,'expires_in') .AND. ::aResultado['expires_in'] != NIL
         nExpireTime := ::aResultado['expires_in']
      endif

      // Salva as informações do token obtido
      If !EMPTY( ::cTokenTemp )
         ::tTokenExpira := DATETIME() + ( nExpireTime/24/60/60 )
      Else
         FA_GravarLog( "OBTÉM TOKEN (FALHA)" + LF + valtoprg( oServer:ResponseBody ) )
         If ::lMsgErro
            MsgExclamation("Falha ao obter um novo token de acesso"+LF+LF+;
                           STR(::nCode,3)+" - "+::cMsg, PROCNAME() )
         EndIf
      EndIf

   EndIf

   oServer := NIL

   Return
Funciona redondinho nas máquinas com Windows 10, no entanto, em algumas máquinas com Windows 7 (não todas), retorna msg DISP_E_MEMBERNOTFOUND.
Alguém pode me ajudar com uma sugestão ? Já pesquisei, inclusive aqui no fórum mas não encontrei.

Obs: Uso o xHarbour 1.2.3 + HWGui

DISP_E_MEMBERNOTFOUND (a saga...)

Enviado: 05 Jan 2022 10:14
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

oServer:= CreateObject( "MSXML2.ServerXMLHTTP.6.0" )
http://forums.fivetechsupport.com/viewt ... =6&t=33609

Saudações,
Itamar M. Lins Jr.

DISP_E_MEMBERNOTFOUND (a saga...)

Enviado: 05 Jan 2022 11:13
por Adson
Itamar M. Lins Jr. escreveu:Olá!

Código: Selecionar todos

oServer:= CreateObject( "MSXML2.ServerXMLHTTP.6.0" )
http://forums.fivetechsupport.com/viewt ... =6&t=33609

Saudações,
Itamar M. Lins Jr.
Itamar, obrigado pelo seu retorno, mas não deu certo.

DISP_E_MEMBERNOTFOUND (a saga...)

Enviado: 05 Jan 2022 12:46
por Itamar M. Lins Jr.
Olá!
Lendo na internet, é um erro por falta de DLL ou permissão.
Talvez TLS, SSL velhos ? desativados.
Ou tentar com permissões de ADMIN.
https://support.microsoft.com/pt-br/top ... 268bb10392

Saudações,
Itamar M. Lins Jr.

DISP_E_MEMBERNOTFOUND (a saga...)

Enviado: 05 Jan 2022 14:56
por Adson
Itamar M. Lins Jr. escreveu:Olá!
Lendo na internet, é um erro por falta de DLL ou permissão.
Talvez TLS, SSL velhos ? desativados.
Ou tentar com permissões de ADMIN.
https://support.microsoft.com/pt-br/top ... 268bb10392

Saudações,
Itamar M. Lins Jr.
Funcionou aqui !!!! Obrigado, Itamar.

Para atualizar usamos o seguinte arquivo de lotes (executar o .bat como administrador)

Código: Selecionar todos

ECHO off
if EXIST %windir%\SysWOW64 goto Win64
:Win32
ECHO *** Criar registro x86 ***
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" /v DefaultSecureProtocols /t REG_DWORD  /d 2688 /f
goto end
:Win64
ECHO *** Criar regsitro em  x64 ***
REG ADD "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp" /v DefaultSecureProtocols /t REG_DWORD  /d 2688 /f
goto end
:end
ECHO.
ECHO.
ECHO Concluido com sucesso
ECHO.
ECHO.
pause
Mais uma vez, muito obrigado !!!!!

.