Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-06-2017
Avatar de dimony
dimony dimony is offline
Miembro
 
Registrado: oct 2006
Posts: 28
Poder: 0
dimony Va por buen camino
Certificados en 64Bits

Hola buenos días, ya se que este tema esta muy trillado, pero me ha saltado ahora y estoy algo desesperado.
Resulta que el envío de facturas me funcionaba a las mil maravillas, enviaba mas de 13 o 14 con mi librería capicom.dll.
El día de ayer me llama un cliente que tiene un s.o. de 64 bits y empieza a petar el envío con mas de 14 facturas.
Con las mismas me puse a buscar en este maravilloso foro y vi varias posibilidades de las cuales no me ha funcionado ninguna.

1ª.- Descargue la instalación de capicom a 64 bits y la registre. --> Error no envía mas de 14.
2ª.- Supuse que tendría que compilar mi app para Windows 64 bits, por lo que lo incluí windows 64 bit en Target Plattaforms

Código Delphi [-]
procedure TData.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
     Store : IStore;
     Certs : ICertificates;
     Cert : ICertificate2;
     CertContext : ICertContext;
     PCertContext : PCCERT_CONTEXT;
     V : OleVariant;
 const
     INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
begin
  V:= trim(main.lista_certificados.Items.Text);
  Store := CoStore.Create;
  Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED );
  Certs:=Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False ); { Buscar certificado por nombre }
  if Certs.Count > 0 then
    begin
    Cert:=IInterface(Certs.Item[1]) as ICertificate2;
    CertContext:=Cert as ICertContext;
    CertContext.Get_CertContext(integer(PCertContext));
    if InternetSetOption(Data,INTERNET_OPTION_CLIENT_CERT_CONTEXT,PCertContext,Sizeof(CERT_CONTEXT)) = False then
      begin
      ShowMessage( 'Internet SSL certificate. Something went wrong' );
      end;
    end;
end;

Código Delphi [-]
[dcc64 Error] Datos.pas(188): E2197 Constant object cannot be passed as var parameter

Este error es por que PCertContext se debería declarar como constante, pero exactamente no se que valor se le debería dar.

Y ahí me he quedado.
Me podría alguien echar un cable, o darme unas nociones por si a lidiado con este Montoro ... digo Toro.
Gracias.
Responder Con Cita
  #2  
Antiguo 23-06-2017
anabelda anabelda is offline
Registrado
 
Registrado: jul 2006
Posts: 6
Poder: 0
anabelda Va por buen camino
Envío masivo

Cita:
Empezado por dimony Ver Mensaje
Hola buenos días, ya se que este tema esta muy trillado, pero me ha saltado ahora y estoy algo desesperado.
Resulta que el envío de facturas me funcionaba a las mil maravillas, enviaba mas de 13 o 14 con mi librería capicom.dll.
El día de ayer me llama un cliente que tiene un s.o. de 64 bits y empieza a petar el envío con mas de 14 facturas.
Con las mismas me puse a buscar en este maravilloso foro y vi varias posibilidades de las cuales no me ha funcionado ninguna.

1ª.- Descargue la instalación de capicom a 64 bits y la registre. --> Error no envía mas de 14.
2ª.- Supuse que tendría que compilar mi app para Windows 64 bits, por lo que lo incluí windows 64 bit en Target Plattaforms

Código Delphi [-]
procedure TData.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
     Store : IStore;
     Certs : ICertificates;
     Cert : ICertificate2;
     CertContext : ICertContext;
     PCertContext : PCCERT_CONTEXT;
     V : OleVariant;
 const
     INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
begin
  V:= trim(main.lista_certificados.Items.Text);
  Store := CoStore.Create;
  Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED );
  Certs:=Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False ); { Buscar certificado por nombre }
  if Certs.Count > 0 then
    begin
    Cert:=IInterface(Certs.Item[1]) as ICertificate2;
    CertContext:=Cert as ICertContext;
    CertContext.Get_CertContext(integer(PCertContext));
    if InternetSetOption(Data,INTERNET_OPTION_CLIENT_CERT_CONTEXT,PCertContext,Sizeof(CERT_CONTEXT)) = False then
      begin
      ShowMessage( 'Internet SSL certificate. Something went wrong' );
      end;
    end;
