Геокодирование и локация

В данной статье https://phpjs.ru/2017/03/21/google-geolocation-api/ я писал как получить координаты по ip и далее адрес по координатам., используя яндекс, гугл апи. Практика показала, что оба сервиса никчемны. Во-первых, апи гугл платно. Во вторых апи яндекса постоянно блочиться из-за каких то там их политик конфид-ти. Тем временем адрес и координаты можно получить 2 строчками кода.

function getIPYou(){
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){
        //check ip from share internet
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        //to check ip is pass from proxy
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;    
}

$city = json_decode(file_get_contents('http://ip-api.com/json/'.getIPYou()), true);

в ответе даже адрес уже есть

Array
(
    [status] => success
    [country] => Russia
    [countryCode] => RU
    [region] => SAM
    [regionName] => Samara Oblast
    [city] => Samara
    [zip] => 404146
    [lat] => 53.1813
    [lon] => 50.1218
    [timezone] => Europe/Samara
    [isp] => AIST Networks
    [org] => 
    [as] => AS8439 JSC AIST
    [query] => 62.106.126.87
)

Геокодирование

$latlng = '53.1813,50.1218';
$city = file_get_contents("https://geocode.xyz/$latlng?geoit=json");

ответ

Array
(
    [statename] => Array
        (
        )

    [distance] => 0.073
    [elevation] => 41
    [osmtags] => Array
        (
            [wikidata] => Q4178963
            [boundary] => administrative
            [name] => Железнодорожный район
            [type] => boundary
            [admin-level] => 9
        )

    [state] => RU
    [latt] => 53.18175
    [city] => Samara
    [prov] => RU
    [geocode] => SAMARA-NNBVZ
    [geonumber] => 8481645241783
    [country] => Russian Federation
    [stnumber] => Array
        (
        )

    [staddress] => Нечаевская улица
    [inlatt] => 53.18130
    [alt] => array ...

    [timezone] => Europe/Samara
    [region] => Samara Oblast
    [postal] => 443041
    [poi] => array ...

    [longt] => 50.12260
    [remaining_credits] => Array
        (
        )

    [confidence] => 0.9
    [inlongt] => 50.12180
    [class] => residential
    [altgeocode] => TASHM-NNBVZ
)

php вывод ошибок

  1. В самом скипте
error_reporting(E_ALL);
 ini_set('display_errors','On');
ini_set("error_log", __DIR__."/php-error.log");

2. В настройках php.ini

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
// логировать ошибки
log_errors = On
error_log = php_errors.log

3. В .htaccess

php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag  log_errors on
php_value error_reporting E_ALL  
php_value error_log  PHP_errors.log

paymaster запрос для онлайн-касс

С появлением онлайн-касс paymaster поспешил обновить апи, к-е почему то не представлено на сайте, а доступно только после общения с ТП. Для печати чеков пеймастер добавил в запрос параметры товаров LMI_SHOPPINGCART. (далее…)

php webdav yandex-disk

Бэкапы можно хранить на яндекс диске. Складируем их по протоколу webdav на php. Есть клиент под этот протокол. Качаем http://sabre.io/dav/install/


composer require sabre/dav ~3.2.0

Документация не самая полная, однако в коде куча комментов, так что без проблем разобраться. Нужен модуль php-dom.


use Sabre\DAV\Client;

include 'vendor/autoload.php';

$settings = array(
    'baseUri' => 'https://webdav.yandex.ru',
    'userName' => 'user',
    'password' => 'pass123',
    // 'proxy' => 'locahost:8888',
);

// должна лежать на уровень выше текущей папки
$LOCAL_back_folder = 'backups';
$YA_back_folder = 'my_backups';

$client = new Client($settings);


Для начала получим список директорий с бэкапами на ЯД, и удалим старые.

(далее…)

shiptor api добавление посылки

Создадим посылку, используя сервис. Shiptor предоставляет Public и Shipping api. Нам нужен 2-й, метод addPackage.
Код можно скачать с этого репозитория https://github.com/esteit/shiptor-russia-php-api-client . Можно воспользоваться примером shiptor-russia-php-api-client/samples/ShippingEndpoint/AddPackage.php (далее…)

ПЭК публичный апи для расчета стоимости доставки

Публичное апи для расчета стоимости перевозки достаточно простое. Делаем GET запрос на адрес http://calc.pecom.ru/bitrix/components/pecom/calc/ajax.php. В параметрах передаем габариты груза, город отправки и доставки. Обратите внимание, минусы для городов обязательны!
(далее…)

symfony form

Создадим форму симфони.
Понадобятся всего 4 зависимости.


      "require": {
        "symfony/form": "^3.3",
		"symfony/twig-bridge": "^3.3",
		"symfony/translation": "^3.3",
		"symfony/security-csrf": "^3.3"
      }

Далее подключаем классы формы, твига, переводчика и защиту от Csrf атак.
(далее…)

google captcha v2

Гугл капча сейчас везде. Плюс ее в том что она заменяет CSRF-токен.

Регистрируем свой домен по ссылке https://www.google.com/recaptcha/admin#list . Получаем ключи. Гугл предоставляет свое мини-апи для запросов на проверку.   Скачать его можно тут https://github.com/vaajnur/recaptcha2

Кстати, если не любите ооп и композер, в конце статьи есть способ проверки капчи всего лишь 3мя строчками кода.

Размещаем на страничке HTML-код капчи с секретным ключом.

Подключаем javascript


<script src='https://www.google.com/recaptcha/api.js'></script>

обработка отправленной капчи

(далее…)

php SOAP api на примере DPD

Поработаем с протоколом SOAP на примере DPD api. Напишем запрос и получим результат.


// создаем объект клиента
$soap = new SoapClient( 'http://ws.dpd.ru/services/geography2?wsdl' );
// вызовем метод getCitiesCashPay
$obj = $soap->getCitiesCashPay($arData);
// в параметрах можно передать только ключи. Внимание, здесь нерабочие ключи
$arData['request']['auth'] = array(
			'clientNumber' => 1230000123,
			'clientKey' => '023E2F77487F5BF05B663ACBB95F42079D961111');

(далее…)

composer autoload

В Composer 2 основные директивы: autoload для загрузки кастомных классов, require — для сторонних библиотек.
Рассмотрю автозагрузку файлов.

Создаем пустой класс  Api в Api.php . Заметьте, название класса должно совпадать с именованием файла.


class Api{

	public function __construct(){
		echo "class Api";
	}
}

(далее…)

php REST api

Первое знакомство с rest api для новичка может оказаться затруднительным, т.к. просто и с толком нигде не объяснено. Люди пытаются показать на примерах микрофреймворков, тем самым усугубляя ситуацию.
На самом деле все просто — rest api это запрос, при к-м передается не просто переменные,как при POST или GET, а самый настоящий xml или json, в ответе получая такой же формат. Покажу на примере yandex geolocation. Геолокацию с использованием api на ООП я публиковал http://phpjs.ru/2017/03/21/google-geolocation-api/ ‎.  Здесь покажу голый запрос.
Создаем минимальный json. Ключ к апи геолокации яндекса надо получить. Заметьте, почти все сервисы для протокола rest требуют авторизации, напр. в amocrm, shiptor, google geo, elba бухгалтерия, sms рассылка — все они дают 200 ответ только при авторизации.
(далее…)

sip телефония

Первое знакомство с сип телефонией. Не буду углубляться в технологии  виртуальных АТС, sip server asterisk  и проч. Просто зарегаем бесп. sip аккаунты и используем любой sip клиент (так называемый софтфон).



Сервисы бесп. sip аккаунтов — ekiga.net, iptel.org, sip2sip.info, sipnet.ru . После реги-ии ваш аккаунт будет выглядеть довольно привычным образом: user1@sip.domen.ru

(далее…)

google geolocation api , php yandex locator

Получим город с помощью google geo api, а также яндекс Локатор . Апи обоих практически идентичны, надо получить апи-ключ и там и там. Запросы в гугл-апи пишем сами, в яндексе все уже есть, просто скачайте по ссылке.
Для начала надо создать проект, чтобы получить ключ. Далее все просто: делаем http POST запрос, с параметрами в формате JSON.

(далее…)

MVC приложение на php. Часть 6. crud, mapping

В этой статье сделаем админку полезной — она сможет создавать статьи, категории, редактировать, удалять. А также привяжем статьи к категориям.
Плодить контроллеры не будем, все добавим в 2 базовых.
Итак, форма для ред-ия та же что для просмотра, соот-но экшн будет одинаковый. Принимаем post данные

application/controllers/admin/articles.php
(далее…)

MVC приложение на php. Часть 5. Админ панель.

На этом уроке рассмотрю создание админ панели. Отделение admin от client мы сделали заранее, это плюс. Осталось добавить контрол-ры, модели, вьюхи для админской части. Тему я взял Admin LTE от того же бутстрап, версия еще 1-я.
Решил заменить имена классов, чтобы избавиться от zendовского snake case. Поменял namespace для каждого класса, сделал его соответствующим пути.

application/controllers/client/articles.php
(далее…)