lostyazilim
tr.link

Java ile E-Fatura imzalama konusunda yardım eder misiniz[ÇÖZÜLDÜ]

2 Mesajlar 2.304 Okunma
acebozum
tr.link

3zrasasi 3zrasasi WM Aracı Kullanıcı
  • Üyelik 26.09.2016
  • Yaş/Cinsiyet 35 / E
  • Meslek Web Developer
  • Konum İstanbul Avrupa
  • Ad Soyad K** K**
  • Mesajlar 13
  • Beğeniler 0 / 6
  • Ticaret 1, (%100)
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)));
}


 

 

elektronikssl
webimgo

3zrasasi 3zrasasi WM Aracı Kullanıcı
  • Üyelik 26.09.2016
  • Yaş/Cinsiyet 35 / E
  • Meslek Web Developer
  • Konum İstanbul Avrupa
  • Ad Soyad K** K**
  • Mesajlar 13
  • Beğeniler 0 / 6
  • Ticaret 1, (%100)
Kendi kendime cevap vereyim belki birinin işine yarar.

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

kişi bu mesajı beğendi.

wmaraci
wmaraci
Konuyu toplam 2 kişi okuyor. (0 kullanıcı ve 2 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al