end;

Código Delphi [-]
[dcc64 Error] Datos.pas(188): E2197 Constant object cannot be passed as var parameter

Este error es por que PCertContext se debería declarar como constante, pero exactamente no se que valor se le debería dar.

Y ahí me he quedado.
Me podría alguien echar un cable, o darme unas nociones por si a lidiado con este Montoro ... digo Toro.
Gracias.
Hola,
yo también estoy peleando con este tema, el tope que consigo enviar son 25 facturas. También estoy utilizando CAPICOM.
Responder Con Cita
  #3  
Antiguo 23-06-2017
Avatar de dimony
dimony dimony is offline
Miembro
 
Registrado: oct 2006
Posts: 28
Poder: 0
dimony Va por buen camino
Cita:
Empezado por anabelda Ver Mensaje
Hola,
yo también estoy peleando con este tema, el tope que consigo enviar son 25 facturas. También estoy utilizando CAPICOM.
Yo voy a optar por enviar lotes de 13 facturas en 13.
Bueno 13 no que da mal fario,
Responder Con Cita
  #4  
Antiguo 23-06-2017
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 281
Poder: 8
manelb Va por buen camino
Cita:
Empezado por dimony Ver Mensaje
Hola buenos días, ya se que este tema esta muy trillado, pero me ha saltado ahora y estoy algo desesperado.
Resulta que el envío de facturas me funcionaba a las mil maravillas, enviaba mas de 13 o 14 con mi librería capicom.dll.
El día de ayer me llama un cliente que tiene un s.o. de 64 bits y empieza a petar el envío con mas de 14 facturas.
Con las mismas me puse a buscar en este maravilloso foro y vi varias posibilidades de las cuales no me ha funcionado ninguna.
Hay un comprimido de un compañero en el hilo donde explica detalladamente como instalar y registrar CAPICOM.

http://www.clubdelphi.com/foros/misc...hments&t=91252

Yo lo estoy utilizando en 32 y 64 bits y no tengo ningún problema.

No recuerdo quien lo envió (disculpa compañero........)pero le estaré eternamente agradecido.
Responder Con Cita
  #5  
Antiguo 23-06-2017
parrux parrux is offline
Registrado
NULL
 
Registrado: jun 2017
Posts: 2
Poder: 0
parrux Va por buen camino
notitificar factura española

Buenos días y gracias de antemano,
tengo una duda (porque algo estoy haciendo mal seguro) me dan error todos los CIF de las empresas, a ver si podéis echarme un cable:

Código:
//Contraparte
            FacturasEmitidas.PersonaFisicaJuridicaType contraparte = new FacturasEmitidas.PersonaFisicaJuridicaType();
            contraparte.NombreRazon = Factura.Contrap_RazonSocial;                                                                                  //Razón Social
            if (Factura.Contrap_NIFRepresentante != "")
                contraparte.NIFRepresentante = Factura.Contrap_NIFRepresentante;                                                                    //NIF Representante
          
            FacturasEmitidas.IDOtroType IdOtroContrap = new FacturasEmitidas.IDOtroType();                                                          //IdOtro
            if (Factura.Contrap_IdPais != null)
            {
                IdOtroContrap.CodigoPais = p.FacturasEmiConvertirPaises(Factura.Contrap_IdPais);                                                    //País
                IdOtroContrap.CodigoPaisSpecified = true;
            }
            IdOtroContrap.IDType = dp.FacturasEmiConvertirDocPaises(Factura.Contrap_IdType);                                                        //Doc País
            IdOtroContrap.ID = Factura.Contrap_Id;                                                                                                  //Id

            contraparte.Item = IdOtroContrap;
            
            f.FacturaExpedida.Contraparte = new FacturasEmitidas.PersonaFisicaJuridicaType();
            f.FacturaExpedida.Contraparte = contraparte;

            f.FacturaExpedida.TipoDesglose = new FacturasEmitidas.FacturaExpedidaTypeTipoDesglose();
No consigo o no se como especificar el NIF de una empresa española sin tener que recurrir al objeto IdOtro
Responder Con Cita
  #6  
Antiguo 23-06-2017
Avatar de dimony
dimony dimony is offline
Miembro
 
Registrado: oct 2006
Posts: 28
Poder: 0
dimony Va por buen camino
Cita:
Empezado por parrux Ver Mensaje
Buenos días y gracias de antemano,
tengo una duda (porque algo estoy haciendo mal seguro) me dan error todos los CIF de las empresas, a ver si podéis echarme un cable:

Código:
//Contraparte
            FacturasEmitidas.PersonaFisicaJuridicaType contraparte = new FacturasEmitidas.PersonaFisicaJuridicaType();
            contraparte.NombreRazon = Factura.Contrap_RazonSocial;                                                                                  //Razón Social
            if (Factura.Contrap_NIFRepresentante != "")
                contraparte.NIFRepresentante = Factura.Contrap_NIFRepresentante;                                                                    //NIF Representante
          
            FacturasEmitidas.IDOtroType IdOtroContrap = new FacturasEmitidas.IDOtroType();                                                          //IdOtro
            if (Factura.Contrap_IdPais != null)
            {
                IdOtroContrap.CodigoPais = p.FacturasEmiConvertirPaises(Factura.Contrap_IdPais);                                                    //País
                IdOtroContrap.CodigoPaisSpecified = true;
            }
            IdOtroContrap.IDType = dp.FacturasEmiConvertirDocPaises(Factura.Contrap_IdType);                                                        //Doc País
            IdOtroContrap.ID = Factura.Contrap_Id;                                                                                                  //Id

            contraparte.Item = IdOtroContrap;
            
            f.FacturaExpedida.Contraparte = new FacturasEmitidas.PersonaFisicaJuridicaType();
            f.FacturaExpedida.Contraparte = contraparte;

            f.FacturaExpedida.TipoDesglose = new FacturasEmitidas.FacturaExpedidaTypeTipoDesglose();
No consigo o no se como especificar el NIF de una empresa española sin tener que recurrir al objeto IdOtro
Id_Otro se debe de utilizar solo en caso de que no sea un CIF español, o sea que es excluyente
Responder Con Cita
  #7  
Antiguo 23-06-2017
parrux parrux is offline
Registrado
NULL
 
Registrado: jun 2017
Posts: 2
Poder: 0
parrux Va por buen camino
Cita:
Empezado por dimony Ver Mensaje
Id_Otro se debe de utilizar solo en caso de que no sea un CIF español, o sea que es excluyente
Gracias por tu respuesta!
Y si es Español directamente paso el CIF, me explico, las unicas propiedades que me da FacturaExpedida.Contraparte son:

.NombreRazon
.NIFRepresentante
.Item

si no meto un objeto IdOtro y meto directamente un String "V12346578" por defecto pone la eqtiqueta NIF?? o como va???

Muchas gracias de nuevo!
Responder Con Cita
  #8  
Antiguo 23-06-2017
Avatar de dimony
dimony dimony is offline
Miembro
 
Registrado: oct 2006
Posts: 28
Poder: 0
dimony Va por buen camino
Cita:
Empezado por parrux Ver Mensaje
Gracias por tu respuesta!
Y si es Español directamente paso el CIF, me explico, las unicas propiedades que me da FacturaExpedida.Contraparte son:

.NombreRazon
.NIFRepresentante
.Item

si no meto un objeto IdOtro y meto directamente un String "V12346578" por defecto pone la eqtiqueta NIF?? o como va???

