Hola mi gente del club.
Necesito desarrollar una app que se comunique con un servidor, le envíe ciertos arrays de caracteres para obtener una factura electrónica.
Este servidor no recibe XML sino cadenas de datos "normales", lo cual en teoría debe facilitar la programación. Además se puede obtener un PDF y una imagen de código de barras bidimensional.
Ya me estuve documentando pero no encontré mucha información útil, por eso acudo a su invaluable ayuda.
Ya usé el WSDL importer que proporciona Delphi 7 para obtener la unidad WSDL que la que muestro a continuación:
Código Delphi
[-]
unit ConexionRemota32;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
ArrayOfString = array of WideString;
ConexionRemota32Soap = interface(IInvokable)
['{E4A3238C-F777-D8FE-02E9-DAF81F6A193C}']
function GenerarCFDIv32(const datosUsuario: ArrayOfString; const datosReceptor: ArrayOfString; const datosCFDI: ArrayOfString; const etiquetas: ArrayOfString; const conceptos: ArrayOfString;
const informacionAduanera: ArrayOfString; const retenciones: ArrayOfString; const traslados: ArrayOfString; const retencionesLocales: ArrayOfString; const trasladosLocales: ArrayOfString
): ArrayOfString; stdcall;
function GenerarCodigoBidimensional(const datosUsuario: ArrayOfString; const UUID: WideString): ArrayOfString; stdcall;
function CancelarCFDI(const datosUsuario: ArrayOfString; const ListaACancelar: ArrayOfString): ArrayOfString; stdcall;
function EnviarCFDI(const datosUsuario: ArrayOfString; const UUID: WideString; const email: WideString): ArrayOfString; stdcall;
function ObtenerPDF(const datosUsuario: ArrayOfString; const UUID: WideString): ArrayOfString; stdcall;
function ObtenerNumeroCreditos(const datosUsuario: ArrayOfString): ArrayOfString; stdcall;
end;
function GetConexionRemota32Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ConexionRemota32Soap;
implementation
function GetConexionRemota32Soap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ConexionRemota32Soap;
const
defWSDL = 'https://www.fel.mx/ConexionRemotaCFDI32/ConexionRemota32.asmx?WSDL';
defURL = 'https://www.fel.mx/ConexionRemotaCFDI32/ConexionRemota32.asmx';
defSvc = 'ConexionRemota32';
defPrt = 'ConexionRemota32Soap';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as ConexionRemota32Soap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(ConexionRemota32Soap), 'https://www.fel.mx/ConexionRemotaCFDI', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ConexionRemota32Soap), 'https://www.fel.mx/ConexionRemotaCFDI/%operationName%');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfString), 'https://www.fel.mx/ConexionRemotaCFDI', 'ArrayOfString');
end.
Ya la importé en la unidad de mi proyecto, como pueden ver, hay 5 funciones, ahorita estoy intentando con ObtenerNumeroCreditos, que es la más básica. Esta me devuelve el numero de créditos que el usuario aun dispone para facturar, 1 crédito = 1 factura.
En el API nos indican que el parámetro de entrada USUARIO es un array de 3 pocisiones con id, usuario y contraseña respectivamente.
Pero de aquí no sé como seguir la verdad

Lo que se me ocurrió fue esta función:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
resultado, usuario : ArrayofString;
i : integer;
fel : ConexionRemota32Soap;
begin
i:=0;
SetLength(usuario,3);
usuario[0]:='DEMO323416FEL';
usuario[1]:='DEMO323416FEL';
usuario[2]:='Link2701$';
resultado := fel.ObtenerNumeroCreditos(usuario);
Memo1.Lines.Add(resultado[0]);
Me compila pero me genera una excepcion por violación de dirección

Jiji ya se que ando bien perdido por eso les pido ayuda.
Un saludo y muchas gracias de antemano