Buenas tardes, dejo aquí la versión definitiva en forma de clase.
Code: Select all | Expand
#include "Fivewin.ch"
class TApiBBVA
data oWnd && Ventana Padre
data cNomObjOLE && Nombre del objeto OLE para hacer GET y POST
data cAppID && Informaci¢n APP creada en BBVAMarket
data cSecretID && Informaci¢n C¢digo secreto de BBVAMarket
data cURL && URL de BBVA
data cRedirect_Uri && Url a la que se redige la respuesta de ConnectBBVA
data cToken && Access_Token devuelto por oAuth
data cCode && Authorization_Code necesario para solicitar access_token
data cFicTok && Nombre de fichero para almacenar Token
data cFicJSon && Nombre de fichero para almacenar respuesta JSon
data oTimer && Timer para comprobar cada 3 segundos que ha respondido ConnectBBVA
method New (oWnd)
method EXTRACTO () && Devuelve JSon con los extractos de las cuentas del cliente BBVA
method PEDIR_CODE () && Si el usuario a rellenado sus datos correctos en ConnecBBVA, rellena ::cCode
method IniTimer ( oDlg, oActiveX ) && Iniciar ::oTimer
method TENGO_CODE ( oActiveX ) && Comprueba que la cUrl contiene en ::cCode, lo rellena y devuelve true
method PEDIR_TOKEN () && Petici¢n de access_Token usando ::cCode y si hay respuesta devuelve true
method PEDIR_EXTRACTO () && Petici¢n de Extracto usando ::cToken, devuelve Json son los datos
endclass
method New (oWnd) class TApiBBVA
::oWnd := oWnd
::cNomObjOLE := "Microsoft.XMLHTTP" && "WINHTTP.WINHTTPREQUEST.5.1"
::cAppID := '' && Hay que darse de alta en BBVAMarket
::cSecretID := ""
::cURL := "https://connect.bbva.com/token"
::cRedirect_Uri := "http://localhost"
::cToken := ""
::cCode := ""
::cFicTok := '.\TOK_BBV.TXT'
::cFicJSon := '.\EXT_BBV.JSON'
return Self
method EXTRACTO () class TApiBBVA
if ::PEDIR_CODE ()
if ::PEDIR_TOKEN ()
::PEDIR_EXTRACTO ()
endif
endif
return Nil
method PEDIR_CODE () class TApiBBVA
local oDlg, oActiveX, nPos, oTimer, oApi
oApi := Self
define dialog oDlg from 100, 100 to 950,1000 title "Navegar" pixel ;
of ::oWnd
activate dialog oDlg on init ;
( oActiveX := ShowPageWeb( oDlg, ;
"https://connect.bbva.com/sandboxconnect?scope=" + ;
"&client_id=" + oApi:cAppID + ;
"&redirect_uri=" + oApi:cRedirect_Uri + ;
"&response_type=code", 0, 0, 825, 950 ) , ;
oApi:IniTimer (oDlg, oActiveX ) )
release ::oTimer
return oDlg:nResult = ID_OK
method IniTimer ( oDlg, oActiveX ) class TApiBBVA
define Timer ::oTimer of oDlg interval 3000 ;
action IF ( ::TENGO_CODE (oActiveX), oDlg:End (ID_OK), )
activate Timer ::oTimer
return Nil
method TENGO_CODE ( oActiveX ) class TApiBBVA
local oDOM := oActiveX:GetProp( "Document" ), ; // -> Object Document
Retorno := .f., nPos
local cUrl := oDOM:Url
if (nPos := AT ( "?code=", cUrl )) # 0
::cCode := SUBSTR ( cUrl, nPos + 6 )
Retorno := .t.
endif
return Retorno
Function ShowPageWeb( oParent, cUrl, nT, nL, nH, nW )
local oActiveX, oHttp, oActiveXdo
oActiveX := TActiveX():New( oParent, "Shell.Explorer.2", nT, nL, nW, nH )
oActivex:Silent := .T. // aqui silence... en el script.
oActiveX:Do( "Navigate2", cUrl )
oActivex:SetFocus()
WHILE oActivex:Busy
SysWait(.2)
ENDDO
oActiveXdo := oActiveX:Document()
oHttp := oActiveX:GetProp( "Document" ) // -> Object Document
if Empty( oHttp )
MsgInfo( "Problemas en el Site...", ;
"Problemas en el Site..." )
RETURN( .F. )
endif
Return oActiveX
method PEDIR_TOKEN () class TApiBBVA
local oHttp, cCadena, aRespuesta
try
oHttp := CreateObject (::cNomObjOLE)
catch
? 'Error de creacion oHttp'
return .t.
end
oHttp:Open ( "POST" , ::cUrl + "?grant_type=authorization_code" + ;
"&code=" + ALLTRIM (::cCode) + ;
"&redirect_uri=" + ::cRedirect_Uri, .f. )
oHttp:SetRequestHeader ( "Authorization", ;
"Basic " + cMimeEnc(::cAppID + ':' + ::cSecretID) )
try
oHttp:Send ()
catch
? 'Error en Send Token'
return .t.
end
cCadena := oHttp:responseText
* HB_MemoWrit ( ::cFicTok, cCadena, .f. )
aRespuesta := hb_jsonDecode (cCadena)
if hb_HHaskey ( aRespuesta, 'access_token' )
::cToken := aRespuesta ['access_token']
endif
oHttp := Nil
return ! EMPTY ( ::cToken )
method PEDIR_EXTRACTO () class TApiBBVA
local oHttp, cUrl, cCadena
cURL := "https://apis.bbva.com/business-accounts-sbx/v1/statements/aeb43"
try
oHttp := CreateObject (::cNomObjOLE)
catch
? 'Error de creacion oHttp'
return .t.
end
oHttp:Open ( "GET" , cUrl, .f. )
oHttp:SetRequestHeader ( "Content-Type", "application/json")
oHttp:SetRequestHeader ( "Accept", "application/json")
oHttp:SetRequestHeader ( "Authorization", "jwt " + ::cToken )
oHttp:SetRequestHeader ( "Host", "apis.bbva.com" )
try
oHttp:Send ()
catch
? 'Error en Send'
return .t.
end
cCadena := oHttp:responseText
HB_MemoWrit ( ::cFicJSon, cCadena, .f. )
oHttp := Nil
return Nil
La clase se usaría así :
Code: Select all | Expand
oApiBBVA := TApiBBVA():new () && Pasar como parámetro la ventana padre
oApiBBVA:EXTRACTO ()
La pantalla de identificación de ConnectBBVA con los datos de usuario de pruebas (contraseña:123456)
![Image](https://i.postimg.cc/KvJBWM5X/Identificacion-BBVA.png)
El resultado final es el fichero EXT_BBV.JSON con el siguiente contenido :
{"result":{"code":200,"info":"OK"},"data":{"AEB43file":"110182241902008000282104202104201000019193174009783CARLOS BANANERO RUIZ \n 2201822419210420210420028972000000000551180000000000ABONO COMP. TRU 30/1/2017 \n 2201822419210420210420021731000000000003500000000000LIQUID.ABONO COM \n 3301822419020080002800010000000025535350001000000002553535100001919317400978 \n 88999999999999999999000035 "}}