Muchas gracias de nuevo!
Aquí va parte de mi código, espero que te ayude.
Código Delphi [-]
if data.LibrosRegistros.FieldByName('clave_tipo_factura').AsString <> 'F2' then
      begin
      v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte := SuministroFactEmitidas.PersonaFisicaJuridicaType.Create;
      v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.NombreRazon := data.LibrosRegistros.FieldByName('des_cuenta').AsString;
      v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.NIFRepresentante := '';

      if data.LibrosRegistros.FieldByName('codigo_pais_contraparte').AsString = 'ES' then
        v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.NIF := data.LibrosRegistros.FieldByName('cif').AsString
      else
        begin
        for v_dummy := 0 to Length(main.v_paises) do
          begin
          if main.v_paises[v_dummy] = data.LibrosRegistros.FieldByName('codigo_pais_contraparte').AsString then
            break;
          end;

        v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro := SuministroFactEmitidas.IDOtroType.Create;
        v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.CodigoPais := SuministroFactEmitidas.CountryType2(v_dummy);

        if data.LibrosRegistros.FieldByName('clave_identificacion_fiscal').AsString = '02' then
          v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.IDType := SuministroFactEmitidas.PersonaFisicaJuridicaIDTypeType(0)
        else if data.LibrosRegistros.FieldByName('clave_identificacion_fiscal').AsString = '03' then
          v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.IDType := SuministroFactEmitidas.PersonaFisicaJuridicaIDTypeType(1)
        else if data.LibrosRegistros.FieldByName('clave_identificacion_fiscal').AsString = '04' then
          v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.IDType := SuministroFactEmitidas.PersonaFisicaJuridicaIDTypeType(2)
        else if data.LibrosRegistros.FieldByName('clave_identificacion_fiscal').AsString = '05' then
          v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.IDType := SuministroFactEmitidas.PersonaFisicaJuridicaIDTypeType(3)
        else if data.LibrosRegistros.FieldByName('clave_identificacion_fiscal').AsString = '06' then
          v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.IDType := SuministroFactEmitidas.PersonaFisicaJuridicaIDTypeType(4);

        v_RegistroLRFacturasEmitidas[v_registros_facturas - 1].FacturaExpedida.Contraparte.IDotro.id := data.LibrosRegistros.FieldByName('numero_identificacion_pais').AsString;
        end;
      end;
Responder Con Cita
  #9  
Antiguo 23-06-2017
anabelda anabelda is offline
Registrado
 
Registrado: jul 2006
Posts: 6
Poder: 0
anabelda Va por buen camino
Cita:
Empezado por manelb Ver Mensaje
Hay un comprimido de un compañero en el hilo donde explica detalladamente como instalar y registrar CAPICOM.


Yo lo estoy utilizando en 32 y 64 bits y no tengo ningún problema.

No recuerdo quien lo envió (disculpa compañero........)pero le estaré eternamente agradecido.
Si, seguí esos pasos. Pero creo que el problema lo tengo a la hora de obtener el certificado, utilizo SecureBlackBox. Mi duda es en la siguiente línea
Certs := Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False );

¿que es el parametro V? ¿como lo obtengo con SecureBlackbox, si es posible?
Responder Con Cita
  #10  
Antiguo 23-06-2017
anabelda anabelda is offline
Registrado
 
Registrado: jul 2006
Posts: 6
Poder: 0
anabelda Va por buen camino
Resuelto

Cita:
Empezado por anabelda Ver Mensaje
Si, seguí esos pasos. Pero creo que el problema lo tengo a la hora de obtener el certificado, utilizo SecureBlackBox. Mi duda es en la siguiente línea
Certs := Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False );

¿que es el parametro V? ¿como lo obtengo con SecureBlackbox, si es posible?
Por fin, lo he conseguido. Como suponía el problema lo tenia al asociar el certificado, en un principio asignaba el número de serie, pero no era correcto. Con la siguiente línea ya me funciona:

v:=certif.SubjectName.CommonName;
Responder Con Cita
  #11  
Antiguo 27-06-2017
Avatar de dimony
dimony dimony is offline
Miembro
 
