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