Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Ben şu anda klasik ve en temel haliyle basit bir e ticaret isteminin Product kısmı ile ilgileniyorum Ürünler tabloma iki alan eklemem gerekiyo aslında ekleyemez isem bu işi el ile yapmam gerekiyo . sorum şöyle

Her ürününü yukardaki resimdede en başta görüldüğü üzere 19 haneden oluşan bir stok künyesi olur ,Ürün girişi yaparken Ticaret bakanlığından bu ürüne ait bir künye numarası verirler mesela 1000 kilo muz alırken bu 1000 kilo muza ait sadece bir adet 19 basamaklı künye numarası verilir ve bunu migroslara yada şoklara satarken bu stok künye numarasıyla satarız her satığımızdada bir satış künyesi oluşur 1 er kilo satarsam 1000 adet satış künyesi olabilir

web servise laravel ile nasıl bağlanabilirim bir paketmi kullanmalıyım

Bunu çözemez isem çözümü şu önce webdeb satış yapılır sonra masaüstü uygulamadan fatura kesilirken künye alınır yada Hal kayıt sistemini girilip künye temin edilip gelip laraveldeki e ticaret sisteminde ilgili faturaya copy paste yapılır yada ben bu servis nedir onu çözmem nasıl bağlantı yapabilirim bulmam gerekir

    yalcin

    SoapClient kullanarak işlemlerinizi gerçekleştirebilirsiniz:
    https://www.php.net/manual/en/class.soapclient.php

    $client = new SoapClient('https://hks.hal.gov.tr/WebServices/GenelService.svc?wsdl');
    
    $response = $client->BaseRequestMessageOf_IllerIstek([
        'Istek' => 'IllerIstek',
        'Password' => 'password',
        'ServicePassword' => 'service-password' ,
        'UserName' => 'username',
    ]);

    https://hks.hal.gov.tr/WebServices/GenelService.svc?wsdl adresine girdiğinizde size kullanabilir yöntemleri listeler. Mesela üstte yazdığım yöntemi xml çıktıda şu şekilde buldum:

    <xsd:element name="BaseRequestMessageOf_IllerIstek">
    	<xsd:complexType>
    		<xsd:sequence>
    			<xsd:element xmlns:q1="http://schemas.datacontract.org/2004/07/GTB.HKS.Genel.ServiceContract" minOccurs="0" name="Istek" nillable="true" type="q1:IllerIstek"/>
    			<xsd:element minOccurs="0" name="Password" nillable="true" type="xsd:string"/>
    			<xsd:element minOccurs="0" name="ServicePassword" nillable="true" type="xsd:string"/>
    			<xsd:element minOccurs="0" name="UserName" nillable="true" type="xsd:string"/>
    		</xsd:sequence>
    	</xsd:complexType>
    </xsd:element>

    Yöntem adı burada belirtilmiş:
    <xsd:element name="BaseRequestMessageOf_IllerIstek">

    Gönderilecek parametreler ise <xsd:sequence> içinde:

    Burada sizden değer olarak IllerIstek yazmanızı istiyor:

    <xsd:element name="Istek" type="q1:IllerIstek"/>

    xsd:string olanlarda ise siz string değer vereceksiniz:

    <xsd:element name="Password" type="xsd:string"/>
    <xsd:element name="ServicePassword" type="xsd:string"/>
    <xsd:element name="UserName" type="xsd:string"/>

    Bu yöntemlere şu şekilde de ulaşabilirsiniz:

    $client->__getFunctions()

    Ayrıca şöyle bir not var:

    GTB Hal Kayıt sistemi Web servisleri HTTPS protokolü ve Request / Response modeliyle çalışmaktadır.
    Her request içerisinde “UserName”, “Password” ve “ServicePassword” alanlarını içermektedir ve bu
    alanlar zorunlu alanlardır.

    • yalcin

        Seviye 90
      • Düzenlendi

      çok teşekkür ederim .

      saati 3 yaptık ama benim başka vaktimde yok sabah işe gitmeden bunu çözseydim iyiydi 🙂 önce SoapClient notfound hatası aldım sonra ufak bi araştırmayla php.ini deki extension=soap satırının başındaki noktalı virgülü kaldırıp restart edince

      Route::get('/test', function () {
          $client = new SoapClient('https://hks.hal.gov.tr/WebServices/GenelService.svc?wsdl');
      
          $response = $client->BaseRequestMessageOf_IllerIstek([
              'Istek' => 'IllerIstek',
              'Password' => 'password',
              'ServicePassword' => 'service-password' ,
              'UserName' => 'username',
          ]);
      });

      bu şu hatayı veriyor

      SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://hks.hal.gov.tr/WebServices/GenelService.svc?wsdl' : failed to load external entity "https://hks.hal.gov.tr/WebServices/GenelService.svc?wsdl"

      normal chromedan gidince kullabıılabilir tüm yöntemler gözüküyor ama laravel ile dokumantasyondaki adrese ki
      dökümantasyonda bu adres verilmiş https://95.0.51.130/WebServices/GenelService.svc bağlanamıyorum acaba şifre eksik oldugu için olabilirmi ? işyerinde programdan şifreleri almam lazım .

      son bir soru
      https://hks.hal.gov.tr/WebServices/GenelService.svc?wsdl
      dokumantasyonda böyle bir adres yok şu sondaki ?wsdl bir standartmı ?

        • mgsmus

          Seviye 1382
        • Düzenlendi

        yalcin Şu şekilde yapabildim:

        $params =  [
            'stream_context' => stream_context_create([
                'ssl' => [
                    'verify_peer' => false,
                ]
            ])
        ];
        
        $client = new SoapClient('https://hks.hal.gov.tr/WebServices/GenelService.svc?singleWsdl', $params);
        
        return $client->__getFunctions();

        wsdl yerine singleWsdl kullanmak gerekiyormuş. Ayrıca kendim localden bağlanmaya çalıştığımda ssl yüzünden bağlanamadı, 'verify_peer' => false, ekleyerek çözdüm, ssl onaylayamadı, prod ortamında true olarak denemek lazım, onaylaması lazım.

        Kullanılabilir fonksiyonlara da gelince:

        [
          "BaseResponseMessageOf_IllerCevap GenelServisIller(BaseRequestMessageOf_IllerIstek $parameters)",
          "BaseResponseMessageOf_IlcelerCevap GenelServisIlceler(BaseRequestMessageOf_IlcelerIstek $parameters)",
          "BaseResponseMessageOf_BeldelerCevap GenelServisBeldeler(BaseRequestMessageOf_BeldelerIstek $parameters)",
          "BaseResponseMessageOf_UlkelerCevap GenelServisUlkeler(BaseRequestMessageOf_UlkelerIstek $parameters)",
          "BaseResponseMessageOf_HalIciIsyeriCevap GenelServisHalIciIsyeri(BaseRequestMessageOf_HalIciIsyeriIstek $parameters)",
          "BaseResponseMessageOf_IsletmeTurleriCevap GenelServisIsletmeTurleri(BaseRequestMessageOf_IsletmeTurleriIstek $parameters)",
          "BaseResponseMessageOf_DepolarCevap GenelServisDepolar(BaseRequestMessageOf_DepolarIstek $parameters)",
          "BaseResponseMessageOf_SubelerCevap GenelServisSubeler(BaseRequestMessageOf_SubelerIstek $parameters)"
        ]

        Burada aslında yöntem GenelServisIller yazanmış. Yani $client->GenelServisIller(); şeklinde kullanılması lazım. Geçerli bilgiler olmadığı için test edemedim, şu haliyle hata vermiyor ama boş yanıt dönüyor.

        Gerisi size kalmış, araştırın.

        Çok teşekkür ederim

        • yalcin

            Seviye 90
          • Düzenlendi

          Chatgpt tam olarak şunu verdi

          Route::get('/deneme', function () {
                  
                  $params = [
                      'stream_context' => stream_context_create([
                          'ssl' => [
                              'verify_peer' => false,
                              'verify_peer_name' => false,
                          ],
                      ]),
                      'cache_wsdl' => WSDL_CACHE_NONE,
                  ];
          
                  $client = new SoapClient('https://hks.hal.gov.tr/WebServices/GenelService.svc?singleWsdl', $params);
          
                  // İstek parametrelerini oluşturalım
                  $requestParameters = new stdClass();
                  $requestParameters->UserName = '';
                  $requestParameters->Password = '';
                  $requestParameters->ServicePassword = '!1QAZWSX';
                  $requestParameters = new stdClass();
          
                  $response = $client->GenelServisIller($requestParameters);
                  // GenelServisIller işlevini çağıralım
          
                  if ($response->IslemKodu == 'GTBWSRV0000001') {
                      // İstek başarılı ise ilgili işlemleri gerçekleştirebilirsiniz
                      // Yanıtı kontrol edelim
                      $iller = $response->Sonuc->Iller;
                      foreach ($iller as $il) {
                          // İl adını ekrana yazdıralım
                          echo $il->IlAdi . "\n";
                      }
                  } else {
                      // İstek başarısız ise hata kodlarını ve mesajlarını kontrol edebilirsiniz
                      foreach ($response->HataKodlari as $hata) {
                          echo "Hata Kodu: " . $hata->HataKodu . "\n";
                          echo "Hata Mesajı: " . $hata->Mesaj . "\n";
                      }
                  }
                  });

          önce kendi şifremi paswordumu dogru olarak verdim

          bu döndü
          GTBGLB00000013 Kullanıcı bilgilerinden en az biri boş.

          daha sonra dedimki belki test ortamında şifreye vs gerek yoktur ,“ServicePassword” alanının değeri test sisteminde “!1QAZWSX” denmiş bir deniyeyim dedim ve sonuc olarak sıradaki hatayı aldım

          GTBGLB00000012 Kullanıcı belli bir süre bloklandı.

          sonuc bukadar olsa iyi bildirm almam gerekiyo sisteme giremiyorum otoban kenarında yatırdım kamyonları bilselerki ,neyse ancak cumartesi akşamı denemeler yapmam lazım pazar günleri kapalıyız 🙂

          ama nerde hata yaptım anlamadım


          normalde webden girişim bu şekilde acava Capctha felanmı eklemeliyim ondanmı oldu yada

          chatgpt den kopyalarkenmi yanlış yaptım şimdi farkettimde

          
                 **$requestParameters = new stdClass();**
                  $requestParameters->UserName = '';
                  $requestParameters->Password = '';
                  $requestParameters->ServicePassword = '!1QAZWSX';
                  **$requestParameters = new stdClass();**

          $requestParameters = new stdClass() hem başa hemde sona kopyalamışın o yaparmı ? yada şusername ve passwordd tırnaksızmı olmalı herşey olabilir tabi ..

          • yalcin

              Seviye 90
            • Düzenlendi

            bloke açıldı iki kere yazdığımdanmış yeni hata kodum hayırlı olsun

            Hata Kodu: 11 Hata Mesajı: Bilgi alanı boş olamaz. Alan adı : "IllerIstek"

            bu Soap mıdır nedir onun hakkında bi kurs bulsam süper olucak

              yalcin Size ilk verdiğim örnekte IllerIstek kısmını yazdım.

              $client = new SoapClient('https://hks.hal.gov.tr/WebServices/GenelService.svc?singleWsdl', $params);
              
                      $requestParameters = new stdClass();
                      $requestParameters->UserName = '*********';
                      $requestParameters->Password = '**********';
                      $requestParameters->ServicePassword = '**';
              
                      $requestParameters->Istek = new stdClass();
              
                      $response = $client->GenelServisIller($requestParameters);
              
              
                      dd($response);

              bunun sonucu

              bunu veriyor problem yokda

              foreach ($iller as $il) {
                              // İl adını ekrana yazdıralım
                              echo $il->IlAdi . "\n";
                          }

              bunun için dizin boş geliyor galiba şeyden bir view gönderip v-forla dönmek gerekicek neyse aslında sormak istediğim

              Genel Hizmetler:
              Servis adı GenelService (Böyle birçok servis var )
              Servis WSDL URL /GenelService.svc

              demiş daha sonrada

              Metod Adı GenelServisUlkeler
              Metod Adı GenelServisIller
              Metod Adı GenelServisIlceler
              Metod Adı GenelServisBeldeler

              metodları listelemiş tamam genel servis illeri listeliyebiliyorum ama detaylarla nasıl çalışıcam örneğin

              Şube Listesi Servisi : Metod Adı GenelServisSubeler ile çalışıp kendi şubelerimi almak istedim

              bu dökümanı nasıl kullanıcam

                yalcin dd ile aldığınız döküme bakılırsa $iller = $response->Sonuc->Iller->IlDTO olacak.

                Şubeler ise, dokümana göre sanırım şöyle olacak:

                ...
                $requestParameters->Istek = new stdClass;
                $requestParameters->Istek->TcKimlikVergiNo = "11111111111";

                Başarılı olursa $subeler = $response->Sonuc->Subeler->SubeDTO;

                $requestParameters array olarak da gönderseniz çalışır gibime geliyor:

                [
                    'Istek' => [
                        'TcKimlikVergiNo' => '11111111111'
                    ],
                    'Password' => 'password',
                    'ServicePassword' => 'service-password' ,
                    'UserName' => 'username',
                ]

                teşekkürler

                2 ay sonra
                   public function getIller()
                    {
                        $params = [
                            'stream_context' => stream_context_create([
                                'ssl' => [
                                    'verify_peer' => false,
                                    'verify_peer_name' => false,
                                ],
                            ]),
                            'cache_wsdl' => WSDL_CACHE_NONE,
                        ];
                
                        $client = new SoapClient('https://hks.hal.gov.tr/WebServices/GenelService.svc?singleWsdl', $params);
                
                        $requestParameters = [
                            'UserName' => 'kulanıcı adım',
                            'Password' => 'şifrem',
                            'ServicePassword' => 'servisşifrem',
                            'Istek' => [],
                        ];       
                        $response = $client->GenelServisIller($requestParameters); //iller listesi
                         dd($response);

                bu gayet düzgün şekilde çalışıyor tüm iller listesi geliyor birde ilçeleri almak istiyorum
                GenelServisIller methodundan gelen Id’lerden biri olmalıdır bir uyarı var

                bende

                
                  $requestParameters = [
                            'UserName' => 'kulanıcı adım',
                            'Password' => 'şifrem',
                            'ServicePassword' => 'servisşifrem',
                            'Istek' => [
                            'llId' => 1,
                ],
                        ];       

                isteğin içine ilidsini ekliyorum hata vermiyo

                $response = $client->GenelServisIlceler($requestParameters);  şekliinde çalıştırıyorum ancak  böyle bir yanıt veriyor  +"HataKodlari": null
                  +"IslemKodu": "GTBWSRV0000001"
                  +"Sonuc": {#424 ▼
                    +"HataKodu": 0
                    +"Ilceler": {#423}
                    +"Mesaj": null
                  }   ilceler  listesi yok boş geliyor

                  yalcin O zaman llId 1 olan ilçe yok demektir. "ama var hocam listede görüyorum" diyecekseniz şimdiden boş gelme sebebini bizim bilemeyeceğimizi, dokümanlara bakmanız gerektiğini belirteyim.


                  isteği yanlış atıyorumdıur tabikide ... okadar ço kşey denedim en azından şans eseri tutturmam gerekirdi 🙂

                    sineld, başlığı Web Servisleri olarak değiştirdi.
                    bir yıl sonra

                    yalcin Umarım projeniz başarılı olmuştur bende hal çalışanıyım bu tarz bir projem var ama ülke il dışındaki bütün servisler boş dönüyor buna bir çözüm bulabildiniz mi ?