Türkiye'nin lider e-Dönüşüm ve özel entegratör kuruluşlarından Uyumsoft için hazırlanmış, sıfır bağımlılığa (zero-dependency) sahip, PHP yerleşik ext-soap eklentisine dahi ihtiyaç duymadan doğrudan cURL + XML protokolü üzerinden haberleşen yeni nesil PHP SDK'sıdır.
Hem insan yazılımcılar hem de AI kodlama asistanları (Gemini, Claude, Cursor, Copilot vb.) için en ideal, tip güvenli (type-safe) ve dayanıklı e-Fatura / e-Arşiv entegrasyon altyapısını sunar.
- Bağımsız SOAP Motoru (
ext-soapİhtiyacı Yok): Sunucularda PHPsoapeklentisinin kurulu veya aktif olmasına gerek duymaz. Doğrudan cURL ve güvenli XML ayrıştırma (DOMDocument/SimpleXML) ile çalışır. - Yerleşik WS-Security (WCF Uyumlu): PHP'nin standart
SoapClientsınıfının desteklemediğiwsse:Security,wsse:UsernameTokenve milisaniye hassasiyetinde UTC Zulu (wsu:Timestamp) başlıklarını otomatik üretir. - UBL-TR 2.1 Fatura Derleyicisi: Gelir İdaresi Başkanlığı (GİB) standartlarına tam uyumlu UBL-TR 2.1 XML belgeleri üretir.
- Hassas KDV & Kuruş Dağılım Algoritması: Kalem bazlı indirimleri, genel sipariş iskontolarını ve kargo bedellerini oran bazlı KDV matrahlarına kuruşu kuruşuna paylaştırır; GİB şematron (schematron) yuvarlama hatalarını tamamen engeller.
- e-Arşiv İnternet Satışı Desteği: GİB e-Arşiv mevzuatının internet satışları için zorunlu kıldığı web sitesi, ödeme aracısı, ödeme türü, ödeme tarihi ve kargo taşıyıcı (VKN, unvan, sevk tarihi) bilgilerini eksiksiz yönetir.
- Akıllı Mükellef & Etiket Tespiti: Vergi kimlik numarasını sorgulayarak alıcının e-Fatura mükellefi olup olmadığını (
IsEInvoiceUser) anında anlar; mükellef ise posta kutusu etiketlerini (GetUserAliasses), değilse e-Arşiv akışını devreye alır. - Mükerrer Fatura Önleyici Ağ Kurtarma (Idempotent Recovery): Ağ kopması veya zaman aşımı anında faturayı körü körüne yeniden göndermek yerine uzaktaki UUID durumunu kontrol eder; mükerrer fatura kesilmesini önler.
- Resmî PDF ve Görsel Çıktı: Base64 ile şifrelenmiş resmî mühürlü PDF ve HTML önizleme çıktılarını tek metotla indirir.
- Kapsamlı Operasyon Kapsamı: Uyumsoft
BasicHttpBinding_IIntegrationWSDL servisinde tanımlı 64 web servis operasyonunun tamamını destekler. - Yerleşik XML Güvenliği: XXE (XML External Entity) ve XML Bomb (Billion Laughs / DoS) saldırılarına karşı ham yanıtı ön filtrelemeden geçirir.
Gerçek e-ticaret ve ERP projelerinde Uyumsoft entegrasyonu yapan yazılımcıların karşılaştığı en kritik problemler ve bu SDK'nın getirdiği çözümler:
- Tuzak: PHP'nin yerel
SoapClientsınıfı WS-Security (wsse:Security,wsse:UsernameToken) standardını doğrudan desteklemez. Harici kütüphaneler kurulmadığında WCF servisiAn error occurred when verifying security for the messageveyaHTTP 500 Internal Server Errordöndürür. - SDK Çözümü: SDK, RFC ve OASIS standartlarına uygun
Timestamp(5 dakikalık geçerlilik, milisaniye ve UTC ZuluZformatı) veUsernameTokenbloklarını cURL zarfında sıfır bağımlılıkla kendisi oluşturur.
- Tuzak: Standart bir UBL-TR XML belgesi kök düğüm olarak
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">taşır. Ancak Uyumsoft'un WCF SOAP servisi,SendInvoiceveValidateInvoiceçağrılarında faturanın iç düğümlerini<tem:Invoice>veya<tem:invoice>altında bekler. Dış<Invoice>etiketi olduğu gibi gönderilirse WCF Deserializer hata verir. - SDK Çözümü:
UyumsoftClient, UBL belgesini bellekte ayrıştırarak kök<Invoice>etiketini ayıklar ve alt elemanlarıxmlns:cacilexmlns:cbcad alanlarıyla güvenle<tem:Invoice>içerisine enjekte eder.
- Tuzak: İnternet üzerinden sipariş alan e-ticaret siteleri e-Arşiv faturası keserken
ProfileID = EARSIVFATURAkullanmak zorundadır. Ancak yalnızca bu profili seçmek yetmez; GİB kurallarına göreInternetSalesInfo(Web adresi, ödeme aracısı, ödeme türü, ödeme tarihi) veShipmentInfo(Kargo firması VKN'si, kargo adı ve sevk tarihi) zorunludur. Aksi halde fatura GİB tarafından reddedilir. - SDK Çözümü:
InternetSalesInfoDatanesnesi bu alanları yapılandırılmış olarak toplar ve SOAP zarfına otomatik ekler.
- Tuzak: Bir faturada satır iskontoları ve sipariş geneli indirimler dağıtılırken KDV hariç matrah, satır KDV'si ve ödenecek tutar toplamları arasında 0.01 TL (1 kuruş) dahi yuvarlama farkı oluşursa GİB şematron doğrulaması faturayı reddeder.
- SDK Çözümü:
UblInvoiceBuilder, son kaleme kalan kuruş farkını tahsis eden algoritması ve KDV oranlarına göre gruplanmışTaxSubtotalmekanizması ile matematiksel tutarlılığı garanti altına alır.
- Tuzak: Fatura gönderimi esnasında cURL zaman aşımına uğrarsa (örneğin sunucu 30 saniye yanıt vermezse), istek aslında Uyumsoft'a ulaşmış ve kuyruğa alınmış olabilir. Yazılım bunu "hata" sayıp faturayı tekrar gönderirse müşteriye 2 adet fatura kesilir.
- SDK Çözümü: SDK, hata anında faturanın UUID veya
LocalDocumentIdbilgisiylequeryOutboxInvoiceStatusüzerinden uzaktaki durumu doğrulamayı sağlayan bir kurtarma (recovery) şablonu sunar.
- Tuzak: e-Arşiv faturaları Uyumsoft API'si üzerinden
CancelEArchiveInvoicemetoduyla iptal edilebilir. Ancak alıcısına ulaşmış bir e-Fatura API'den doğrudan silinemez. - Doğru Akış: Ticari e-faturalarda alıcı 8 gün içinde portalından veya API'den
SendDocumentResponse(RED) göndermelidir. Temel e-faturalarda ise alıcının iade faturası kesmesi veya harici itiraz (noter, KEP) yoluna başvurulması gerekir.
Kütüphaneyi projenize Composer kullanarak dahil edebilirsiniz:
composer require emirhangungormez/uyumsoftapiComposer kullanmıyorsanız, src/ klasöründeki dosyaları projenize doğrudan require_once ile dahil edebilirsiniz.
<?php
use Uyumsoft\UyumsoftClient;
use Uyumsoft\UyumsoftException;
require_once 'vendor/autoload.php';
$client = new UyumsoftClient([
'username' => 'YOUR_UYUMSOFT_USERNAME',
'password' => 'YOUR_UYUMSOFT_PASSWORD',
'test_mode' => false, // Canlı ortam için false, test için true
'verify_ssl'=> true,
'timeout' => 45
]);
try {
// 1. Bağlantı Testi
$conn = $client->testConnection();
echo "Bağlantı: " . ($conn['success'] ? 'Başarılı' : 'Hatalı') . "\n";
// 2. Firma Profil Bilgileri
$profile = $client->getCompanyProfile();
echo "Unvan: " . $profile['name'] . " | VKN: " . $profile['tax_no'] . "\n";
// 3. Kalan Kontör Bilgisi
$credit = $client->getCustomerCreditInfo();
print_r($credit);
} catch (UyumsoftException $e) {
echo "Hata: " . $e->getMessage();
}Alıcıya fatura kesmeden önce e-Fatura mükellefi olup olmadığını kontrol ederek belge tipini belirleyebilirsiniz:
<?php
use Uyumsoft\UyumsoftClient;
$client = new UyumsoftClient([/* config */]);
$vknTckn = '1234567890';
// 1. E-Fatura kullanıcısı mı?
$isEInvoice = $client->isEInvoiceUser($vknTckn);
if ($isEInvoice) {
echo "Alıcı e-Fatura mükellefidir.\n";
// 2. Posta kutusu (PK/GB) etiketlerini çekme
$aliases = $client->getUserAliases($vknTckn);
$selectedAlias = $aliases[0]['Alias'] ?? 'defaultpk';
echo "Kullanılacak Etiket: " . $selectedAlias . "\n";
} else {
echo "Alıcı e-Fatura mükellefi değildir. e-Arşiv faturası düzenlenecektir.\n";
}
// 3. VKN/TCKN numarasından resmî unvan ve adres çekme
$addressInfo = $client->tryToGetAddressFromVknTckn($vknTckn);
print_r($addressInfo);İnternet satış bilgileri, kargo bilgileri, satır indirimleri ve genel sipariş iskontosu içeren tam teşekküllü e-Arşiv örneği:
<?php
use Uyumsoft\UyumsoftClient;
use Uyumsoft\InvoiceData;
use Uyumsoft\InvoiceItemData;
use Uyumsoft\InvoicePartyData;
use Uyumsoft\InternetSalesInfoData;
use Uyumsoft\UblInvoiceBuilder;
$client = new UyumsoftClient([/* config */]);
// 1. Satıcı Bilgileri
$supplier = new InvoicePartyData(
name: 'ABC E-Ticaret ve Bilişim Anonim Şirketi',
taxNo: '1234567890',
address: 'Büyükdere Cad. No:100 Kat:5',
city: 'İstanbul',
district: 'Şişli',
taxOffice: 'Mecidiyeköy',
email: 'fatura@example.com',
phone: '02125550000'
);
// 2. Alıcı Bilgileri (Nihai tüketici için TCKN=11111111111 kullanılabilir)
$customer = new InvoicePartyData(
name: 'Ahmet Yılmaz',
taxNo: '11111111111',
address: 'Atatürk Caddesi No:15 Daire:3',
city: 'Ankara',
district: 'Çankaya',
email: 'ahmet@example.com',
phone: '05551234567'
);
// 3. Fatura Başlığı
$invoice = new InvoiceData(
supplier: $supplier,
customer: $customer,
documentType: 'eArchive',
invoiceNumber: InvoiceData::generateMockNumber('DKC') // Örn: DKC2026000000001
);
$invoice->localDocumentId = 'SIPARIS-10025'; // Kendi sipariş ID'niz
// 4. Kalemleri Ekleme
$invoice->addItem(new InvoiceItemData(
name: 'Pamuklu Erkek Gömlek Mavi - L',
sku: 'GML-BLU-L',
quantity: 2.0,
unitPrice: 450.00, // KDV Dahil Brüt Birim Fiyat
vatRate: 10.0, // %10 KDV
discount: 50.00 // Kalem İndirimi
));
// 5. Kargo Bedeli Ekleme
$invoice->setShipping(amount: 89.90, vatRate: 20.0, name: 'Kargo Hizmeti');
// 6. Genel Sipariş İskontosu
$invoice->orderDiscount = 50.00;
// 7. GİB İnternet Satış ve Kargo Bilgileri (Zorunlu)
$invoice->setInternetSales(new InternetSalesInfoData(
webAddress: 'https://www.example.com',
paymentMidierName: 'PayTR',
paymentType: 'KREDIKARTI/BANKAKARTI',
paymentDate: new DateTimeImmutable(),
sendDate: new DateTimeImmutable('+1 day'),
carrierTaxNo: '7321640262',
carrierName: 'Sürat Kargo Lojistik Dağıtım A.Ş.'
));
// 8. UBL-TR Derleme & Doğrulama
$builder = new UblInvoiceBuilder();
$built = $builder->build($invoice);
$client->validateInvoice($built['xml']);
// 9. Gönderim
$response = $client->sendInvoice($invoice, $built['xml']);
echo "Fatura Gönderildi!\n";
echo "Fatura No: " . ($response['number'] ?? $invoice->invoiceNumber) . "\n";
echo "Uyumsoft ID: " . $response['id'] . "\n";
echo "Durum: " . $response['status'] . "\n";Kurumsal firmalara kesilen ticari veya temel e-fatura akışı:
<?php
use Uyumsoft\UyumsoftClient;
use Uyumsoft\InvoiceData;
use Uyumsoft\InvoiceItemData;
use Uyumsoft\InvoicePartyData;
$client = new UyumsoftClient([/* config */]);
$receiverVkn = '9876543210';
$aliases = $client->getUserAliases($receiverVkn);
$supplier = new InvoicePartyData('Satıcı A.Ş.', '1234567890', 'Adres...', 'İstanbul');
$customer = new InvoicePartyData(
name: 'Alıcı Holding A.Ş.',
taxNo: $receiverVkn,
address: 'Adres...',
city: 'Bursa',
taxOffice: 'Nilüfer',
alias: $aliases[0]['Alias'] ?? 'defaultpk'
);
$invoice = new InvoiceData($supplier, $customer, documentType: 'eInvoice');
$invoice->profileId = 'TICARIFATURA'; // veya 'TEMELFATURA'
$invoice->addItem(new InvoiceItemData('Sunucu Kabini 42U', 'SRV-01', 1, 15000.0, 20.0));
$result = $client->sendInvoice($invoice);
echo "e-Fatura İletildi. Belge ID: " . $result['id'] . "\n";<?php
use Uyumsoft\UyumsoftClient;
$client = new UyumsoftClient([/* config */]);
$invoiceId = '3fa85f64-5717-4562-b3fc-2c963f66afa6';
// 1. Giden Fatura Durumu
$status = $client->queryOutboxInvoiceStatus($invoiceId);
echo "Durum: " . $status['status'] . " | Fatura No: " . $status['number'] . "\n";
// Olası Durumlar: Queued, Processing, SentToGib, Approved, Declined, Error, Canceled
// 2. Resmî Mühürlü PDF İndirme
$pdfBinary = $client->getOutboxInvoicePdf($invoiceId);
file_put_contents('fatura.pdf', $pdfBinary);
echo "Resmî PDF kaydedildi.\n";<?php
use Uyumsoft\UyumsoftClient;
$client = new UyumsoftClient([/* config */]);
$invoiceId = '3fa85f64-5717-4562-b3fc-2c963f66afa6';
// 1. İptal Etme
$res = $client->cancelEArchiveInvoice(
invoiceId: $invoiceId,
reason: 'Müşteri siparişi kargolanmadan iptal etti.'
);
echo "İptal Sonucu: " . $res['message'] . "\n";
// 2. Yanlışlıkla yapılan iptali kurtarma
// $client->recoverEArchiveCancel($invoiceId);<?php
use Uyumsoft\UyumsoftClient;
$client = new UyumsoftClient([/* config */]);
// Son 7 günün gelen faturaları
$inbox = $client->getInboxInvoiceList(new DateTimeImmutable('-7 days'), new DateTimeImmutable());
// Gelen ticari faturaya Uygulama Yanıtı (RED / KABUL) verme:
$client->sendDocumentResponse(
invoiceId: 'gelen-fatura-uuid',
responseType: 'RED',
reason: 'Faturadaki birim fiyat sipariş şartlarına uymamaktadır.'
);Gerçek dünyada ağ kopmalarında mükerrer fatura kesilmesini engelleyen örnek akış:
<?php
use Uyumsoft\UyumsoftClient;
use Uyumsoft\UyumsoftException;
function sendSafely(UyumsoftClient $client, $invoice, $builder) {
try {
$built = $builder->build($invoice);
return $client->sendInvoice($invoice, $built['xml']);
} catch (UyumsoftException $e) {
// Ağ zaman aşımında önce Uyumsoft'ta fatura oluşmuş mu sorgula
$check = $client->queryOutboxInvoiceStatus($invoice->uuid);
if (!empty($check['status']) && !in_array($check['status'], ['Error', 'NotFound'])) {
// Fatura zaten oluşmuş! İkinci kez fatura kesilmedi.
return ['recovered' => true, 'id' => $check['id'], 'status' => $check['status']];
}
throw $e;
}
}Uyumsoft BasicHttpBinding_IIntegration servisi üzerinde keşfedilen tüm operasyonlar ve bu SDK'daki karşılıkları:
| Kategori | WSDL Operasyon Adı | SDK Metodu / Destek | Açıklama |
|---|---|---|---|
| Sistem & Kimlik | TestConnection |
$client->testConnection() |
Servis erişilebilirliğini test eder. |
WhoAmI |
$client->whoAmI() |
Giriş yapan kullanıcının kimlik detayları. | |
GetCustomerCreditInfo |
$client->getCustomerCreditInfo() |
Kalan e-Dönüşüm kontör/bakiye bilgisi. | |
GetSystemDate |
$client->getSystemDate() |
Sunucu saat ve tarihini döndürür. | |
GetAccessToken / Refresh |
$client->rawCall(...) |
OAuth token yönetimi (REST/SOAP köprüleri). | |
| Mükellef & Alıcı | IsEInvoiceUser |
$client->isEInvoiceUser($vkn) |
VKN/TCKN e-fatura mükellef kontrolü. |
GetUserAliasses |
$client->getUserAliases($vkn) |
Posta kutusu (GB/PK) etiket listesi. | |
TryToGetAddressFromVknTckn |
$client->tryToGetAddressFromVknTckn($vkn) |
VKN'den resmî unvan ve adres çözümleme. | |
FilterEInvoiceUsers |
$client->filterEInvoiceUsers($list) |
Toplu VKN listesini mükelleflere göre filtreler. | |
GetSystemUsersCompressedList |
$client->rawCall(...) |
Tüm mükellef listesini sıkıştırılmış dosya olarak çeker. | |
| Fatura Gönderimi | SendInvoice |
$client->sendInvoice($invoice) |
e-Fatura / e-Arşiv gönderimi. |
ValidateInvoice |
$client->validateInvoice($xml) |
UBL-TR şematron ve XML doğrulaması. | |
SaveAsDraft |
$client->saveAsDraft($invoice) |
Portalda taslak olarak saklar. | |
SendDraft |
$client->sendDraft($id) |
Taslak faturayı gönderime alır. | |
CancelDraft |
$client->cancelDraft($id) |
Taslak faturayı siler. | |
CompressedSendInvoice |
$client->rawCall(...) |
Büyük faturaları GZip ile sıkıştırarak iletir. | |
SubmitInvoicesBatch |
$client->rawCall(...) |
Çoklu toplu fatura gönderimi. | |
RetrySendInvoices |
$client->rawCall(...) |
Hatalı faturaların yeniden denenmesi. | |
| Giden Faturalar | QueryOutboxInvoiceStatus |
$client->queryOutboxInvoiceStatus($id) |
Fatura durumunu sorgular (Approved, Queued vb.). |
GetOutboxInvoiceStatusWithLogs |
$client->getOutboxInvoiceStatusWithLogs($id) |
Detaylı GİB ve sistem hareket geçmişi logları. | |
GetOutboxInvoicePdf |
$client->getOutboxInvoicePdf($id) |
Resmî mühürlü PDF belgesini indirir. | |
GetOutboxInvoiceView |
$client->getOutboxInvoiceView($id) |
Faturanın HTML görsel önizlemesini çeker. | |
GetOutboxInvoice |
$client->getOutboxInvoice($id) |
Giden faturanın UBL XML'ini çeker. | |
GetOutboxInvoiceList |
$client->getOutboxInvoiceList(...) |
Tarih aralığında giden faturaları listeler. | |
GenerateDocumentUrl |
$client->rawCall(...) |
Müşteri için doğrulanabilir belge linki üretir. | |
| e-Arşiv Özel | CancelEArchiveInvoice |
$client->cancelEArchiveInvoice($id) |
e-Arşiv faturasını resmî olarak iptal eder. |
RecoverEArchiveCancel |
$client->recoverEArchiveCancel($id) |
İptal edilen e-Arşivi kurtarır. | |
| Gelen Faturalar | GetInboxInvoiceList |
$client->getInboxInvoiceList(...) |
Gelen e-faturaları listeler. |
GetInboxInvoicePdf |
$client->getInboxInvoicePdf($id) |
Gelen faturanın PDF'ini indirir. | |
GetInboxInvoice |
$client->getInboxInvoice($id) |
Gelen faturanın UBL XML'ini indirir. | |
SendDocumentResponse |
$client->sendDocumentResponse(...) |
Ticari faturaya KABUL veya RED uygulama yanıtı. | |
SetInvoicesTaken |
$client->rawCall(...) |
Faturaları alındı olarak işaretler. | |
| İrsaliye & Diğer | QueueInvoiceFromDespatches |
$client->rawCall(...) |
İrsaliyeden faturalaştırma kuyruğu. |
GetXsltView / SetXsltView |
$client->rawCall(...) |
XSLT görsel şablon yönetimi. |
Note
Yukarıdaki tabloda yer alan veya yer almayan tüm 64 web servis fonksiyonunu $client->rawCall($action, $body) metoduyla doğrudan çağırabilirsiniz.
- XXE (XML External Entity) Koruması:
- SDK, sunucudan dönen yanıtları ayrıştırmadan önce taranır.
<!DOCTYPEveya<!ENTITYifadeleri tespit edilirse işlem anında durdurulur velibxml_disable_entity_loader(true)uygulanır.
- SDK, sunucudan dönen yanıtları ayrıştırmadan önce taranır.
- XML Bomb (Billion Laughs) Savunması:
- Bellek tüketim saldırılarına (DoS) karşı DTD ve dış varlık çözümlemesi engellenmiştir.
- SSL Doğrulaması:
- Canlı ortamda
verify_ssl => trueparametresi zorunlu tutulmalıdır. Devre dışı bırakıldığında SDK sistem loglarına uyarı yazar.
- Canlı ortamda
- Kimlik Bilgisi Güvenliği:
- Uyumsoft API şifrenizi asla Git depolarına (versiyon kontrolüne) göndermeyiniz.
.envortam değişkenleri veya gizli kasa (vault) sistemlerinde muhafaza ediniz.
- Uyumsoft API şifrenizi asla Git depolarına (versiyon kontrolüne) göndermeyiniz.
Bu proje MIT Lisansı ile lisanslanmıştır. Kişisel veya ticari projelerinizde serbestçe kullanabilir, uyarlayabilir ve dağıtabilirsiniz.