«
«
Kullanıcı Masası
Hoşgeldin Ziyaretçi

Kategoriler
PHP İçin E-Fatura İmzalama Aracı
E-Fatura imzalama ile alakalı internette türkçe kaynak yok denecek kadar az, bu sebeple bu yazıyı hazırlamayı uygun gördüm. KamuSM'nin dağıtmakta olduğu Java ve .NET platformları için hazır kütüphaneler var, ancak bu kütüphaneleri PHP ile kullanmak için bağımsız çalışan bir araç gerekiyordu. Biraz araştırma yaparak ve KamuSM'nin dağıtmakta olduğu Java kütüphanesinin de yardımıyla bir araç geliştirdim ve bunu sizlerle paylaşmak istedim.

PHP ile java kullanmak aslında oldukça basit, yeterki Java sınıfı çalıştırılabilir bir jar dosyası haline getirilsin, bu konuda PHP'nin exec veya shell_exec fonksiyonları işinizi rahatlıkla görecektir. Aşağıda imzalama işlemini yapan Java sınıfı bulunuyor.


Örnek Java Sınıfı:

Kod Çizelgesi:[Hepsini Seç] 
package ntg.bls;

import java.io.FileOutputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

import ntg.bls.SampleBase;
import ntg.bls.SmartCardManager;
import tr.gov.tubitak.uekae.esya.api.asn.x509.ECertificate;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.C14nMethod;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.Context;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.DigestMethod;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.SignatureMethod;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.TransformType;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.XMLSignature;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.model.Transform;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.model.Transforms;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.model.xades.ClaimedRole;
import tr.gov.tubitak.uekae.esya.api.xmlsignature.model.xades.SignerRole;

public class anadosya extends SampleBase {
    static String degistir;
    static String degistirSonuc;
    static List<stringsonuc;
    static String GelenDosya;
    static String PIN;
    static Boolean SeriImza;
    static Boolean DosyaCikti;
    static Node eklenecekalan;
    
    public static void main(String[] GelenVeri) {
        try {
        
            /*if(GelenVeri.length == 0)
                degistirSonuc = "TicariFaturaOrnegi.xml,123456,false,false";
            else {*/
                degistir GelenVeri[0].replace("{","");
                degistirSonuc degistir.replace("}","");
            /*}*/
            
            sonuc = new ArrayList<string>(Arrays.asList(degistirSonuc.split(",")));
            
            /*if(GelenVeri.length == 0) GelenDosya = "imzalandi.xml";
            else*/ GelenDosya sonuc.get(0);
            
            PIN sonuc.get(1);
            SeriImza Boolean.parseBoolean(sonuc.get(2));
            DosyaCikti Boolean.parseBoolean(sonuc.get(3));
            
            /*
            System.out.println("GelenDosya : "+GelenDosya);
            System.out.println("PIN : "+PIN);
            System.out.println("SeriImza : "+SeriImza);
            System.out.println("DosyaCikti : "+DosyaCikti);
            */
            
            Context context createContext();
            org.w3c.dom.Document dosya parseDoc(GelenDosyacontext);
            
            // create signature according to context,
            // with default type (XADES_BES)
            XMLSignature signature = new XMLSignature(contextfalse);
    
            /* Seri İmza */
            if(SeriImza == true)
                eklenecekalan dosya.getDocumentElement().getElementsByTagName("oa:Signature").item(0);
            else
                eklenecekalan dosya.getDocumentElement().getElementsByTagName("ext:ExtensionContent").item(0);
            
            eklenecekalan.setTextContent("");
            eklenecekalan.appendChild(signature.getElement());
    
            // 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
            signature.addKeyInfo(cert);
    
            // use enveloped signature transform
            Transforms transforms = new Transforms(context);
            transforms.addTransform(new Transform(contextTransformType.ENVELOPED.getUrl()));
            signature.addDocument(""nulltransformsDigestMethod.SHA_256nullfalse);
    
            //signature.addKeyInfo(new ECertificate(cert.getEncoded()));
    
            //add signer role information
            SignerRole rol = new SignerRole(context, new ClaimedRole[]{new ClaimedRole(context"Tedarikçi")});
            signature.getQualifyingProperties().getSignedSignatureProperties().setSignerRole(rol);
    
            signature.setSigningTime(Calendar.getInstance());
            //e-fatura standards want signatureID to be same with cbc:URI
            // get signatureID from e-fatura
            String signatureID = ((Element)(dosya.getDocumentElement().getElementsByTagName("cbc:URI").item(0)) ).getTextContent();
            String signatureIDwoNumberSign signatureID.substring(1);
            Element dsSignature = (Element)(dosya.getDocumentElement().getElementsByTagName("ds:Signature").item(0));
            dsSignature.setAttribute("Id"signatureIDwoNumberSign);
            dsSignature.setAttribute("xmlns:ds""http://www.w3.org/2000/09/xmldsig#");
            Element xadesQualifyingProperties = (Element)(dosya.getDocumentElement().getElementsByTagName("xades:QualifyingProperties").item(0));
            xadesQualifyingProperties.setAttribute("Target""#"+signatureIDwoNumberSign);
            xadesQualifyingProperties.setAttribute("xmlns:xades""http://uri.etsi.org/01903/v1.3.2#");
            
            // add signing time
            signature.getSignedInfo().setCanonicalizationMethod(C14nMethod.INCLUSIVE_WITH_COMMENTS);        
            signature.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);
    
            
            // now sign it by using smart card
            signature.sign(SmartCardManager.getInstance().getSigner(PINcert));
    
            /* Seri İmza */
            if(SeriImza == true)
            {
                XMLSignature counterSignature signature.createCounterSignature();
                counterSignature.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);
                counterSignature.addKeyInfo(new ECertificate(cert.getEncoded()));  
                counterSignature.sign(SmartCardManager.getInstance().getSigner(PINcert));
            }
            
            /* Dosyaya Yaz */
            if(DosyaCikti == true)
            {
                Source source = new DOMSource(dosya);
                Transformer transformer TransformerFactory.newInstance().newTransformer();
                transformer.transform(source, new StreamResult(new FileOutputStream(GelenDosya)));    
                System.out.println("İmzalandı...");
            }
            else
            {
                DOMSource domSource = new DOMSource(dosya);
                StringWriter writer = new StringWriter();
                StreamResult result = new StreamResult(writer);
                TransformerFactory tf TransformerFactory.newInstance();
                Transformer transformer tf.newTransformer();
                transformer.transform(domSourceresult);
                System.out.println(writer.toString());
            }
            
            /* Karttan çıkış yapılıyor */
            SmartCardManager.getInstance().logout();
            
        } catch (Exception e) {
            System.out.println("------------------------------");
            System.out.println("Hata Oluştu !");
            e.printStackTrace();
            System.out.println("------------------------------");
            System.out.println("PHP Kullanımı:");
            System.out.println("exec(\"java -Dfile.encoding=UTF8 -jar java_jar_dosyasi {imzalanacak_xml,smart_card_pin,seri_imza_true_veya_false,dosyaya_kaydet_true_veya_false} 2>&1\", javadan_donen_deger);");
            System.out.println("exec(\"java -Dfile.encoding=UTF8 -jar C:\\BulunduguDizin\\NTGEFatura.jar {C:\\BulunduguDizin\\OrnekFatura.xml,123456,false,true} 2>&1\", $cikti);");
            System.out.println("------------------------------");
        }
    }

}


Bu java sınıfını çalıştırabilmek için yukarıda da bahsettiğim gibi bir Jar dosyası haline getirmek gerekiyor, jar dosyası haline getirilen bu sınıf PHP ile bu şekilde kullanılabilir :

Kod Çizelgesi:[Hepsini Seç] 
/* Smart Kart Fatura İmzalama */
    function Imzala($java_dosyasi$fatura_dosyasi$pin=null$seriImza=false$dosyayaKaydet=true)
    {
        /* Java Dosyasına Veri Yollanıyor */
        if($pin != null)
        {    
            exec("java -Dfile.encoding=UTF8 -jar $java_dosyasi {$fatura_dosyasi,$pin,$seriImza,$dosyayaKaydet} 2>&1"$cikti);
            
            
            $sonuc $cikti;
            
            foreach ($cikti AS $ciktiDeger)
            {
                if(strstr($ciktiDeger'İmzalandı...') == true)
                {
                    $sonuc true;
                    break;
                }
            }
            
            return $sonuc;
        }
    }
    /* Smart Kart Fatura İmzalama */

    $dizin = (__DIR__ DIRECTORY_SEPARATOR);
    $java_dosyasi=$dizin."Java/NTGEFaturaImza.jar";
    $fatura_dosyasi='TemelFaturaOrnegi.xml';
     $pin '123456';

    $cikti Imzala($java_dosyasi$fatura_dosyasi$pin);

    if($cikti == true) echo 'İmzalandı...';
    else echo 'Hata Oluştu...';


PHP ile tek yapmanız gereken exec fonksiyonu ile Java sınıfına gerekli dosya, pin ve ayarları yollamak. Java sınıfına gönderilen PİN kodu Akis cihazınızın pin kodu olmalı. Bu saydıklarımın dışında eğer kullanıcı oluşturma ve silme xml dosyalarını imzalayacaksanız seri imzayı aktif ederek çift imza atabilirsiniz. Son olarak dosyaya kaydet veya ekrana yazdır seçeneğini belirtmeniz gerekiyor, bu son ayar varsayılan olarak okuduğu dosyayı imzaladıktan sonra üzerine yazmaya ayarlıdır.

Tüm dosyaları indirmek için bu bağlantıya tıklayın: http://github.com/3zRasasi/PHP-E-Fatura-Imzalama-Araci
Yorumlar  (Toplam: 40) Sıralama:
Avatar
Adem 23.08.2017-00:45:38
Eline sağlık, arayıp bulamayanların çok işine yarayacak.
Avatar
Mert Deniz 15.01.2019-10:26:34
Hata Oluştu !
java.lang.IndexOutOfBoundsException: Indexed access out of bounds: 1, 1
        at java.util.Objects.outOfBounds([email protected]/Objects.java:365)
        at java.util.Objects.checkIndex([email protected]/Objects.java:436)
        at java.util.Objects.checkIndex([email protected]/Objects.java:388)
        at java.util.ArrayList.get([email protected]/ArrayList.java:435)
        at ntg.bls.anadosya.main(anadosya.java:58)

bu şekilde bi hata veriyor ?
Avatar
ByLegenS 23.01.2019-13:24:28
php exec alanından yolladığınız verileri kontrol edin, ne fazla ne eksik veri yollamayın.
Avatar
bumblebeey 01.02.2019-12:11:02
bir çok kodda değişiklik yapmam gerekti. ayrıca javanın kendi yöntemi ile javacla ve sadece belirli bi versiyonda çalışıyor. sonucda çalıştırdım teşekkürler
genel konularda sormam gereken bi kaç konu var yardımcı olurmusunuz ? kodla alakalı değil
Avatar
ByLegenS 01.02.2019-15:43:39
Eğer cevaplayabileceğim konularsa tabii ki istediğinizi sorabilirsiniz.
Avatar
bumblebeey 01.02.2019-23:12:38
Sanirim efatura earsivi dogrudan entegrasyon yontemi ile kullaniyosunuz. Posta kutusu icin gib in istedigi webservisi nasil hallettiniz? Daha var ama cozemedigim konu bu su an acil olarak
Avatar
ByLegenS 04.02.2019-13:33:25
Bunun için bir Soap sunucu hazırlamanız lazım zaten GİB'e kayıt olurken sizden hangi adres üzerinden bağlantı kuracağınız ve hangi adrese GİB'in bağlantı kuracağı soruluyor.
Avatar
bumblebeey 05.02.2019-21:59:55
Peki diger ornekleriniz gibi nu sunucununda bir ornegi varmi?
Avatar
ByLegenS 11.02.2019-09:07:21
Bununla ilgili birkaç gün içinde bir makale hazırlamayı planlıyorum.
Avatar
bumblebeey 06.02.2019-18:11:57
hocam günlerdir bununla uğraşıyorum. imzalama gönderme işlemleri tamam webservis oluşturma noktasında tıkandım kaldım. anladığım kadarıyla efatura paketinin içindeki wdsl dosyalarını bi şekilde kullanabiliyoruz . ama nasıl, yardımcı olursan büyük bi sıkıntıdan kurtarırsın beni
Avatar
ByLegenS 11.02.2019-09:13:13
Aslında E-Fatura hazırlayıp göndermekle alakalı hazırlanan kılavuzlarda bu işlemler detaylıca anlatılmış, tek eksik olan örnekler. Elbette elimden geldiğince yardımcı olmaya çalışırım, kısmetse yakın zamanda yeni örnekler paylaşırım.
Avatar
bumblebeey 13.02.2019-18:00:36
şu an gerçekten büyük bir sorun yaşıyorum
dosyanın imzalanmadan önceki ns taglarında
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

bu var ama imzaladıktan sonra bunu otomatikman siliyor ?
we gib kabul etmiyor doğal olarak şema hatası veriyor
Avatar
ByLegenS 13.02.2019-21:40:16
Paylaştığım aracı olduğu gibi kullanıyorsanız böyle bir şey yapmaması lazım, GİB'in kabul etmemesi genelde dosyaların sonradan bozulmasından kaynaklanır, imzaladığınız faturaları "E-Fatura Görüntüleyici" ile görüntülediğiniz zaman sorunun ana sebebini uyarılar halinde size bildirir. Sunucu ile alakalı sorularınız vardı, yeni bir makale paylaştım, bu linkten inceleyebilirsiniz: https://yucelkahraman.com.tr/php-ile-e-fatura-soap-sunucu-olusturma-islemi.html
Avatar
bumblebeey 13.02.2019-23:52:54
Xml dosyasini imzalamadan ve imzaladiktan sonra karsilastiriyorum sadece o satiri siliyor geri kalana dokunmuyor , xmlns:xsi yi siliyor ama xsi:schemalocation a dokunmuyor . Main javadan eklemeye calistim ama bir turlu eklemedi xmlns:xsi olmadanda sema dogrulamasindan gecmiyor. Kontrol etme sansin varmi?
Avatar
ByLegenS 14.02.2019-01:31:26
İmzalama işlemini Java ile mi yapıyorsunuz? Eğer Java ile yapıyorsanız yukarıda paylaştığım Java sınıfı ile karşılaştırmayı deneyin, aynı veya benzer olmasına dikkat edin.
Avatar
bumblebeey 14.02.2019-09:40:00
sorunun kaynağını buldum. biz komple zarf oluşturuyoruz, <sh:StandardBusinessDocument ile başlıyor zarf.
bunun içerisinden sadece inavoice tagını ayrıştırıp imzalatırsam sorun cıkartmıyor, ama dosyada olmayan oluşturulmuş veriyi nasıl imzalatabiliriz ?
Avatar
ByLegenS 14.02.2019-10:49:41
İlk olarak Faturayı oluşturup imzalamanız lazım, daha sonra imzalanan veriyi Zarf içerisine yerleştirip Zip ile sıkıştırmanız lazım. Zaten GİB'in vermiş olduğu E-Fatura Görüntüleyici sadece fatura halinde yüklenen XML dosyalarını kontrol eder, zarflanmış veriyi ayrıştıramaz.
Avatar
bumblebeey 14.02.2019-11:15:24
şimdi sorunum şu java ya dosyayı gönderiyoruz filepath yani.   ama benim herşey veri tabanında yani faturalar dosya olarak tutulmuyor. zarf hali tutuluyor sadece, gibe gönderirlen zarf bazında hazırlanıyor. javaya dosya olmadan imzalatmam lazım ne önerirsin ?
Avatar
ByLegenS 14.02.2019-13:17:17
Yapacağınız işlem veritabanında sakladığınız veriyi çağırıp, eğer bu veri Zip halindeyse bunu önce bir dosya olarak kaydetmek, eğer Zip halinde değilde sadece XML verisi ise bunu PHP ile ayrıştırarak içindeki tüm Faturaları bir dizi değişkene aktarmak, daha sonra bu dizi değişkende yer alan Faturaları tek tek Java ile imzalayarak başka bir dizi değişkene aktarmak. İşlem bittiği zaman imzalanan Faturaları tekrar zarf içerisine yerleştirerek veritabanına kaydetmek. Size önerebileceğim yol bu olabilir.
Avatar
bumblebeey 14.02.2019-13:49:43
tamam invoice kısmını ayırabiliyorumda senin java sadece dosya ile calışıyor ?
Avatar
ByLegenS 14.02.2019-15:05:16
Diziye kaydettiğiniz Faturaları döngü ile imza.xml olarak kaydedin ve ardından Java dosyasına yollayın, imzalanan Faturaları okuyarak yeni bir diziye kaydedin ve sıradaki Faturaya geçin, Java dosyasına başka türlü veri yollamanızın yolu yok, çünkü PHP exec fonksiyonuna bütün dosya içeriğini text olarak giremezsiniz, Java dosyası bunun için uygun değil.

Örnek:

Kod Çizelgesi:[Hepsini Seç] 

$ImzalananFaturaDizisi = array();

if((is_array($FaturalarDizisi)) AND (count($FaturalarDizisi) > 0))
{
    foreach($FaturalarDizisi as $Fatura) {
        
        if(file_exists('imza.xml')) unlink('imza.xml');
        
        file_put_contents('imza.xml'base64_decode($Fatura));
        exec("java -Dfile.encoding=UTF8 -jar NTGEFaturaImza.jar {imza.xml,123456,false,true} 2>&1"$cikti);
        
        $sonuc false;
        foreach ($cikti AS $ciktiDeger) {
            if(strstr($ciktiDeger'İmzalandı...') == true) {
                $sonuc true;
                break;
            }
        }
        
        if($sonuc == true) {
            $veri = new DOMDocument();
            $veri->load('imza.xml');
            $xpathX = new DOMXPath($veri);
            $nodeAlani $xpathX->query("//*");
            
            $ImzalananFaturaDizisi[] = base64_encode($veri->saveXML($nodeAlani->item(0)));
        }
    }
}
Avatar
bumblebeey 14.02.2019-17:48:39
hocam zarfdan cıkarıp tekrar zarfa ekleyince imza bozuluyor
dsSignature.setAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#");
javadaki bu alana
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
bunu ekletsem sorun kalmıcak
ama nedense hiç bi şekilde eklemiyor
Avatar
ByLegenS 15.02.2019-09:11:01
İmzalanmamış veriyi zarftan çıkartıp imzalayarak tekrar zarfa ekleme işlemi imzayı bozmaz, çünkü imza zarfı kapsamamaktadır, imza sadece Fatura bölümünü kapsamaktadır, imzalanan Faturaya sonradan bir şey ekleme ya da çıkarmaya veya sırasını değiştirmeye çalışırsanız o zaman imza geçersiz olur, şunu unutmayın fazladan boş bir satır bile olsa imza geçersiz kalır. Mutlaka gözünüzden kaçan başka bir şey vardır, kafanızı toparlayıp baştan her şeyi kontrol etmenizde fayda var.
Avatar
bumblebeey 08.03.2019-18:01:37
hocam bi şekilde fatura imzalamayı çözdüm. bu java aracı ile giden POSTBOXENVELOPE ( Kabul-Red) cevaplarınıda imzalayabilirmiyiz ?
Avatar
ByLegenS 08.03.2019-21:09:26
Evet normal fatura imzalar gibi imzalayabilirsiniz.
Avatar
EsEs 02.12.2019-23:39:46
Merhaba,
İmzalama işlemi için mali mühürün USB olarak sunucuda takılı mı olması gerekiyor. USB içerisindeki sertifikayı sunucuya alarak bir şekilde imzalama şansımız yok mudur? Sunucu veri merkezinde, imza ofiste.
Avatar
ByLegenS 04.12.2019-09:14:15
Merhaba,
Eğer bu yöntemi kullanırsanız ya USB'nin sunucuda takılı olması gerekiyor veya kendiniz bir soket yazıp onu kullanmalısınız, eğer USB soket kullanmayı düşünüyorsanız bu yazımı inceleyebilirsiniz : https://yucelkahraman.com.tr/ntgfatura-socket-imzalama-araci.html
Avatar
said 02.01.2020-11:55:30
Hocam merhabalar,
Yazınız için teşekkürler, resmen amme hizmeti yapmışsınız.
İmza ile alakalı bir sorum olacak , mümkünse cevaplarsanız sevinirim.
Fatura imzalama yapabiliyorum. Zaten direk kodu kamusm paylaşmış :
https://yazilim.kamusm.gov.tr/esya-api/doku.php?id=esya:xades:kod-e-fatura
Benim problemim counterSignature ile alakalı. Aslında counterSignature da atıyorum, imzager doğruluyor. Ancak GIB kullanıcı açma-silme formları için counterSignature alanında Transform istiyor. Linkteki gibi efaturaya ekler gibi transform alanını ekliyorum, bu sefer imza bozuluyor imzager doğrulamıyor.
Muhtemelen transform alanına bi Id vermem gerek ama
sanırım onun için de ilk imzada bazı şeyleri değiştirmem gerekiyor.
Çözemedim bir kaç gündür.
Ayrıca ben ilk imza atılmış xml'e counterSignature atıyorum.
Kime verdiğim Id'yi kimde kullanmam gerekiyor, cevap verebilirseniz çok makbule geçer.
Teşekkürler
Said


Avatar
ByLegenS 03.01.2020-00:44:36
Sorununuzun Id ile alakalı olduğunu düşünmüyorum, mutlaka gözden kaçırdığınız bir nokta olmalı, Id gibi verileri kütüphane kedisi otomatik olarak ekliyor, transform ekleme sıralamasına dikkat edin, bazı alanların bazı alanlardan önce eklenmesi veya sonra eklenmesi gerekebilir, eğer böyle bir durum varsa imza tamamen geçersiz kalabilir, bu gibi durumlara dikkat edin.
Avatar
said 21.01.2020-10:17:12
Sorunum Id ile alakalı değilmiş.
.Net ile yazdığım için esya api yazılımdan ona göre kütüphaneleri indirmiştim.
Her şeyi denemiş olmak için java ile yazayım dedim. Aynı kodu döndüm java ile yazdım ve oldu.
.Net kütüphanelerini kullanınca sanırım ekstra kod yazmak gerekiyor. Javada yazıp jar olarak aldım.
O şekilde kullanıyorum
İlgi ve alakanız için teşekkür ederim.
Said
Avatar
ByLegenS 24.01.2020-16:48:28
Merhaba,

Sorunu çözmüş olmanıza sevindim, bilgi verdiğiniz içinde ayrıca teşekkür ederim, başkaları için çözüm olabilir.
Avatar
oguzhan 07.01.2020-09:28:22
Merhaba Yucel hocam efatura imzalama dosyasi olan example.java dosyasinin jar hali mevcut mudur. Php icinde kullanmak istiyorum ama jar dosyasi da olmadigi icin islem yapamiyorum. Konu hakkinda yardimci olabilirseniz sevinirim.
Avatar
ByLegenS 13.01.2020-09:12:23
Merhaba NTGEFaturaImza.jar dosyasını kullanmanız gerekiyor.
Avatar
Mehmet YILFIZ 21.01.2020-20:54:53
Uzun süredir elektronik imza ile uğraşıyorum. PHP ile yaptığım bir yazılımda pdf olarak rapor alıyorum bunu elektronik olarak imzalamam lazım. Bu paylaşımınız ile bunu yapabilir miyim ?
Avatar
ByLegenS 24.01.2020-16:44:51
Merhaba,

PDF ile ilgili bir çalışmam olmadı ama çok bir fark olacağını sanmıyorum.
Avatar
turgut kalfaoglu 16.04.2020-16:01:20
Ben de PHP de birşey yazıp TASLAK fatura üretmeye çalışıyorum.
Acaba bunun için e-fatura portalının sağladığı bir API falan var mı?
Çok teşekkürler..
Avatar
ByLegenS 06.05.2020-22:33:52
PHP için hazır bir şey bulmanız çok zor.
C# vs. var ama PHP için bildiğim yok.
Avatar
Sema Urek 08.06.2020-22:51:43
Merhaba,
Yukarıda kullanılan kod içinde KeyValue üretecek rutin hakkında bilginiz var mı, yani aşağıdaki XML üretilecek
<ds:KeyValue><ds:RSAKeyValue><ds:Modulus>.....</ds:Modulus><ds:Exponent>AQAB</ds:Exponent></ds:RSAKeyValue></ds:KeyValue>

Teşekkürler
Avatar
ByLegenS 15.06.2020-05:01:45
Merhaba,
Maalesef bilgim yok, size tavsiyem bu sayfadaki dökümanları inceleyin : https://yazilim.kamusm.gov.tr/esya-api/doku.php?id=start
Yorum Yaz
Onay Kodu .
 
Yücel KAHRAMAN