API новой почты

API новой почты

Привет. Все украинцы наверняка знают о Новой почте. Для не украинцев — это у нас такая курьерская служба, по образцу FedEx (доставка по страна на следующий день).

 

У Новой почты есть хорошая система отслеживания грузов, и специальная система для интернет-магазинов, которая позволяет создавать декларации на посылки онлайн (а потом просто завозить посылки и декларации на склад перевозчика). Это действительно спасает много времени, которое требуется для того, чтобы отправить посылку лично (очереди, заполнение бумажек и т.п.).

Кроме того, у Новой почты есть API Новой почты, которое позволяет создавать декларации автоматически, узнавать стоимость доставки на лету, получать список всех отделений и делать много всяких плюшек.

Предлагаю вашему вниманию класс для работы с API Новой почты (выполняет большую часть процесов, доступных сегодня через API).

Класс реализован на PHP, и все функции статические (то есть можно вызывать без создания объекта). Например:

Novaposhta::price();

Для начала нам потребуется класс для работы с API новой почты

Листинг класса привожу ниже. Еще ниже можно его скачать или посмотреть на гитхабе.
Пройдемся по функциям класса.
Первым делом, самое важное, это функция отправки запроса и получения ответа от новой почты. Работает через curl, просто отправляет XML, получает XML и преобразовывает его в объект.

Ну а дальше уже идут данные для работы с самим API.

Класс закоммичен на Github:
[dl url=’https://github.com/kozachenko/API-Nova-Poshta’ title=’Класс API Новой почты’ desc=’На GitHub’ type=’PDF’]

Приветствуются форки. Разрабатывался для узкой специализации, поэтому не все функции описаны. Подробнее читайте в документации Новой почты.

Листинг класса

 class NP{
 	/* Город отправителя */
	 public static $out_city='Киев';
 	/* Отправитель */	 
	 public static $out_company='ПП Петров';
 	/* Склад */	 
	 public static $out_warehouse='1';	 
 	/* Представитель отправителя */	 
	 public static $out_name='Петров Иван Иваныч';	 
 	/* Телефон отправителя */	 
	 public static $out_phone='0671234567';	 
 	/* API ключ */	 
	 public static $api_key='123ab45678901abc1234ab1a1234567a';	 
 	/* Описание посылки */	 
	 public static $description='Взуття';
 	/* Описание упаковки */	 
	 public static $pack='Коробка';	 
	 	 
	 /**
	  * Функция отправки запроса на сервер Новой почты
	  	$xml — запрос
	  */
	 static public function send($xml){
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, 'http://orders.novaposhta.ua/xml.php');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
		$response = curl_exec($ch);
		curl_close($ch);
		return $response;
	 }
	 
	 /**
	  * Запрос на расчёт стоимости доставки 
	  	$to_city — город получатель
	  	$weight — вес
	  	$pub_price — заявленная стоимость
	  	$height — высота коробки	  		  		  	
	  	$width — ширина коробки	  		  		  	
	  	$depth — длинна коробки	  		  		  		  	
	  */
	 public static function price($to_city,$weight,$pub_price,$date,$height=0,$width=0,$depth=0){
		$xml='
		
		'.NP::$api_key.'
		
        	'.NP::$out_city.'
        	'.$to_city.'
        	'.$weight.'
        	'.$depth.'
        	'.$width.'
        	'.$depth.'
        	'.$pub_price.'
        	4
        	0
        	'.$date.'
        	
        ';
		
		$xml = simplexml_load_string(NP::send($xml));
		return $xml->cost;
	} 	
	 /**
	  * Запрос на создание декларации на отправку 
	  	$order_id — номер заказа на вашем сайте (для вашего удобства)
	  	$city — город получения
	  	$warehouse — номер склада получения
	  	$name — имя получателя	  		  		  	
	  	$surname — фамилия получателя	  		  		  	
	  	$phone — телефон получателя	  		  		  		  	
	  	$weight — вес посылки	  		  		  	
	  	$pub_price — заявленная стоимость	  		  		  	
	  	$date — дата отправки
	  	$payer — плательщик (1 — получатель, 0 — отправитель, 2 — третья сторона)	  	
	  */
	 public static function ttn($order_id,$city,$warehouse,$name,$surname,$phone,$weight,$pub_price,$date,$payer=0){
		$xml='
		
		'.NP::$api_key.'
		
	        
            
        ';
		
		$xml = simplexml_load_string(NP::send($xml));
		return array('oid'=>$order_id,'ttn'=>trim($xml->order->attributes()->np_id));
	} 
	
	 /**
	  * Запрос на удаление декларации из базы Новой почты
	  	$ttn — номер декларации, которую нужно удалить
	  */
	public static function remove($ttn){
		$xml='
		
		'.NP::$api_key.'
		'.$ttn.'
		';
		
		$xml = simplexml_load_string(NP::send($xml));
	}
	 /**
	  * Запрос на печать маркировок для декларации (производит перенаправление на страницу печати)
	  	$ttn — номер декларации, которую нужно напечатать
	  */	
	public static function printit($ttn){
		header('location: http://orders.novaposhta.ua/pformn.php?o='.$ttn.'&num_copy=4&token='.NP::$api_key);
	}
	
	
	 /**
	  * Запрос на получение списка складов Новой почты для определённого города (или полный список, если город не указан)
	  	$filter — город, по которому нужно отфильтровать список складов Новой почты
	  */
	public static function warenhouse($filter=false){
		$xml='
		
		'.NP::$api_key.'
		';
		if($filter){
			$xml.=''.$filter.'';
		}
		$xml.='';
		
		$xml = simplexml_load_string(NP::send($xml));
		return($xml);
	}
	
	
	 /**
	  * Запрос на получение списка населённых пунктов, в которых есть склады Новой почты
	  */	
	public static function city(){
		$xml='
		
		'.NP::$api_key.'
		
		';
		
		$xml = simplexml_load_string(NP::send($xml));
		return($xml);
	}

		 
 }

Что может делать класс?

  • отправлять запросы на сервер Новой почты
  • рассчитывать стоимость доставки
  • создавать декларацию на отправку
  • удалять декларацию из базы Новой почты
  • получать список складов Новой почты по городу (и без)
  • получать список городов, в которых есть отделение Новой почты
  • печатать маркировку для отправки посылки по декларации

Как работать с классом?

Очень просто. Нужно заинклудить файл класса, вызвать нужную функцию. Экземпляр класса создавать не нужно (функции работают как статические).

include_once('novaposhta.php');
NP::ttn(...);

Документация к API Новой почты

Если класс не достаточно широк (мы его делали для своих нужд), то ниже приводим PDF с документацией по всем запросам Новой почты. (Это если у вас совсем нет доступа в личный кабинет новой почты).
[dl url=’http://htmler.ru/wp-content/uploads/2013/08/orders.novaposhta.ua-API__.pdf’ title=’Документация к API Новой почты’ desc=’Версия с сайта Новой почты’ type=’PDF’]