• 10-08-2017, 10:08:23
    #1
    Merhaba arkadaşlar,

    PHP tabanlı bir muhasebe yazılımımız var. Bu yazılıma E-Fatura'yı entegre etmek istiyoruz, ancak php akis kartları göremediği için java ile bir paket(jar) hazırlayıp php exec fonksiyonu ile çalıştırmayı düşündüm, imzalama işlemini düzgün yapıyor ancak E-Fatura görüntüleme aracı ile kontrol ettiğim zaman "imza doğrulama durumu" ve "referans[0]" alanları geçersiz hatası alıyorum, sadece "referans[1]" alanı geçerli görünüyor, kodlar aşağıda java'dan anlayan bir arkadaş veya e-fatura altyapısı üzerinde daha önce çalışmış bir arkadaş yardımcı olursa sevinirim.

    public void EFatura() throws Exception
    {
        Context context = createContext();
    
        // read and add an external XML
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        // Document elements
        org.w3c.dom.Document doc = docBuilder.parse(new File(BASE_DIR + "ornekfatura.xml"));
        Element extContent = (Element)doc.getDocumentElement().getElementsByTagName("ext:ExtensionContent").item(0);
       
        context.setDocument(doc);
        XMLSignature signatures = new XMLSignature(context, false);
    
        extContent.appendChild(signatures.getElement());
       
        // use enveloped signature transform
        Transforms transforms = new Transforms(context);
        transforms.addTransform(new Transform(context, TransformType.ENVELOPED.getUrl()));
        signatures.addDocument("", null, transforms, DigestMethod.SHA_256, false);
    
      //add signer role information
        SignerRole rol = new SignerRole(context, new ClaimedRole[]{new ClaimedRole(context, "Tedarikçi")});
        signatures.getQualifyingProperties().getSignedSignatureProperties().setSignerRole(rol);
    
        // false-true gets non-qualified certificates while true-false gets qualified ones
        ECertificate cert = SmartCardManager.getInstance().getSignatureCertificate(IS_QUALIFIED, !IS_QUALIFIED);
    
        // add certificate to show who signed the document
        signatures.addKeyInfo(new ECertificate(cert.getEncoded()));
       
        // add signing time
        signatures.setSigningTime(Calendar.getInstance());
       
        //e-fatura standards want signatureID to be same with cbc:URI
        // get signatureID from e-fatura
        String signatureID = ((Element)(doc.getDocumentElement().getElementsByTagName("cbc:URI").item(0)) ).getTextContent();
        String signatureIDwoNumberSign = signatureID.substring(1);
         
        //change original signatureID
        Element dsSignature = (Element)(doc.getDocumentElement().getElementsByTagName("ds:Signature").item(0));
        dsSignature.setAttribute("Id", signatureIDwoNumberSign);
    
        signatures.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);
    
    
        // now sign it by using smart card
        signatures.sign(SmartCardManager.getInstance().getSigner(PIN, cert));
    
        //attach signature to envelope structure
    
    
        Source source = new DOMSource(doc);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
    
        // write to file
        transformer.transform(source, new StreamResult(new FileOutputStream(BASE_DIR + SIGNATURE_FILENAME)));
    }
  • 23-08-2017, 16:18:33
    #2
    Kendi kendime cevap vereyim belki birinin işine yarar.

    Çözüm : https://github.com/3zRasasi/PHP-E-Fatura-Imzalama-Araci