diff --git a/IS/PazarYeri/Trendyol/Helper/Database.php b/IS/PazarYeri/Trendyol/Helper/Database.php new file mode 100644 index 0000000..ee338f2 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Helper/Database.php @@ -0,0 +1,175 @@ + + * + */ + protected $db = null; + + /** + * + * SQLite Veritabanı Sınıfı Oluşturucu + * + * @author Ismail Satilmis + * + */ + public function __construct($firstSetupDate) + { + $this->checkSQLiteAndPDODriver(); + + $SQLitePath = __DIR__ . '/../Data/'; + if (!file_exists($SQLitePath)) { + mkdir($SQLitePath, 0777); + } + + $this->db = new \PDO("sqlite:" . $SQLitePath . 'trendyol.sqlite'); + $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + $this->checkAndCreateTables($firstSetupDate); + } + + /** + * + * SQLite ve PDO sürücülerini kontrol etme + * + * @author Ismail Satilmis + * + */ + protected function checkSQLiteAndPDODriver() + { + + $response = \PDO::getAvailableDrivers(); + if (count($response) <= 0 || empty($response)) { + throw new N11Exception("Sunucunuzda PDO Aktif Olmalıdır."); + } + + if (!in_array('sqlite', $response)) { + throw new N11Exception("Sunucunuzda SQLite PDO Sürücüsü Aktif Olmalıdır."); + } + + } + + /** + * + * SQLite Veritabanı tablolarını kontrol etme ve oluşturma + * + * @author Ismail Satilmis + * + */ + public function checkAndCreateTables($firstSetupDate) + { + + $sqlQuerys = array( + 'CREATE TABLE IF NOT EXISTS `orders` ( + `orderid` INTEGER NOT NULL , + `status` TINYINT NOT NULL DEFAULT \'0\' , + `date` INTEGER NOT NULL , + PRIMARY KEY (`orderid`) + );', + 'CREATE TABLE IF NOT EXISTS `settings` ( + `lastOrderDate` INTEGER NOT NULL DEFAULT \'0\' + );', + ); + + foreach ($sqlQuerys as $sql) { + $this->db->query($sql); + } + + $settings = $this->selectSettings(); + if (!isset($settings->lastOrderId)) { + $prepare = $this->db->prepare('INSERT INTO settings (lastOrderDate) VALUES(?)'); + $prepare->execute(array($firstSetupDate)); + } + + } + + /** + * + * Siparişleri SQLite üzerinde tamamlandı olarak işaretleme + * + * @author Ismail Satilmis + * @param int $orderId + * @return bool + * + */ + public function updateStartDate($startDate) + { + $prepare = $this->db->prepare('UPDATE `settings` SET lastOrderDate = ?'); + return $prepare->execute(array($startDate)); + } + + /** + * + * Siparişleri SQLite üzerinde tutma + * + * @author Ismail Satilmis + * @param int $orderId + * @return int + * + */ + public function addOrder($orderId) + { + + $prepare = $this->db->prepare('INSERT INTO `orders` (orderid, status, date) VALUES(?, ?, ?)'); + $prepare->execute(array($orderId, 0 , time())); + return $this->db->lastInsertId(); + + } + + /** + * + * Siparişleri SQLite üzerinde kontrol etme + * + * @author Ismail Satilmis + * @param int $orderId + * @return object + * + */ + public function selectOrder($orderId) + { + + $prepare = $this->db->prepare('SELECT * FROM `orders` WHERE orderid = ?'); + $prepare->execute(array($orderId)); + return $prepare->fetch(\PDO::FETCH_OBJ); + } + + /** + * + * Siparişleri SQLite üzerinde tamamlandı olarak işaretleme + * + * @author Ismail Satilmis + * @param int $orderId + * @return bool + * + */ + public function finishOrder($orderId) + { + + $prepare = $this->db->prepare('UPDATE `orders` SET status = ? WHERE orderid = ?'); + return $prepare->execute(array(1 , $orderId)); + } + + /** + * + * WebHookService Ayarlarını getirir. + * + * @author Ismail Satilmis + * @return object + * + */ + public function selectSettings() + { + + $prepare = $this->db->prepare('SELECT * FROM `settings`'); + $prepare->execute(); + return $prepare->fetch(\PDO::FETCH_OBJ); + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Helper/Format.php b/IS/PazarYeri/Trendyol/Helper/Format.php new file mode 100644 index 0000000..27c11e1 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Helper/Format.php @@ -0,0 +1,85 @@ + $value) + { + if (!isset($data[$key])) { + continue; + } + + if (isset($value['required']) && !in_array($data[$key], $value['required'] )) { + continue; + } + + if (isset($value['format'])) { + $formatName = $value['format']; + $data[$key] = self::$formatName($data[$key]); + } + + $responseList[$key] = self::trim($data[$key]); + } + + return $responseList; + } + + /** + * + * Url içerisindeki özel parametleri ayıklar + * + * @author Ismail Satilmis + * @param string $apiUrl + * @return array + * + */ + public function getUrlSpecialParameters($apiUrl) + { + if(preg_match_all('@\{(.*?)\}@si', $apiUrl, $output)) + { + return $output[1]; + } + return array(); + } + + /** + * + * UnixTime değerini milisaniye cinsine çevririr. + * + * @author Ismail Satilmis + * @param int $timestamp + * + */ + public static function unixTime($timestamp) + { + return $timestamp * 1000; + } + + /** + * + * Metnin başındaki ve sonundaki boşlukları siler. + * + * @author Ismail Satilmis + * @param int $timestamp + * + */ + public static function trim($text) + { + return trim($text); + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Helper/Gateway.php b/IS/PazarYeri/Trendyol/Helper/Gateway.php new file mode 100644 index 0000000..c44c256 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Helper/Gateway.php @@ -0,0 +1,84 @@ + 'BrandService', + 'cargo' => 'CargoService', + 'category' => 'CategoryService', + 'product' => 'ProductService', + 'order' => 'OrderService', + 'webhook' => 'WebhookService', + ); + + /** + * + * @description REST Api servislerinin ilk çağırma için hazırlanması + * @param string + * @return service + * + */ + public function __get($name) + { + if (!isset($this->allowedServices[$name])) { + throw new TrendyolException("Geçersiz Servis!"); + } + + if (isset($this->$name)) { + return $this->$name; + } + + $this->$name = $this->createServiceInstance($this->allowedServices[$name]); + return $this->$name; + } + + /** + * + * Servis sınıfının ilk örneğini oluşturma + * + * @author Ismail Satilmis + * @param string $serviceName + * @return string + * + */ + protected function createServiceInstance($serviceName) + { + $serviceName = "IS\PazarYeri\Trendyol\Services\\" . $serviceName; + if (!class_exists($serviceName)) { + throw new TrendyolException("Geçersiz Servis!"); + } + return new $serviceName($this->apiSupplierId, $this->apiUsername, $this->apiPassword); + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Helper/Request.php b/IS/PazarYeri/Trendyol/Helper/Request.php new file mode 100644 index 0000000..b2efc85 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Helper/Request.php @@ -0,0 +1,218 @@ + + * @var array + * + */ + protected $datas = array(); + + /** + * + * Service Ayarlarını yapar + * @param string + * + */ + public function __construct($apiUrl, $supplierId, $username, $password, $method = 'GET') + { + $this->setApiSupplierId($supplierId); + $this->setApiUsername($username); + $this->setApiPassword($password); + $this->setApiUrl($apiUrl); + $this->setMethod($method); + } + + /** + * + * API SupplierId değerini değiştirir. + * + * @param string $apiUrl + * + */ + public function setApiSupplierId($supplierId) + { + $this->apiSupplierId = $supplierId; + } + + /** + * + * API Kullanıcı adını değiştirir. + * + * @param string $apiUrl + * + */ + public function setApiUsername($username) + { + $this->apiUsername = $username; + } + + /** + * + * API Şifresini değiştirir. + * + * @param string $apiUrl + * + */ + public function setApiPassword($password) + { + $this->apiPassword = $password; + } + + /** + * + * Api Linkini ayarlar. + * + * @param string $apiUrl + * + */ + public function setApiUrl($apiUrl) + { + $this->apiUrl = $apiUrl; + } + + /** + * + * Method türünü ayarlama POST|GET... + * + * @param string $method + * + */ + public function setMethod($method) + { + $this->method = strtoupper($method); + } + + /** + * + * Trendyol için basic auth döndürür + * + * @author Ismail Satilmis + * @return string + * + */ + protected function authorization() + { + return base64_encode($this->apiUsername . ':' . $this->apiPassword); + } + + /** + * + * Api url bilgisini döner. + * + * @author Ismail Satilmis + * @param array $datas + * + */ + public function getApiUrl($requestData) + { + + $apiUrl = $this->apiUrl; + foreach (Format::getUrlSpecialParameters($apiUrl) as $key) + { + if (isset($requestData[$key])) + { + $apiUrl = str_replace('{' . $key . '}', $requestData[$key], $apiUrl); + unset($requestData[$key]); + } + } + + $apiUrl = str_replace('{supplierid}', $this->apiSupplierId, $apiUrl); + if ($this->method == 'POST' || !is_array($requestData) || count($requestData) <= 0) { + return $apiUrl; + } + + return $apiUrl . '?' . http_build_query($requestData); + + } + + /** + * + * Hazırlanan isteği apiye iletir ve yanıtı json olarak döner. + * + * @author Ismail Satilmis + * @param array $query + * @param array $data + * @param boolean $authorization + * @return array + * + */ + public function getResponse($query, $data, $authorization = true) + { + + $requestData = Format::initialize($query, $data); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->getApiUrl($requestData)); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->method); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_TIMEOUT, 20); + + if ($authorization) { + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . $this->authorization())); + } + + if ($this->method == 'POST') { + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(Format::requestInitialize($query, $data))); + } + + $response = trim(curl_exec($ch)); + if (empty($response)) { + throw new TrendyolException("Trendyol boş yanıt döndürdü."); + } + + $response = json_decode($response); + curl_close($ch); + return $response; + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Helper/TrendyolException.php b/IS/PazarYeri/Trendyol/Helper/TrendyolException.php new file mode 100644 index 0000000..0348b66 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Helper/TrendyolException.php @@ -0,0 +1,5 @@ + + * @var string + * + */ + public $apiUrl = 'https://api.trendyol.com/sapigw/brands'; + + /** + * + * Request sınıfı için gerekli ayarların yapılması + * + * @author Ismail Satilmis + * + */ + public function __construct($supplierId, $username, $password) + { + parent::__construct($this->apiUrl, $supplierId, $username, $password); + } + + /** + * + * createProduct servisine yapılacak isteklerde gönderilecek brandId bilgisi bu servis kullanılarak alınacaktır. + * Bir sayfada en fazla 500 adet brand bilgisi alınabilmektedir. + * + * @author Ismail Satilmis + * @param string $degisken + * @return string + * + */ + public function getBrands($size = 100, $pageId = 0) + { + $this->setApiUrl($this->apiUrl); + return $this->getResponse(true, array('page' => $pageId, 'size' => $size), false); + } + + /** + * + * Marka araması yapmak için kullanılır. + * BÜYÜK / küçük harf ayrımına dikkat etmelisiniz. + * + * @author Ismail Satilmis + * @param string $degisken + * @return string + * + */ + public function getBrandByName($brandName) + { + $this->setApiUrl($this->apiUrl . '/by-name'); + return $this->getResponse(true, array('name' => $brandName), false); + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Services/CargoService.php b/IS/PazarYeri/Trendyol/Services/CargoService.php new file mode 100644 index 0000000..ca5f457 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Services/CargoService.php @@ -0,0 +1,74 @@ + + * @var string + * + */ + public $apiUrl = ''; + + /** + * + * Request sınıfı için gerekli ayarların yapılması + * + * @author Ismail Satilmis + * + */ + public function __construct($supplierId, $username, $password) + { + parent::__construct($this->apiUrl, $supplierId, $username, $password); + } + + /** + * + * Trendyol üzerindeki bütün kargo şirketlerini getirir. + * + * createProduct servisine yapılacak isteklerde gönderilecek kargo firma bilgileri + * ve bu bilgilere ait ID değerleri bu servis kullanılarak alınacaktır. + * + * Ürün gönderimi yaparken gönderdiğiniz kargo şirketleri, Trendyol sözleşmenizde + * onayladığınız kargo firmasından farklı olmamalıdır. Bu durum ürünlerinizi yayına çıkmasını engelleyecektir. + * + * @author Ismail Satilmis + * @return array + * + */ + public function getProviders() + { + $this->setApiUrl('https://api.trendyol.com/sapigw/shipment-providers'); + return $this->getResponse(true, true, false); + } + + /** + * + * Trendyol üzerindeki tedarikçi adreslerinizi getirir. + * + * createProduct V2 servisine yapılacak isteklerde gönderilecek sipariş ve sevkiyat kargo + * firma bilgileri ve bu bilgilere ait ID değerleri bu servis kullanılarak alınacaktır. + * + * "SATICI BAŞVURU SÜRECİM" tam olarak tamamlanmadı ise bu servisi kullanmamanız gerekir. + * + * Ürün gönderimi yaparken adresi ID değerlerini kontrol etmelisiniz. Hatalı gönderim + * yapılması halinde ürün aktarımı gerçekleşmeyecektir. + * + * @author Ismail Satilmis + * @return array + * + */ + public function getSuppliersAddresses() + { + $this->setApiUrl('https://api.trendyol.com/sapigw/suppliers/{supplierid}/addresses'); + return $this->getResponse(true, true); + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Services/CategoryService.php b/IS/PazarYeri/Trendyol/Services/CategoryService.php new file mode 100644 index 0000000..fa4aedb --- /dev/null +++ b/IS/PazarYeri/Trendyol/Services/CategoryService.php @@ -0,0 +1,71 @@ + + * @var string + * + */ + public $apiUrl = 'https://api.trendyol.com/sapigw/product-categories'; + + /** + * + * Request sınıfı için gerekli ayarların yapılması + * + * @author Ismail Satilmis + * + */ + public function __construct($supplierId, $username, $password) + { + parent::__construct($this->apiUrl, $supplierId, $username, $password); + } + + /** + * + * Trendyol üzerindeki bütün kategorileri getirir. + * createProduct servisine yapılacak isteklerde gönderilecek categoryId + * bilgisi bu servis kullanılarak alınacaktır. + * + * createProduct yapmak için en alt seviyedeki kategori ID bilgisi kullanılmalıdır. + * Seçtiğiniz kategorinin alt kategorileri var ise bu kategori bilgisi ile ürün aktarımı yapamazsınız. + * + * @author Ismail Satilmis + * @return array + * + */ + public function getCategoryTree() + { + $this->setApiUrl($this->apiUrl); + return $this->getResponse(true, true, false); + } + + /** + * + * Trendyol üzerindeki kategorinin özelliklerini döndürür. + * createProduct servisine yapılacak isteklerde gönderilecek attributes bilgileri + * ve bu bilgilere ait detaylar bu servis kullanılarak alınacaktır. + * + * createProduct yapmak için en alt seviyedeki kategori ID bilgisi kullanılmalıdır. + * Seçtiğiniz kategorinin alt kategorileri var ise (leaf:true) bu kategori bilgisi ile ürün aktarımı yapamazsınız. + * + * @author Ismail Satilmis + * @param int $categoryId + * @return array + * + */ + public function getCategoryAttributes($categoryId) + { + $this->setApiUrl($this->apiUrl . '/{categoryId}/attributes'); + return $this->getResponse(true, array('categoryId' => $categoryId), false); + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Services/OrderService.php b/IS/PazarYeri/Trendyol/Services/OrderService.php new file mode 100644 index 0000000..12efb8e --- /dev/null +++ b/IS/PazarYeri/Trendyol/Services/OrderService.php @@ -0,0 +1,60 @@ + + * @var string + * + */ + public $apiUrl = 'https://api.trendyol.com/sapigw/suppliers/{supplierid}/orders'; + + /** + * + * Request sınıfı için gerekli ayarların yapılması + * + * @author Ismail Satilmis + * + */ + public function __construct($supplierId, $username, $password) + { + parent::__construct($this->apiUrl, $supplierId, $username, $password); + } + + /** + * + * Trendyol üzerinde siparişleri arar. + * + * @author Ismail Satilmis + * @param string $degisken + * @return string + * + */ + public function orderList($data = array()) + { + + $query = array( + 'startDate' => array('format' => 'unixTime'), + 'endDate' => array('format' => 'unixTime'), + 'page' => '', + 'size' => '', + 'orderNumber' => '', + 'status' => array('required' => array('Created', 'Picking', 'Invoiced', 'Shipped', 'Cancelled', 'Delivered', 'UnDelivered', 'Returned', 'Repack', 'UnSupplied')), + 'orderByField' => array('required' => array('PackageLastModifiedDate', 'CreatedDate')), + 'orderByDirection' => array('required' => array('ASC', 'DESC')), + 'shipmentPackagesId' => '', + ); + + return $this->getResponse($query, $data); + } + + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/Services/WebhookService.php b/IS/PazarYeri/Trendyol/Services/WebhookService.php new file mode 100644 index 0000000..074df28 --- /dev/null +++ b/IS/PazarYeri/Trendyol/Services/WebhookService.php @@ -0,0 +1,274 @@ + + * @var int + * + */ + protected $requestTime = 180; + + /** + * + * Son yapılan istek zamanı + * + * @author Ismail Satilmis + * @var int + * + */ + protected $requestEndTime; + + /** + * + * İlk başlama zamanı + * + * @author Ismail Satilmis + * @var int + * + */ + protected $startedTime; + + /** + * + * Sipariş listesinden kaç adet sipariş getirileceği. + * + * @author Ismail Satilmis + * @var int + * + */ + protected $orderMaxResult = 50; + + /** + * + * İlk kurulum için geçerli geçmiş tarih + * + * @author Ismail Satilmis + * @var int + * + */ + protected $firstSetupDate; + + /** + * + * 1 Yıl için sabit değer + * + * @author Ismail Satilmis + * @var int + * + */ + const ONE_YEAR = 86400 * 365; + + /** + * + * 2 Hafta için sabit değer + * + * @author Ismail Satilmis + * @var int + * + */ + const TWO_WEEK = 86400 * 14; + + /** + * + * Request sınıfı için gerekli ayarların yapılması + * + * @author Ismail Satilmis + * + */ + public function __construct($supplierId, $username, $password) + { + $this->startedTime = time(); + $this->requestEndTime = time(); + $this->firstSetupDate = time() - self::ONE_YEAR; + $this->order = new OrderService($supplierId, $username, $password); + parent::__construct($this->firstSetupDate); + } + + /** + * + * Trendyol üzerinden gelen yeni siparişleri tüketir. + * + * @author Ismail Satilmis + * @param Class $client + * + */ + public function orderConsume($work) + { + + while (true) + { + if (time() >= $this->requestEndTime) + { + + $this->requestEndTime = time() + $this->requestTime; + $this->setting = $this->selectSettings(); + foreach ($this->getDateBetweenWeeks($this->setting->lastOrderDate) as $date) + { + $orderList = $this->getOrderList($date['startDate'], $date['endDate']); + $this->callEvent($orderList, $work); + + for ($pageId = 1; $pageId < $orderList['maxPage']; $pageId++) + { + $orderList = $this->getOrderList($date['startDate'], $date['endDate'], $pageId); + $this->callEvent($orderList, $work); + } + + $this->updateStartDate($date['startDate']); + } + + } + + sleep(1); + } + + } + + /** + * + * Başlangıç tarihinden itibaren şimdiki zamana kadar haftaları listeler. + * + * @author Ismail Satilmis + * @param int $startDate + * @return array + * + */ + protected function getDateBetweenWeeks($startDate) + { + + $maxWeek = ceil((time() - $startDate) / self::TWO_WEEK); + if ($maxWeek <= 1) { + return array(array('startDate' => time() - self::TWO_WEEK, 'endDate' => time())); + } + + if ($maxWeek > 20) { + $maxWeek = 20; + } + + $responseList = array(); + for ($i = 0; $i < $maxWeek; $i++) { + $endDate = $startDate + self::TWO_WEEK; + $responseList[] = array('startDate' => $startDate, 'endDate' => $endDate); + $startDate += self::TWO_WEEK; + } + + return $responseList; + } + + /** + * + * Trenyol siparişlerini getirir. + * + * @author Ismail Satilmis + * @param int $startDate + * @param int $endDate + * @param int $pageId = 0 + * @return array + * + */ + protected function getOrderList($startDate, $endDate, $pageId = 0) + { + $orderList = $this->order->orderList(array( + 'orderByField' => 'CreatedDate', + 'orderByDirection' => 'DESC', + 'page' => $pageId, + 'size' => $this->orderMaxResult, + 'startDate' => $startDate, + 'endDate' => $endDate + )); + + $orderResponseList = array(); + if (isset($orderList->content) && count($orderList->content) > 0) { + $orderResponseList = $orderList->content; + } + + return array('maxPage' => $orderList->totalPages, 'datas' => $orderResponseList); + } + + /** + * + * Yeni siparişleri kancalar. + * + * @author Ismail Satilmis + * @param array $orderList + * @param Class $work + * + */ + protected function callEvent($orderList, $work) + { + foreach ($orderList['datas'] as $order) + { + $dborder = $this->selectOrder($order->orderNumber); + if (isset($dborder->orderid)) { + continue; + } + + $this->addOrder($order->orderNumber); + + if (is_array($work)) { + call_user_func_array(array($work[0], $work[1]), array($order)); + }else{ + $work($order); + } + + $this->finishOrder($order->orderNumber); + } + } + + /** + * + * Trendyol Siparişlerinin en kadar hızlı tüketileceği. + * + * @author Ismail Satilmis + * @param string $mode + * + */ + public function setRequestMode($mode) + { + + switch ($mode) + { + case 'slow' : $this->requestTime = 300; break; + case 'fast' : $this->requestTime = 60; break; + case 'vfast' : $this->requestTime = 30; break; + case 'medium': + default: + $this->requestTime = 180; + break; + } + + } + + /** + * + * Trendyol Sipariş listesinde kaç adet siparişin getirileceği + * + * @author Ismail Satilmis + * @param string $mode + * + */ + public function setResultMode($mode) + { + + switch ($mode) + { + case 'vmax' : $this->orderMaxResult = 200; break; + case 'max' : $this->orderMaxResult = 150; break; + case 'min' : $this->orderMaxResult = 50; break; + case 'medium' : + default: + $this->orderMaxResult = 100; + break; + } + + } + +} \ No newline at end of file diff --git a/IS/PazarYeri/Trendyol/TrendyolClient.php b/IS/PazarYeri/Trendyol/TrendyolClient.php new file mode 100644 index 0000000..6c99cdb --- /dev/null +++ b/IS/PazarYeri/Trendyol/TrendyolClient.php @@ -0,0 +1,43 @@ +apiSupplierId = $apiSupplierId; + } + + /** + * + * @description Trendyol Api Kullanıcı Adı + * @param string $apiUsername + * + */ + public function setUsername($apiUsername) + { + $this->apiUsername = $apiUsername; + } + + /** + * + * @description Trendyol Api Şifre + * @param string $apiPassword + * + */ + public function setPassword($apiPassword) + { + $this->apiPassword = $apiPassword; + } + +} \ No newline at end of file diff --git a/README.md b/README.md index 8c7cb0b..d1e9c99 100644 --- a/README.md +++ b/README.md @@ -1 +1,263 @@ -# trendyol-php-api \ No newline at end of file +[![Latest Stable Version](https://poser.pugx.org/ismail0234/trendyol-php-api/v/stable)](https://packagist.org/packages/ismail0234/trendyol-php-api) +[![Total Downloads](https://poser.pugx.org/ismail0234/trendyol-php-api/downloads)](https://packagist.org/packages/ismail0234/trendyol-php-api) +[![License](https://poser.pugx.org/ismail0234/trendyol-php-api/license)](https://packagist.org/packages/ismail0234/trendyol-php-api) + +# Trendyol PHP Api + +Bu api trendyol için yazılmıştır. Trendyol pazaryeri için yazılmış olan gelişmiş bir php apisi. Ekstra olarak trendyol üzerinde mağazanıza gelen siparişleri websitenize aktaracak bir fonksiyonda mevcuttur. + +### Change Log +- See [ChangeLog](https://github.com/ismail0234/trendyol-php-api/blob/master/CHANGELOG.md) + +### License +- See [ChangeLog](https://github.com/ismail0234/trendyol-php-api/blob/master/LICENSE) + +## Hızlı Bakış + * [Kurulum](#kurulum) + * [Kullanım](#kullanım) + * [Marka Servisi (Brand Service)](#marka-servisi-brand-service) + * [Kargo Servisi (Cargo Service)](#kargo-servisi-cargo-service) + * [Kategori Servisi (Category Service)](#kategori-servisi-category-service) + * [Ürün Servisi (Product Service)](#ürün-servisi-product-service) + * [Sipariş Servisi (Order Service)](#sipariş-servisi-order-service) + * [Trendyol Sipariş Bildirimi WebHook (Trendyol Order WebHook)](#trendyol-sipariş-bildirimi-webhook-trendyol-order-webhook) + + ## Kurulum + +Kurulum için composer kullanmanız gerekmektedir. Composer'a sahip değilseniz windows için [Buradan](https://getcomposer.org/) indirebilirsiniz. + +```php + +composer require ismail0234/trendyol-php-api + +``` + +## Kullanım + +```php + +include "vendor/autoload.php"; + +use IS\PazarYeri\Trendyol\TrendyolClient; +use IS\PazarYeri\Trendyol\Helper\TrendyolException; + +$trendyol = new TrendyolClient(); +$trendyol->setSupplierId(100000); +$trendyol->setUsername("xxxxxxxxxxxxxxxxxxxx"); +$trendyol->setPassword("xxxxxxxxxxxxxxxxxxxx"); + +``` + +### Marka Servisi (Brand Service) + +```php +/** + * + * createProduct servisine yapılacak isteklerde gönderilecek brandId bilgisi bu servis kullanılarak alınacaktır. + * Bir sayfada en fazla 500 adet brand bilgisi alınabilmektedir. + * + * @author Ismail Satilmis + * @param int $size + * @param int $pageId + * @return array + * + */ +$trendyol->brand->getBrands(100, 0); + +/** + * + * Marka araması yapmak için kullanılır. + * BÜYÜK / küçük harf ayrımına dikkat etmelisiniz. + * + * @author Ismail Satilmis + * @param string $brandName + * @return array + * + */ +$trendyol->brand->getBrandByName("Milla"); +``` + +### Kargo Servisi (Cargo Service) + +```php +/** + * + * Trendyol üzerindeki bütün kargo şirketlerini getirir. + * + * createProduct V2 servisine yapılacak isteklerde gönderilecek kargo firma bilgileri + * ve bu bilgilere ait ID değerleri bu servis kullanılarak alınacaktır. + * + * Ürün gönderimi yaparken gönderdiğiniz kargo şirketleri, Trendyol sözleşmenizde + * onayladığınız kargo firmasından farklı olmamalıdır. Bu durum ürünlerinizi yayına çıkmasını engelleyecektir. + * + * @author Ismail Satilmis + * @return array + * + */ +$trendyol->cargo->getProviders(); + +/** + * + * Trendyol üzerindeki tedarikçi adreslerinizi getirir. + * + * createProduct V2 servisine yapılacak isteklerde gönderilecek sipariş ve sevkiyat kargo + * firma bilgileri ve bu bilgilere ait ID değerleri bu servis kullanılarak alınacaktır. + * + * "SATICI BAŞVURU SÜRECİM" tam olarak tamamlanmadı ise bu servisi kullanmamanız gerekir. + * + * Ürün gönderimi yaparken adresi ID değerlerini kontrol etmelisiniz. Hatalı gönderim + * yapılması halinde ürün aktarımı gerçekleşmeyecektir. + * + * @author Ismail Satilmis + * @return array + * + */ +$trendyol->cargo->getSuppliersAddresses(); +``` + +### Kategori Servisi (Category Service) + +```php +/** + * + * Trendyol üzerindeki bütün kategorileri getirir. + * createProduct V2 servisine yapılacak isteklerde gönderilecek categoryId + * bilgisi bu servis kullanılarak alınacaktır. + * + * createProduct yapmak için en alt seviyedeki kategori ID bilgisi kullanılmalıdır. + * Seçtiğiniz kategorinin alt kategorileri var ise bu kategori bilgisi ile ürün aktarımı yapamazsınız. + * + * @author Ismail Satilmis + * @return array + * + */ +$trendyol->category->getCategoryTree(); + +/** + * + * Trendyol üzerindeki kategorinin özelliklerini döndürür. + * createProduct servisine yapılacak isteklerde gönderilecek attributes bilgileri + * ve bu bilgilere ait detaylar bu servis kullanılarak alınacaktır. + * + * createProduct yapmak için en alt seviyedeki kategori ID bilgisi kullanılmalıdır. + * Seçtiğiniz kategorinin alt kategorileri var ise (leaf:true) bu kategori bilgisi ile ürün aktarımı yapamazsınız. + * + * @author Ismail Satilmis + * @param int $categoryId + * @return array + * + */ +$trendyol->category->getCategoryAttributes(411); +``` + +### Sipariş Servisi (Order Service) + +```php + +/** + * + * Trendyol sistemine ilettiğiniz ürünler ile planlanın butik sonrası müşteriler tarafından verilen her siparişin bilgisini + * bu method yardımıyla alabilirsiniz. Trendyol.com'da müşteriler tarafından verilen siparişler, sistem tarafından otomatik + * paketlenerek sipariş paketleri oluşturulur. Bu yüzden sistem çektiğiniz bir adet OrderNumber'a karşılık birden fazla + * shipmentPackageID gelebilir. + * + * @note İsteğe bağlı olarak dizideki alanların istenilen bölümleri eklenmeyebilir veya dizi hiç gönderilmeyebilir. + * @param array + * + */ +$trendyol->order->orderList( + array( + // Belirli bir tarihten sonraki siparişleri getirir. Timestamp olarak gönderilmelidir. + 'startDate' => time() - (86400 * 14), + // Belirtilen tarihe kadar olan siparişleri getirir. Timestamp olarak gönderilmelidir ve startDate ve endDate aralığı en fazla 2 hafta olmalıdır + 'endDate' => time(), + // Sadece belirtilen sayfadaki bilgileri döndürür + 'page' => 0, + // Bir sayfada listelenecek maksimum adeti belirtir. (Max 200) + 'size' => 200, + // Sadece belirli bir sipariş numarası verilerek o siparişin bilgilerini getirir + 'orderNumber' => '', + // Siparişlerin statülerine göre bilgileri getirir. (Created, Picking, Invoiced, Shipped, Cancelled, Delivered, UnDelivered, Returned, Repack, UnSupplied) + 'status' => '', + // Siparişler neye göre sıralanacak? (PackageLastModifiedDate, CreatedDate) + 'orderByField' => 'CreatedDate', + // Siparişleri sıralama türü? (ASC, DESC) + 'orderByDirection' => 'DESC', + // Paket numarasıyla sorgu atılır. + 'shipmentPackagesId' => '', + ) +); + +``` + +### Trendyol Sipariş Bildirimi WebHook (Trendyol Order WebHook) + +Trendyol Tarafından sipariş bildirimleri için bir webhook verilmediği için bu işlemi yapmak isteyenler kişiler için yazılmış olan bir webhook dur. Webhook'u kullanabilmeniz için sunucunuzda **sqlite** pdo driver kurulu olması gerekmektedir. + +**Not:** Oluşturacağınız bu dosyayı linux tarafında arkaplanda sürekli çalışır halde kalması gerekmektedir. Bunu yapmak için **tmux** veya **servis yazarak** kullanabilirsiniz. **Cronjob ile kullanmayınız!** + +```php + +include "vendor/autoload.php"; + +use IS\PazarYeri\Trendyol\TrendyolClient; + +$trendyol = new TrendyolClient(); +$trendyol->setSupplierId(100000); +$trendyol->setUsername("xxxxxxxxxxxxxxxxxxxx"); +$trendyol->setPassword("xxxxxxxxxxxxxxxxxxxx"); + +/** + * + * @description Webhook istek hızı + * @param string + * 'slow' => 300 saniye, + * 'medium' => 180 saniye (default/taviye edilen), + * 'fast' => 60 saniye + * 'vfast' => 30 saniye + * + */ +$trendyol->webhook->setRequestMode('medium'); + +/** + * + * @description Trendyol sonuçlarında kaç siparişin getirileceği + * @param string + * 'vmax' => 200 adet, + * 'max' => 150 adet, + * 'medium' => 100 adet (default/taviye edilen), + * 'min' => 50 adet + * + */ +$trendyol->webhook->setResultMode('medium'); + +/* Anonymous function ile siparişleri almak */ +$trendyol->webhook->orderConsume(function($order){ + + echo "Sipariş Bilgileri"; + echo "
";
+	print_r($order);
+	echo "
"; + +}); + +/* Class ile siparişleri almak */ + +Class TrendyolOrders +{ + + public function consume($order) + { + + echo "Sipariş Bilgileri"; + echo "
";
+		print_r($order);
+		echo "
"; + + } + +} + +$trendyol->webhook->orderConsume(array(new TrendyolOrders(), 'consume')); + +``` diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..b8db5b4 --- /dev/null +++ b/_config.yml @@ -0,0 +1,2 @@ +theme: jekyll-theme-cayman +show_downloads: true diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..669edc3 --- /dev/null +++ b/composer.json @@ -0,0 +1,20 @@ +{ + "name": "ismail0234/trendyol-php-api", + "description": "Trendyol PHP API", + "type": "library", + "keywords": ["trendyol", "eticaret", "php api", "trendyol php api", "pazaryeri"], + "license": "MIT", + "authors": [ + { + "name": "İsmail Satilmiş", + "email": "ismaiil_0234@hotmail.com" + } + ], + "require": {}, + "autoload": { + "psr-4": { + "IS\\PazarYeri\\Trendyol\\": "IS/PazarYeri/Trendyol" + } + }, + "minimum-stability": "stable" +}