Registrado: oct 2006
Posts: 28
Poder: 0
dimony Va por buen camino
Cita:
Empezado por dimony Ver Mensaje
Hola buenos días, ya se que este tema esta muy trillado, pero me ha saltado ahora y estoy algo desesperado.
Resulta que el envío de facturas me funcionaba a las mil maravillas, enviaba mas de 13 o 14 con mi librería capicom.dll.
El día de ayer me llama un cliente que tiene un s.o. de 64 bits y empieza a petar el envío con mas de 14 facturas.
Con las mismas me puse a buscar en este maravilloso foro y vi varias posibilidades de las cuales no me ha funcionado ninguna.

1ª.- Descargue la instalación de capicom a 64 bits y la registre. --> Error no envía mas de 14.
2ª.- Supuse que tendría que compilar mi app para Windows 64 bits, por lo que lo incluí windows 64 bit en Target Plattaforms

Código Delphi [-]procedure TData.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); var Store : IStore; Certs : ICertificates; Cert : ICertificate2; CertContext : ICertContext; PCertContext : PCCERT_CONTEXT; V : OleVariant; const INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84; begin V:= trim(main.lista_certificados.Items.Text); Store := CoStore.Create; Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED ); Certs:=Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False ); { Buscar certificado por nombre } if Certs.Count > 0 then begin Cert:=IInterface(Certs.Item[1]) as ICertificate2; CertContext:=Cert as ICertContext; CertContext.Get_CertContext(integer(PCertContext)); if InternetSetOption(Data,INTERNET_OPTION_CLIENT_CERT_CONTEXT,PCertContext,Sizeof(CERT_CONTEXT)) = False then begin ShowMessage( 'Internet SSL certificate. Something went wrong' ); end; end; end;


Código Delphi [-][dcc64 Error] Datos.pas(188): E2197 Constant object cannot be passed as var parameter


Este error es por que PCertContext se debería declarar como constante, pero exactamente no se que valor se le debería dar.

Y ahí me he quedado.
Me podría alguien echar un cable, o darme unas nociones por si a lidiado con este Montoro ... digo Toro.
Gracias.
¿Hay alguna alternativa a CAPICOM?. He visto en la web de Microsoft que a partir de Windows7 fue excluido de WINDOWS SDK.
Responder Con Cita
  #12  
Antiguo 27-06-2017
figo21 figo21 is offline
Miembro
 
Registrado: dic 2012
Posts: 104
Poder: 12
figo21 Va por buen camino
Cita:
Empezado por dimony Ver Mensaje
¿Hay alguna alternativa a CAPICOM?. He visto en la web de Microsoft que a partir de Windows7 fue excluido de WINDOWS SDK.
No trabajo con Delphi ni sé cual es el motivo de usar CAPICOM, pero aquí tienes algo de código en c++ con llamadas a WinInet que se adecúa más o menos al código que muestras:

HCERTSTORE hStore;
PCCERT_CONTEXT pFindContext;

hStore = CertOpenSystemStoreA(0, TEXT("MY"));

cCert = "NOMBRE DEL CERTIFICADO"
pFindContext =CertFindCertificateInStore(hStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, cCert, NULL);

Ya apartir de ahí:
InternetSetOption(Data,INTERNET_OPTION_CLIENT_CERT_CONTEXT,pFindContext,Sizeof(CERT_CONTEXT));

Seleccionar el certificado con el diálogo de Windows se puede hacer con CryptUIDlgSelectCertificateFromStore.


Si te sirve o como se puede trasladar esto a Delphi no lo sé, pero si quieres hacer pruebas, pues ahí tienes algo.

Un saludo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco keys Internet 4170 Hace 2 Semanas 17:29:05
AEAT envio de datos vía Webservice problemas con WSDL CelsoO Internet 11 09-10-2019 20:03:41
webService Soap de la Administración Digital Española notific@ apicito Internet 3 31-01-2017 11:25:28
Error en Webservice funcion envio de sms webmasterplc Delphi para la web 5 25-07-2013 20:10:29
Problemas con envío de XML a un WebService davidvamo Internet 1 13-02-2007 15:49:20


La franja horaria es GMT +2. Ahora son las 21:17:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi