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)));
}