Перейти к содержимому


Фото
* * * * * 3 голосов

Внедрение API Нова Пошта


  • Чтобы отвечать, сперва войдите на форум
45 ответов в теме

#1 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 06.09.2013 - 11:34

Здравствуйте. 

Есть готовый файл классов для работы с API запросами 

http://pastebin.com/mWMRy4eF

1. Создаем файл с классом и кидаем в 

api/novaposhta.php 

2. Далее нужно зарегистрировать свойство и класс.

Открываем api/Simpla.php и там где

// Свойства - Классы API
    private $classes = array(
        'config'     => 'Config',
        'request'    => 'Request',
        'db'         => 'Database',
.....

 

Добавляем 

 
'NP'    =>  'novaposhta'



По сути класс уже есть. Но вопрос: Каким запросом вызвать функцию в шаблоне?

Например

/**
      * Запрос на получение списка населённых пунктов, в которых есть склады Новой почты
      */
public static function city()

Давайте вместе внедрим это для общего блага ёмаё.



#2 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 06.09.2013 - 13:13

Если бы можно было писать обычный синтаксис PHP, то проблемы бы никакой у меня не было
А здесь Smarty.  -_-
 
 



#3 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 12.09.2013 - 18:56

Народ, помогите кто нибудь пожалуйста! :( 



#4 mart

mart

    Дружу с Симплой

  • Модератор
  • 1 331 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Venlo

Опубликовано 14.09.2013 - 23:27

Уважаемые программисты
Вот в такой бредовой теме, где человек не знает что такое html css - вы активничаете и отписываетесь
А вот в моей теме, где действительно нужна ваша помощь в smarty php - никто помочь не хочет
Обидно :( :(

В Вашей теме нет конкретного вопроса, на который можно ответить... А так там просто: у меня есть код - что с ним дальше делать...

#5 Gloobus

Gloobus
  • Фрилансер
  • 126 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Москва

Опубликовано 30.09.2013 - 22:26

А в чем собственно проблема? Класс уже есть, написан...

Если вы к примеру хотите вывести города в корзине, открываем CartView.php и передаем в шаблон:

$this->design->assign('citys', $this->NP->cyty());

а далее в шаблоне разбираем циклом:

Список городов: 
{foreach $citys as $city}

{$city->xxx}, 

{/foreach}

а вот уже xxx это уже то, что возвращает city()...

 

Я так понял, что возвращает она всегда xml, он потом интерпретирует ее в объект.

 

Попробуй в том же CartView.php отправь в шаблон регультат var_dump того, что вернет city(), а в шаблоне просто выведи посмотреть.

У меня просто api_key нету, что бы что-то пробовать, да и не интересна мне УкрПочта :)



#6 tumanenko

tumanenko
  • Пользователь
  • 136 сообщений
  • Заказчик
  • Откуда:Харьков

Опубликовано 05.10.2013 - 11:31

Просто выводить данные о состоянии груза не интересно.

Было бы интересно, если бы скрипт передавал данные о габарите и весе груза с описания на сайте в базы новой почты, так бы экономилось время на заполнении деклараций.

 

А просто показывать где груз не особо то и интересно, особенно с учетом того, что он обычно за сутки доезжает до места получения



#7 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 05.10.2013 - 17:57

Просто выводить данные о состоянии груза не интересно.

Было бы интересно, если бы скрипт передавал данные о габарите и весе груза с описания на сайте в базы новой почты, так бы экономилось время на заполнении деклараций.

 

А просто показывать где груз не особо то и интересно, особенно с учетом того, что он обычно за сутки доезжает до места получения

Вообще то сабж о выводе все отделений НП в корзине заказа в строке "Адрес"

О чем вы - я не знаю.



#8 pedro

pedro
  • Пользователь
  • 26 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Simferopol, Ukraine

Опубликовано 08.10.2013 - 18:47

Vladq, а в файле классов ключ к API от балды или рабочий?



#9 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 08.10.2013 - 19:16

Vladq, а в файле классов ключ к API от балды или рабочий?

Рабочий.

И было бы хорошо чтобы вы приняли участие в сабже, а не обошлись сам по себе или "моя хата скраю" как у нас принято.



#10 pedro

pedro
  • Пользователь
  • 26 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Simferopol, Ukraine

Опубликовано 13.10.2013 - 09:02

Рабочий.

И было бы хорошо чтобы вы приняли участие в сабже, а не обошлись сам по себе или "моя хата скраю" как у нас принято.

 

можете мне в icq стукнуть 296892275



#11 Fors

Fors
  • Пользователь
  • 1 сообщений
  • Версия CMS:2.x

Опубликовано 15.10.2013 - 21:49

У меня примерно так сделано

{if stristr($delivery->name,"Нова Пошта")}
Город/Склад
{elseif stristr($delivery->name,"Ин-Тайм")}
Город/Склад
{/if}


#12 tumanenko

tumanenko
  • Пользователь
  • 136 сообщений
  • Заказчик
  • Откуда:Харьков

Опубликовано 18.10.2013 - 22:06

Вообще то сабж о выводе все отделений НП в корзине заказа в строке "Адрес"

О чем вы - я не знаю.

Ммм. Вот сейчас я уже вник что это. Очень хорошее решение.

 А писал я о api Новой Почты, для отслеживания посылок. 

 

Сейчас в процессе изучения существующих наработок с api новой почты, странно что никто не реализовал автопросчет стоимости, заполнение электронных деклараций непосредственно из админки симплы. Мне например иногда не в кайф в очереди сидеть на новой почте, а так пришел с уже наклеенными декларациями и минимум на одну очередь меньше стоять.



#13 tumanenko

tumanenko
  • Пользователь
  • 136 сообщений
  • Заказчик
  • Откуда:Харьков

Опубликовано 18.10.2013 - 23:12

И сразу вопрос по другим функциям, которые вы когда-то озвучивали:

http://forum.simplac...vimi-sluzhbami/

"- К заказу грамотно продумать и прикрутить номер ТТН, для онлайн мониторинга статуса посылки заказчиком.
- Ну и очень бы хотелось реализовать полу-автоматическое СМС-информирование того же ТТН, или трек-номера, на телефон заказчика, через любой доступный SMS шлюх с открытым API. Уж ооочень много драгоценного времени занимает ручная SMS рассылка номеров ТТН клиентам."

 

Что-то из этого было реализовано?

 

Устал в ручную писать sms с номером декларации, да и 60% моих товаров имеют одинаковую стоимость доставки, что наводит на мысль о каком-то ускорении составления деклараций Новой Почты через API 



#14 Yushi

Yushi
  • Пользователь
  • 15 сообщений
  • Версия CMS:2.x

Опубликовано 23.10.2013 - 16:50

Для себя разобрался с классом.Кому нужно пишите.



#15 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 10.11.2013 - 19:22

И сразу вопрос по другим функциям, которые вы когда-то озвучивали:

http://forum.simplac...vimi-sluzhbami/

"- К заказу грамотно продумать и прикрутить номер ТТН, для онлайн мониторинга статуса посылки заказчиком.
- Ну и очень бы хотелось реализовать полу-автоматическое СМС-информирование того же ТТН, или трек-номера, на телефон заказчика, через любой доступный SMS шлюх с открытым API. Уж ооочень много драгоценного времени занимает ручная SMS рассылка номеров ТТН клиентам."

 

Что-то из этого было реализовано?

 

Устал в ручную писать sms с номером декларации, да и 60% моих товаров имеют одинаковую стоимость доставки, что наводит на мысль о каком-то ускорении составления деклараций Новой Почты через API 

ffI2kAD.png

 

Именно так у меня выглядит СМС информирование.



#16 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 10.11.2013 - 19:31

Кстати, может кому пригодится.

Пока самая дешевая смс рассылка в Украине на этот момент

API sms-sms-.com.ua

0,13 коп. за СМС по Украине

http://pastebin.com/Qd54WGAH



#17 Vladq

Vladq
  • Пользователь
  • 136 сообщений

Опубликовано 10.11.2013 - 19:34

Для себя разобрался с классом.Кому нужно пишите.

 

Нужно многим

Выложите здесь, в этой теме.



#18 tumanenko

tumanenko
  • Пользователь
  • 136 сообщений
  • Заказчик
  • Откуда:Харьков

Опубликовано 10.11.2013 - 21:26

ffI2kAD.png

 

Именно так у меня выглядит СМС информирование.

Круто! И я такое хочу :)
 



#19 Yushi

Yushi
  • Пользователь
  • 15 сообщений
  • Версия CMS:2.x

Опубликовано 03.07.2014 - 15:00

Итак пишу, как сделал у себя:

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

 

В папке api/ создаем файл NP.php c содержимым:

<?php
  
require_once('Simpla.php');

 class NP extends Simpla{
 	/* Город отправителя */
	 public  $out_city='Киев';
 	/* Отправитель */	 
	 public  $out_company='ПП Петров';
 	/* Склад */	 
	 public  $out_warehouse='1';	 
 	/* Представитель отправителя */	 
	 public  $out_name='Петров Иван Иваныч';	 
 	/* Телефон отправителя */	 
	 public  $out_phone='0671234567';	 
 	/* API ключ */	 
	 public  $api_key='0166186b16d0e49771a0aebf25ac4770';	 
 	/* Описание посылки */	 
	 public  $description='Взуття';
 	/* Описание упаковки */	 
	 public  $pack='Коробка';	 
	 	 
	 /**
	  * Функция отправки запроса на сервер Новой почты
	  	$xml — запрос
	  */
	  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  function price($to_city,$weight,$pub_price,$date,$height=0,$width=0,$depth=0){
		$xml='<?xml version="1.0" encoding="utf-8"?>
		<file>
		<auth>'.NP::$api_key.'</auth>
		<countPrice>
        	<senderCity>'.NP::$out_city.'</senderCity>
        	<recipientCity>'.$to_city.'</recipientCity>
        	<mass>'.$weight.'</mass>
        	<height>'.$depth.'</height>
        	<width>'.$width.'</width>
        	<depth>'.$depth.'</depth>
        	<publicPrice>'.$pub_price.'</publicPrice>
        	<deliveryType_id>4</deliveryType_id>
        	<floor_count>0</floor_count>
        	<date>'.$date.'</date>
        	</countPrice>
        </file>';
		
		$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  function ttn($order_id,$city,$warehouse,$name,$surname,$phone,$weight,$pub_price,$date,$payer=0){
		$xml='<?xml version="1.0" encoding="utf-8"?>
		<file>
		<auth>'.NP::$api_key.'</auth>
		<order
	        order_id="'.$order_id.'"
	
	        sender_city="'.NP::$out_city.'"
	        sender_company="'.NP::$out_company.'"
	        sender_address="'.NP::$out_warehouse.'"
	        sender_contact="'.NP::$out_name.'"
	        sender_phone="'.NP::$out_phone.'"
	
	        rcpt_city_name="'.$city.'"
	        rcpt_name="ПП '.$surname.'"
	        rcpt_warehouse="'.$warehouse.'"
	        rcpt_contact="'.$name.'"
	        rcpt_phone_num="'.$phone.'"
	        
	        pack_type="'.NP::$pack.'"
	        description="'.NP::$description.'"
	
	        pay_type="1"
	        payer="'.$payer.'"
	
	        cost="'.$pub_price.'"
	        date="'.$date.'" 
	        weight="'.$weight.'">
	        <order_cont
            	cont_description="'.NP::$description.'" />
            </order>
        </file>';
		
		$xml = simplexml_load_string(NP::send($xml));
		return array('oid'=>$order_id,'ttn'=>trim($xml->order->attributes()->np_id));
	} 
	
	 /**
	  * Запрос на удаление декларации из базы Новой почты
	  	$ttn — номер декларации, которую нужно удалить
	  */
	public  function remove($ttn){
		$xml='<?xml version="1.0" encoding="utf-8"?>
		<file>
		<auth>'.NP::$api_key.'</auth>
		<close>'.$ttn.'</close>
		</file>';
		
		$xml = simplexml_load_string(NP::send($xml));
	}
	 /**
	  * Запрос на печать маркировок для декларации (производит перенаправление на страницу печати)
	  	$ttn — номер декларации, которую нужно напечатать
	  */	
	public  function printit($ttn){
		header('location: http://orders.novaposhta.ua/pformn.php?o='.$ttn.'&num_copy=4&token='.NP::$api_key);
	}
	
	
	 /**
	  * Запрос на получение списка складов Новой почты для определённого города (или полный список, если город не указан)
	  	$filter — город, по которому нужно отфильтровать список складов Новой почты
	  */
	public  function warenhouse($filter=false){
		$xml='<?xml version="1.0" encoding="utf-8"?>
		<file>
		<auth>'.NP::$api_key.'</auth>
		<warenhouse/>';
		if($filter){
			$xml.='<filter>'.$filter.'</filter>';
		}
		$xml.='</file>';
		
		$xml = simplexml_load_string(NP::send($xml));
		return($xml);
	}
	
	
	 /**
	  * Запрос на получение списка населённых пунктов, в которых есть склады Новой почты
	  */	
	public function city(){
		$xml='<?xml version="1.0" encoding="utf-8"?>
		<file>
		<auth>'.NP::$api_key.'</auth>
		<city/>
		</file>';
		
		$xml = simplexml_load_string(NP::send($xml));
		return($xml);
	}
	
	public function tracking($ttn){
	$xml='
	<?xml version="1.0" encoding="UTF-8"?>
	<file>
    <auth>'.$this->api_key.'</auth>
    <tracking>
       <barcode>'.$ttn.'</barcode>
    </tracking>
	</file>';
	$xml = simplexml_load_string($this->send($xml));
	//var_dump($xml);
	return($xml);
	
	}
	
		 
 }

Далее в таблицу s_orders, добавим поле:

14e6f4273656.png

Теперь в файле simpla/OrderAdmin.php
после кода:
$order->comment = $this->request->post('comment');

Добавим:

$order->delivery_number  = $this->request->post('delivery_number');

 

перед кодом:

$this->design->assign('purchases', $purchases);
        $this->design->assign('purchases_count', $purchases_count);
        $this->design->assign('subtotal', $subtotal);
        $this->design->assign('order', $order);

Добавляем:

//Статус по номеру ТТН из новой почты
		if ($order->delivery_number)
		{
		$this->design->assign('tracking', $this->np->tracking($order->delivery_number));
		}

В шаблоне: simpla/design/html/order.tpl

после:

		<li>
			<label class=property>Адрес <a href='http://maps.yandex.ru/' id=address_link target=_blank><img align=absmiddle src='design/images/map.png' alt='Карта в новом окне' title='Карта в новом окне'></a></label>
			<div class="edit_order_detail" style='display:none;'>
				<textarea name="address">{$order->address|escape}</textarea>
			</div>
			<div class="view_order_detail">
				{$order->address|escape}
			</div>
		</li> 

Добавляем:

<li>
			<label class=property>Номер посылки</label>
			<div class="edit_order_detail" style='display:none;'>
				<input name=" delivery_number" class="simpla_inp " type="text" value="{$order-> delivery_number|escape}" />
			</div>
			<div class="view_order_detail">
				{$order-> delivery_number|escape}
			</div>
		</li>
		
				<li>
			<label class=property>Статус посылки</label>
			<div class="view_order_detail">
				<b>{$tracking->document["status"]}</b>
			</div>
		</li> 

 

 

Далее, в файле view\OrderView.php:

После кода:

// Все валюты
		$this->design->assign('all_currencies', $this->money->get_currencies());

Добавим:

// Получим статус посылки по номеру ТТН от Новой почты
        
 $this->design->assign('tracking', $this->np->tracking($order->delivery_number));

И наконец в шаблоне пользователя design/вашшаблон/order.tpl

после:

{if $order->name}
	<tr>
		<td>
			Имя
		</td>
		<td>
			{$order->name|escape}
		</td>
	</tr>
	{/if}

Добавляем инфу о номере и статусе посылки:

{if $order->delivery_number}
	<tr>
		<td>
			Номер посылки
		</td>
		<td>
			{$order->delivery_number|escape}
			<br />
			Статус в Новой Почте: <br />
			<b>{$tracking->document["status"]}</b>
		
		</td>
	</tr>
	{/if}

Вроде бы все.

Если что забыл пишите.

 



#20 Wallkar

Wallkar
  • Пользователь
  • 5 сообщений
  • Пользователь

Опубликовано 02.08.2015 - 22:11

Не работает код, после завершения заказа ошибка:

 


Fatal error: Call to a member function tracking() on a non-object in /home/virtwww/w_shop_113c0b12/http/view/OrderView.php on line 116






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых