cdek widget

https://widget.cdek.ru/

Логин и пароль от кабинета — это номер договора и ИНН, пароль следует поменять.

библиотеки виджета

<script id="ISDEKscript" type="text/javascript" src="widget/widjet.js"></script>
<script type="text/javascript" src="sdek.js"></script>
(далее…)

Водные знаки для картинок

Наложим сразу несколько картинок поверх основной.

<?php
// исходное изображение
$base_img="car.jpg";


// imagecreatetruecolor - создаёт новое изображение true color
// $result_image=imagecreatetruecolor($baseWidth, $baseHeight);

// выясняем расширение изображения на которое будем накладывать водяной знак
if(preg_match("/.gif/i",$base_img)):
	$result_image=imagecreatefromgif($base_img);
elseif(preg_match("/.jpeg/i",$base_img) or preg_match("/.jpg/i",$base_img)):
	$result_image=imagecreatefromjpeg($base_img);
elseif(preg_match("/.png/i",$base_img)):
	$result_image=imagecreatefrompng($base_img);
else:
	die("Ошибка! Неизвестное расширение изображения");
endif;
// узнаем размер изображения
// imagesx - получает ширину изображения
// imagesy - получает высоту изображения
$baseWidth=imagesx($result_image);
$baseHeight=imagesy($result_image);
// $size=getimagesize($base_img);

// указываем координаты, где будет располагаться водяной знак
/*
* $size[0] - ширина изображения
* $size[1] - высота изображения
* - 10 -это расстояние от границы исходного изображения
*/
// $cx=$size[0]-$baseWidth-10;
// $cy=$size[1]-$baseHeight-10;
$cx=0;
$cy=0;

/* imagecopyresampled - копирует и изменяет размеры части изображения
* с пересэмплированием
*/

$arr_of_waters = ['img/fari.png', 'img/nomer.png'];
// imagecreatefrompng - создаёт новое изображение из файла или URL
// водяной знак
// 
foreach ($arr_of_waters as $key => $value) {
	$info = pathinfo($value);
	$imgs_water[] = $info['filename'];

	$water=imagecreatefrompng($value);
	imagecopyresampled ($result_image, $water, $cx, $cy, 0, 0, $baseWidth, $baseHeight, $baseWidth, $baseHeight);
	imagedestroy($water);
}

/* imagejpeg - создаёт JPEG-файл filename из изображения image
* третий параметр - качество нового изображение 
* параметр является необязательным и имеет диапазон значений 
* от 0 (наихудшее качество, наименьший файл)
* до 100 (наилучшее качество, наибольший файл)
* По умолчанию используется значение по умолчанию IJG quality (около 75)
*/
$base_img_new = pathinfo($base_img)['filename'].$baseWidth.'_'.$baseHeight.implode('', $imgs_water).'.jpg';
if(file_exists($base_img_new)){
	echo "exist!";
	echo $base_img_new;
	return;
}
imagejpeg($result_image,$base_img_new,100);

// imagedestroy - освобождает память
imagedestroy($result_image);


// на всякий случай
// unset($result_image,$base_img);

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

В данной статье 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() . '?lang=ru'), true);

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

array(14) {
  ["status"]=>
  string(7) "success"
  ["country"]=>
  string(12) "Россия"
  ["countryCode"]=>
  string(2) "RU"
  ["region"]=>
  string(2) "TA"
  ["regionName"]=>
  string(18) "Татарстан"
  ["city"]=>
  string(31) "Набережные Челны"
  ["zip"]=>
  string(6) "423822"
  ["lat"]=>
  float(55.7866)
  ["lon"]=>
  float(52.4385)
  ["timezone"]=>
  string(13) "Europe/Moscow"
  ["isp"]=>
  string(24) "JSC "ER-Telecom Holding""
  ["org"]=>
  string(51) "CJSC "ER-Telecom Holding" Naberezhnye Chelny branch"
  ["as"]=>
  string(30) "AS42116 JSC ER-Telecom Holding"
  ["query"]=>
  string(11) "95.78.20.39"
}

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

$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.

(далее…)