Ben konuyu paylaştığım zamanlarda sorunu php tarafında çözmüştüm yalnız ben kullanıcı id bilgisini bildiğim için giriş yaptıktan sonra direk istek attırıyorum.
Aşağıdaki kodlar oturum açmak için.
$parasut_login = curl_init();
curl_setopt($parasut_login, CURLOPT_URL, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_REFERER, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($parasut_login, CURLOPT_RETURNTRANSFER, true);
curl_setopt($parasut_login, CURLOPT_COOKIEJAR, "parasut.txt");
curl_setopt($parasut_login, CURLOPT_COOKIEFILE, "parasut.txt");
preg_match_all('<input type="hidden" name="authenticity_token" value="(.*?)">', curl_exec($parasut_login), $authenticity_token);
curl_setopt($parasut_login, CURLOPT_URL, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_REFERER, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt_array($parasut_login, [
CURLOPT_USERAGENT => "https://uygulama.parasut.com/kullanici-girisi",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"],
CURLOPT_POST => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_POSTFIELDS => [
'authenticity_token' => $authenticity_token[1][0],
'user[email]' => '[email protected]',
'user[password]' => '****',
'user[remember_me]' => '0',
'commit' => 'OTURUM AÇ'
],
CURLOPT_COOKIEFILE => 'parasut.txt'
]);
curl_exec($parasut_login);
Aşağıdaki kodlar da satış faturalarını listelemek için...
$kid = 11111;
curl_setopt($parasut_login, CURLOPT_URL, "https://api.parasut.com/v4/$kid/sales_invoices?filter%5Barchived%5D=false&filter%5Brecurring%5D=false&filter%5Bquery%5D=&filter%5Bsharing_status%5D=&filter%5Bpayment_status%5D=&filter%5Bprint_status%5D=&filter%5Bissue_date%5D%5Bgteq%5D=" . date('Y-m-d', strtotime($donem)) . "&filter%5Bissue_date%5D%5Blteq%5D=" . date('Y-m-t', strtotime($donem)) . "&filter%5Bitem_type%5D=invoice%2Crefund%2Cestimate%2Cexport&filter%5Bcategory%5D=&filter%5Btag_ids%5D=&include=category%2Ctags%2Ccontact%2Cactive_e_document%2Cfailed_e_invoice&order_scope=order_by_remaining_desc&page%5Bnumber%5D=1");
curl_setopt_array($parasut_login, [
CURLOPT_USERAGENT => "https://uygulama.parasut.com/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"],
CURLOPT_POST => false,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_MAXREDIRS => 0,
CURLOPT_COOKIEFILE => 'parasut.txt'
]);
$result = json_decode(curl_exec($parasut_login), true);
Bir de çerezler konusunda COOKIEFILE
ve COOKIEJAR
kullanmaya gerek var mı emin değilim?
Ben şimdi interaktif ve defter beyan için oturum açma veri çekme ile ilgili uygulama yapmaya çalışıyorum oturum kapatma aşamasına kadar kullanmıyorum.
Sanırsam curl_close()
kullanıldığı zaman gerek duyuluyor.
@alihan hangi konuda nodejs mi yoksa php mi?
Teşekkür ederim fakat çalışmadı. Ama ben çözümünü buldum. Har değerlerini kontrol ettim postData.mimeType değeri json belirtilmiş.
Ben text belirtmeme rağmen yanlış yöntemle gidiyormuş.
CURLOPT_HTTPHEADER => array("content-type: application/json")
yapınca veriler geldi.
{
"postData": {
"mimeType": "application/json; charset=UTF-8",
"params": [],
"text": "21541265-45ce-4064-b2ab-a98107857398"
}
}
Yalnız başlık bilgilerini dizi olarak alabilmem mümkün mü?
HTTP/1.1 200
Set-Cookie: JSESSIONID=63D6B8E04778547F25B3ABBB20B5E94D; Path=/; HttpOnly
Server-Time: 1658310818544
Token: **************
Content-Type: application/json;charset=UTF-8
Content-Length: 133
Date: Wed, 20 Jul 2022 09:53:38 GMT
@thenerepe teşekkürler. Yalnız !, *3 gibi tetikleyici kullanıldığında önizleme çalışmıyor.
C:\users\KullaniciAdi\Appdata\Roaming\Code\User\snippets\
konumunda html.json
adlı json dosyası yoksa oluşturup aşağıdaki gibi örnekte olduğu gibi değerler girerseniz.
İhtiyacınız olduğunda prefix değerini yazarak tetikleyici kullanarak otomatik kod oluşturabilirsiniz.
"!jquery": {
"prefix": "!jquery-jsdelivr",
"body": [
"<script src=\"https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js\"></script>"
]
}
php için php.json
"php": {
"prefix": "php",
"body": [
"<?php",
"\t$1",
"?>"
],
"description": "php tag"
},
"!php-mysqli-connect": {
"prefix": "!mysqli-connect",
"body": [
"mysqli_connect(\"localhost\", \"user\",\"password\",\"dbName\")"
],
"description": "MySqli Connect Line"
},
"!php-mssql-connect": {
"prefix": "!mssql-connect",
"body": [
"sqlsrv_connect($$serverName, ['Database' => $$database, 'UID' => 'zirvenet', 'PWD' => 'zrvsql', 'CharacterSet' => 'UTF-8']);"
],
"description": "MsSqli Connect Line"
}
javascript için javascript.json
"arrowA": {
"prefix": "arrowA",
"body": [
"() => {",
"\t$1",
"}"
]
},
"ConsoleLog": {
"prefix": "csl",
"body": [
"console.log($1);",
]
}
"&fn=" + "istekadi"
sana kalmış ek bilgi göndermek istersen diye ekledim. Zamanında bu konuda takılmıştım. Belki lazım olur eklemek istedim.
$.post("post.php", $("form").serialize() + "&fn=" + "istekadi", (response)=>{
console.log(res);
},"json") // "xml", "html", "text"
Sen sorgulama sonrası oluşan "tabloyu dışarı aktar > Csv for MS Excel" seçeneği ile mi alıyorsun?
Eğer böyle aktarıyorsan csv dosyasının içine değerler metin olarak "100.4" şeklinde yazılıyor. Metin olarak saklandığı için de metin olarak görünür.
Aslında sistemde verü türü sayı, ondalık olanları otomatik sayı olarak saklayıp indirmesi daha mantıklı olurdu.
Excel ile açtıktan sonra sayısal sütunları seç Ctrl+H ile noktaları virgüle çevir.
Aşağıdaki kodları bir php sayfasına yapıştır.
$xmlDom->loadXML(file_get_contents("xmlFile.xml"));
Dosyayı sistemine kaydettirdiğin için
Xml dosyasının konumunu da atayabilir veya hazır xml dosyasının adını da yazıp deneyebilirsin...
Sonra kodları analiz edip gerisini kendin çözümlersin.
<table>
<thead>
<tr>
<th>
Miktar
</th>
<th>
Mal Hizmet Adı
</th>
<th>
Tutar
</th>
</tr>
</thead>
<tbody>
<?php
// XmlGird kullandığında bir değere Show Xpath ile konumunu aldığında '/Invoice/cac:InvoiceLine[1]/cac:Item/cbc:Name'
// ('//cac:InvoiceLine/cac:Item/cbc:Name')->item($key) yapmalısın aksi durumda değere ulaşamıyorsun.
$xmlDom = new DOMDocument();
$xmlDom->preserveWhiteSpace = false;
$xmlDom->loadXML(file_get_contents("xmlFile.xml"));
$xpath = new DOMXPath($xmlDom);
$invoiceLine = @$xpath->query('//cac:InvoiceLine');
foreach ($invoiceLine as $key => $val) {
$invoiceLine = [
"ID" => @$xpath->query("//cac:InvoiceLine/cbc:ID")->item($key)->nodeValue,
"InvoicedQuantity" => @$xpath->query("//cac:InvoiceLine/cbc:InvoicedQuantity")->item($key)->nodeValue,
"LineExtensionAmount" => @$xpath->query("//cac:InvoiceLine/cbc:LineExtensionAmount")->item($key)->nodeValue,
"ItemName" => @$xpath->query("//cac:InvoiceLine/cac:Item/cbc:Name")->item($key)->nodeValue,
"ItemID" => @$xpath->query("//cac:InvoiceLine/cac:Item/cac:SellersItemIdentification/cbc:ID")->item($key)->nodeValue,
"Price" => @$xpath->query("//cac:InvoiceLine/cac:Price/cbc:PriceAmount")->item($key)->nodeValue,
];
$tr = "<tr><td>$invoiceLine[LineExtensionAmount]</td><td>$invoiceLine[ItemName]</td><td>$invoiceLine[Price]</td></tr>"
?>
<?= $tr ?>
<?php
}
?>
</tbody>
</table>
Arkadaşım anladığım kadarı ile faturanın xml dosyasını post ediyorsun ve php tarafına yorumlatıyorsun.
Eğer veritabanına kaydetmen ve sunucu tarafında kullanman gerekmiyorsa php kullanmana gerek yok.
Jquery kütüphanesini kullanarak Javascript ile çözebilirsin çünkü ben yapmıştım.
https://tr-sherlock.com/earsivxml adresinden xml dosyalarını tablo haline getirtiyorum. JS Kodlarını inceleyebilirsin.
Sitemdeki uzun zaman önceydi ama aydınlatıcı olur. Yerelde kullandığım Js kullandıkça biraz daha gelişti diyebilirim :)
İlle de php ile yapacağım dersen ben 5000/30000 bin portalından fatura sorgulama ve gelen arşiv dosyasının içindeki xml dosyasının adını değiştirerek indirmek istiyordum.
İki hafta önce araştırmalarım sonucu çözdüm. @munzevi arkadaşımızın dediği gibi new DOMDocument()
ve ek olarak new DOMXPath($xmlDom)
sınıflarını kullanabilirsin.
DOMXPath
ise javascript xpath = div > input
gibi kullanmanı sağlar. DOMXPath
kullanımı ise div/input
//cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="VKN"]
bir de bunu yazmakla uğraşmaman için
xmlgird.net adresinden Open File kullanarak xml dosyasındaki bilgilere ulaşabilirsin.
$uniqeZip = uniqid() . ".zip"; // Geçici dosya adı oluşturur.
$zipResource = fopen($uniqeZip, "w"); // Dizine geçici dosya oluşturur.
$zip_curl = curl_init($_POST["downUrl"]); // 5000/30000 portalındaki faturaya ait bağlantı alınır.
curl_setopt($zip_curl, CURLOPT_FILE, $zipResource); // Curl calıştırıldığında geçici dosyaya yazılır.
$page = curl_exec($zip_curl);
if (!$page) {
echo "Error :- " . curl_error($ch);
}
curl_close($zip_curl);
$zip = new ZipArchive;
if ($zip->open($uniqeZip) === TRUE) {
$xmlFile = $zip->getFromIndex(1)); // Arşiv dosyasında indexine göre 0.html 1.xml
$fatura = [];
$xmlDom = new DOMDocument();
$xmlDom->preserveWhiteSpace = false;
$xmlDom->loadXML($xmlFile);
$xpath = new DOMXPath($xmlDom);
$fatura["ID"] = $xpath->query('//cbc:ID')->item(0)->nodeValue;
$fatura["saticiVKN"] = @$xpath->query('//cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="VKN"]')->item(0)->nodeValue;
$fatura["saticiTCKN"] = @$xpath->query('//cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="TCKN"]')->item(0)->nodeValue;
$fatura["aliciVKN"] = @$xpath->query('//cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="VKN"]')->item(0)->nodeValue;
$fatura["aliciTCKN"] = @$xpath->query('//cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="TCKN"]')->item(0)->nodeValue;
$aliciVKN = $fatura["aliciVKN"] == null ? $fatura["aliciTCKN"] : $fatura["aliciVKN"];
$saticiVKN = $fatura["saticiVKN"] == null ? $fatura["saticiTCKN"] : $fatura["saticiVKN"];
// echo json_encode([
// "xmlName" => "@$saticiVKN@$fatura[ID]@$aliciVKN.xml",
// "xmlString" => $xmlFile
// ]);
$zip->close();
} else {
echo 'failed';
}
unlink($uniqeZip);
#YUKARIDAKİ KODLAR LAZIM OLURSA KULLANIRSI
// XmlGird kullandığında bir değere Show Xpath ile konumunu aldığında '/Invoice/cac:InvoiceLine[1]/cac:Item/cbc:Name'
// ('//cac:InvoiceLine/cac:Item/cbc:Name')->item($key) yapmalısın aksi durumda değere ulaşamıyorsun.
$invoiceLine = @$xpath->query('//cac:InvoiceLine');
forEach($invoiceLine as $key=>$val) {
print_r([
"ID"=> @$xpath->query("//cac:InvoiceLine/cbc:ID")->item($key)->nodeValue,
"InvoicedQuantity"=> @$xpath->query("//cac:InvoiceLine/cbc:InvoicedQuantity")->item($key)->nodeValue,
"LineExtensionAmount"=> @$xpath->query("//cac:InvoiceLine/cbc:LineExtensionAmount")->item($key)->nodeValue,
"ItemName" => @$xpath->query("//cac:InvoiceLine/cac:Item/cbc:Name")->item($key)->nodeValue,
"ItemID" => @$xpath->query("//cac:InvoiceLine/cac:Item/cac:SellersItemIdentification/cbc:ID")->item($key)->nodeValue,
]);
}
@recepkaramanli61
Öncelikle ilginiz için teşekkür ederim. Şu anda dediğiniz gibi kullanıyorum.
Böyle cevap bulmanız biraz zor. Sistem bağlanamıyorsa bir sebebi vardır ve hata mesajı vermiştir. Onu da paylaşmanızda yarar var.