среда, 16 июля 2014 г.

Qiwi. Форма и обработка запроса

Статья о платежной системе Qiwi. Рассмотрим только html форму и обработку запроса от сервера. Это можно использовать, например, для пополнения счета или оплату товара на сайте.

PULL (REST) протокол


Вместо старой html формы рассмотрим новый протокол, который полностью ее заменил
Сначала нужно выставить пользователю счет. Для этого отправим запрос через cURL:
$url = 'https://w.qiwi.com/api/v2/prv/'.$shopid.'/bills/'.$id;
$loginPass = $apiid.':'.$pass;
$lifetime = date('c', time() + 86400);
$parameters = array(
    "user" => "tel:+".intval($mobile),
    "amount" => $amount,
    "ccy" => $currency,
    "comment" => $comment,
    "lifetime" => $lifetime,
    "pay_source" => "qw"
);
$headers = array(
 "Accept: application/json",
 "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
);
$parameters = http_build_query($parameters);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $loginPass);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
curl_setopt($ch, CURLOPT_POST, 1);
$httpResponse = curl_exec($ch);
$results = json_decode($httpResponse);
$result_code = $results->response->result_code;
$description = $results->response->description;

$shopid - Идентификатор вашего магазина
$id - ID платежа в вашей системе. Будет использован для поиска нужного платежа в вашей БД
$apiid - Ваш API ID
$pass - Пароль API
$mobile - Телефон (аккаунт) пользователя, на который будет выставлен счет
$amount - Сумма, на которую выставляется счет
$currency - Валюта. По-умолчанию доступна только RUB (рубли РФ)
$comment - Описание платежа
$lifetime - Время, которое выставленный счет будет активен (можно оплатить). В примере - сутки.
$result_code - Код ответа сервера. Если не равен 0 - ошибка.
$description - Текст ошибки, если она есть

Счет выставили, теперь нужно отправить пользователя на оплату. Сгенерируем ссылку:
$url = 'https://w.qiwi.com/order/external/main.action?shop='.$shopid.'&transaction='.$id.'&successUrl='.$success_url.'&failUrl='.$fail_url.'&qiwi_phone='.$mobile;

$shopid - Идентификатор вашего магазина (тот-же, что и выше)
$id - ID платежа в вашей системе. Будет использован для поиска нужного платежа в вашей БД (тот-же, что и выше)
$success_url - Ссылка на страницу успешной оплаты (Вернуться на ваш сайт после оплаты)
$fail_url - Ссылка на страницу ошибки или отказа от оплаты (Вернуться на ваш сайт после неудачной оплаты)
$mobile - Телефон (аккаунт) пользователя, на который будет выставлен счет (тот-же, что и выше)

И отправляем пользователя на этот URL, например так:
header('Location: '.$url);


Настройка аккаунта


Настроить аккаунт можно по адресу: https://ishop.qiwi.com/balance/overview.action (официальный сайт Qiwi)
Нужно создать проект: "Новый проект". Поля элементарные, описывать не буду. Обратите внимание, что API будут работать только после проверки проекта администрацией Qiwi (статус "Подтвержден").
Переходим в настройки проекта, кликом на его название:
Аутентификационные данные для всех протоколов - Сгенерировать новый ID. Записать в свою БД (Идентификатор - переменная $apiid в этой статье, пароль - переменная $pass)
Идентификатор магазина - Записать в свою БД (переменная $shopid в этой статье)
Настройки Pull (REST) протокола - Включить
Включить уведомления - Включить
URL для оповещения - Ссылка на файл обработки операции. Описание содержания этого файла смотрите в пункте "Обработка запроса" этой статьи
Сменить пароль оповещения - нажать и сохранить пароль в БД (переменная $key в этой статье)
Подпись - Отметить галочкой


Обработка запроса


После оплаты платежная система присылает запрос на указанный вами URL для оповещения. В этом файле, в первую очередь, необходимо проверить подлинность запроса, ведь он мог быть запущен не платежной системой. После чего уже делаем нужны операции: изменение статуса платежа в вашей БД или пополнение счета пользователя на сайте. Начнем по порядку.
Система присылает следующие данные (сразу сократим названия переменных, зачем нам в коде длинные переменные?):
$id          =trim($_POST['bill_id']);
$status      =trim($_POST['status']);
$error       =trim($_POST['error']);
$amount      =trim($_POST['amount']);
$user        =trim($_POST['user']);
$prv_name    =trim($_POST['prv_name']);
$ccy         =trim($_POST['ccy']);
$comment     =trim($_POST['comment']);
$command     =trim($_POST['command']);
$head        =apache_request_headers();
$hash        =$head['X-Api-Signature'];

bill_id - ID платежа в вашей системе
status - Статус платежа. Успешный: paid
error - Ошибка, если она есть
amount - Сумма платежа
user - Телефон (аккаунт) пользователя, который оплатил счет
ccy - Валюта платежа
comment - Описание платежа
X-Api-Signature - Подпись запроса (хеш)

Теперь нужно проверить хеш. Это обязательное действие. Без него безопасность данной операции будет близка к нулю.
Создадим свой вариант хеша, по возможности используя данные из своей БД (постфикс _bd в переменных; используйте $id для поиска нужной транзакции):
$hash_gen = base64_encode(hash_hmac("sha1", $amount_bd.'|'.$id.'|'.$ccy_bd.'|'.$command.'|'.$comment.'|'.$error.'|'.$prv_name.'|'.$status.'|'.$user_bd, $key, $raw_output=TRUE));
if($hash_gen!=$hash) // ошибка

Переменная $key - пароль оповещения, который вы встречали в настройках аккаунта

С проверками закончили. Теперь можно сделать то, ради чего этот запрос пришел - изменить статус транзакции или пополнить счет пользователя, на ваше усмотрение. И эти действия я описывать не буду - все в ваших руках.

Осталось только вернуть системе правильный ответ.
Ответ для успешного завершения:
header("HTTP/1.1 200 OK");
header('content-type: text/xml; charset=UTF-8');
echo '0'; 
exit; 

Для завершения с ошибкой - измените result_code (0) на другой:
5 - Ошибка формата параметров запроса
13 - Ошибка соединения с базой данных
150 - Ошибка проверки пароля
151 - Ошибка проверки подписи
300 - Ошибка связи с сервером

Вот и все, запрос завершен и эта статья тоже.


понедельник, 14 июля 2014 г.

Яндекс Деньги. Форма и обработка запроса

Статья о платежной системе Яндекс Деньги. Рассмотрим только html форму и обработку запроса от сервера. Это можно использовать, например, для пополнения счета или оплату товара на сайте.

HTML форма


HTML форма располагается у вас на сайте и служит переходом с вашего сайта на сайт платежной системы. Передает ей все необходимые данные через POST запрос.
Код формы:

label - ID платежа в вашей системе. Будет использован для поиска нужного платежа в вашей БД
receiver - Ваш кошелек, на него будет происходить оплата (14 цифр)
sum - Сумма оплаты в рублях
quickpay-form - Тип транзакции (shop - универсальная форма; donate - «благотворительная» форма; small - кнопка)
paymentType - Определяет средство платежа (PC – оплата со счета Яндекс Денег; AC – оплата с банковской карты)
formcomment - Название платежа (до 50 символов)
short-dest - Название платежа на странице подтверждения
targets - Назначение платежа (до 150 символов)


Настройка аккаунта


Настроить нужные поля аккаунта можно по адресу: https://sp-money.yandex.ru/myservices/online.xml (официальный сайт Яндекс Денег)
Поле ввода - ссылка на файл обработки операции (далее URL). Описание содержания этого файла смотрите в пункте "Обработка запроса" этой статьи
Кнопка "Изменить секрет" - введите сюда какой-нибудь пароль и сохраните его в БД вашего сайта, он еще пригодится
Галочка "Отправлять уведомления" - нужно отметить, включит отправку запроса на URL, указанный выше.

Обработка запроса


После оплаты платежная система присылает запрос на указанный вами URL. В этом файле, в первую очередь, необходимо проверить подлинность запроса, ведь он мог быть запущен не платежной системой. После чего уже делаем нужны операции: изменение статуса платежа в вашей БД или пополнение счета пользователя на сайте. Начнем по порядку.
Система присылает следующие данные (сразу сократим названия переменных, зачем нам в коде длинные переменные?):
$id      =trim($_POST['label']);    
$order   =trim($_POST['operation_id']);       
$payer   =trim($_POST['sender']);      
$odate   =trim($_POST['datetime']);   
$code    =trim($_POST['codepro']);       
$amount  =trim($_POST['amount']);    
$wamount =trim($_POST['withdraw_amount']);   
$cur     =trim($_POST['currency']);   
$type    =trim($_POST['notification_type']);  
$hash    =trim($_POST['sha1_hash']);   

label - ID платежа, который вы указали в форме
operation_id - Идентификатор операции в истории счета получателя
sender - Для переводов из кошелька — номер счета отправителя. Для переводов с произвольной карты — параметр содержит пустую строку
datetime - Дата и время совершения перевода
codepro - Для переводов из кошелька — перевод защищен кодом протекции. Для переводов с произвольной карты — всегда false.
amount - Сумма, которая зачислена на ваш счет
withdraw_amount - Сумма, которая списана со счета отправителя (совпадает с суммой, указанной в форме)
currency - Код валюты — всегда 643 (Рубль РФ)
notification_type - Для переводов из кошелька — p2p-incoming; Для переводов с произвольной карты — card-incoming
sha1_hash - SHA-1 hash параметров уведомления.

Теперь нужно проверить хеш. Это обязательное действие. Без него безопасность данной операции будет близка к нулю.
Создадим свой вариант хеша:
$hash_gen = hash("sha1", $type.'&'.$order.'&'.$amount.'&'.$cur.'&'.$odate.'&'.$payer.'&'.$code.'&'.$key.'&'.$id);
if($hash_gen!=$hash) // ошибка

Заметили переменную $key, которая ранее нигде не фигурировала? Это секретный ключ, который вы вводили в настройках аккаунта. Система не присылает его, поэтому он должен храниться у вас в БД

С проверками закончили. Теперь можно сделать то, ради чего этот запрос пришел - изменить статус транзакции или пополнить счет пользователя, на ваше усмотрение. И эти действия я описывать не буду - все в ваших руках.

Осталось только вернуть системе правильный ответ. Тут все просто. Если обработка успешно завершена - отвечаем OK, а если нет - CANCEL
Пример правильного ответа:
exit('OK');


Вот и все, запрос завершен и эта статья тоже.


воскресенье, 13 июля 2014 г.

WebMoney. Форма и обработка запроса

Статья о платежной системе WebMoney. Рассмотрим только html форму и обработку запроса от сервера. Это можно использовать, например, для пополнения счета или оплату товара на сайте.

HTML форма


HTML форма располагается у вас на сайте и служит переходом с вашего сайта на сайт платежной системы. Передает ей все необходимые данные через POST запрос.
Код формы:

LMI_PAYEE_PURSE - Ваш кошелек, на него будет происходить оплата (буква - инициал кошелька и 12 цифр)
LMI_PAYMENT_NO - ID платежа в вашей системе. Будет использован для поиска нужного платежа в вашей БД
LMI_PAYMENT_AMOUNT - Сумма оплаты в валюте указанного кошелька (R кошелек - рубли, Z - доллары и т.д.)
LMI_PAYMENT_DESC - Описание платежа. Его увидит пользователь после перехода на оплату
user_field_1 - Дополнительное поле (не обязательное). Можно использовать для передачи дополнительных данных на ваш файл обработки

Так-же существует альтернативное поле LMI_PAYMENT_DESC_BASE64. Используется вместо обычного LMI_PAYMENT_DESC. Содержит в себе описание платежа закодированное в base64. Это решит проблему с кодировкой описания, если она возникает.

Настройка аккаунта


Настроить аккаунт можно по адресу: https://merchant.webmoney.ru/conf/purses.asp (официальный сайт WebMoney)
Настроить нужно все кошельки, которые вы собираетесь использовать (ссылка "настроить" рядом с каждым кошельком)
Поля, которые необходимо настроить:
Тестовый/Рабочий режимы - выкл - не принимает платежи, тестовый - отправляет запрос, но не отправляет средства, рабочий - все включено (он нам и нужен)
Торговое имя - название вашего сайта, его будут видеть пользователи во время оплаты
Secret Key - секретный ключ. Введите сюда какой-нибудь пароль и сохраните его в БД вашего сайта, он еще пригодится (НЕ отмечайте галочку рядом с этим полем)
Result URL - ссылка на файл обработки операции. Описание содержания этого файла смотрите в пункте "Обработка запроса" этой статьи (галочку рядом с этим полем отмечайте по желанию, она включает предзапрос)
Success URL - Ссылка на страницу успешной оплаты (Вернуться на ваш сайт после оплаты)
Fail URL - Ссылка на страницу ошибки или отказа от оплаты (Вернуться на ваш сайт после неудачной оплаты)
Метод формирования контрольной подписи - Выберите MD5

Остальные поля изменяйте по желанию или необходимости. На работу кодов, указанных в статье они влиять не будут.

Обработка запроса


После оплаты платежная система присылает запрос на указанный вами Result URL. В этом файле, в первую очередь, необходимо проверить подлинность запроса, ведь он мог быть запущен не платежной системой. После чего уже делаем нужны операции: изменение статуса платежа в вашей БД или пополнение счета пользователя на сайте. Начнем по порядку.
Система присылает следующие данные (сразу сократим названия переменных, зачем нам в коде длинные переменные?):
$id      =trim($_POST['LMI_PAYMENT_NO']);      
$pmode   =trim($_POST['LMI_MODE']);      
$payee   =trim($_POST['LMI_PAYEE_PURSE']);      
$payer   =trim($_POST['LMI_PAYER_PURSE']);   
$payerwm =trim($_POST['LMI_PAYER_WM']);       
$amount  =trim($_POST['LMI_PAYMENT_AMOUNT']);   
$pre     =trim($_POST['LMI_PREREQUEST']);   
$usr     =trim($_POST['user_field_1']);
$invs    =trim($_POST['LMI_SYS_INVS_NO']);   
$trans   =trim($_POST['LMI_SYS_TRANS_NO']);   
$tdate   =trim($_POST['LMI_SYS_TRANS_DATE']);   
$md5str  =strtoupper(trim($_POST['LMI_HASH'])); 

LMI_PAYMENT_NO, LMI_PAYEE_PURSE, LMI_PAYMENT_AMOUNT, user_field_1 - эти поля уже описаны выше. Система просто присылает указанные вами данные обратно.
LMI_MODE - 1 - тестовый платеж (средства не отправляются), 0 - реальный платеж
LMI_PAYER_PURSE - Кошелек плательщика. С этого кошелька пользователь оплатил эту транзакцию.
LMI_PAYER_WM - WMID плательщика.
LMI_PREREQUEST - Предзапрос или нет. Если предзапрос - нижние 4 поля не присылаются. Предзапрос предназначен для проверки работоспособности вашего сайта перед реальным запросом. Не производите никаких действий , кроме проверок, во время предзапроса.
LMI_SYS_INVS_NO - ID счета
LMI_SYS_TRANS_NO - ID платежа в платежной системе
LMI_SYS_TRANS_DATE - Дата платежа
LMI_HASH - MD5 хеш. Используется для проверки подлинности запроса.

Теперь нужно проверить хеш. Это обязательное действие. Без него безопасность данной операции будет близка к нулю.
Создадим свой вариант хеша, по возможности используя данные из своей БД (постфикс _bd в переменных; используйте $id для поиска нужной транзакции):
$md5string = strtoupper(md5($purse_bd.$amount_bd.$id.$pmode.$invs.$trans.$tdate.$key.$payer.$payerwm)); 
if($md5string!=$md5str) // ошибка

Заметили переменную $key, которая ранее нигде не фигурировала? Это секретный ключ, который вы вводили в настройках аккаунта. Система не присылает его, поэтому он должен храниться у вас в БД

С проверками закончили. Теперь можно сделать то, ради чего этот запрос пришел - изменить статус транзакции или пополнить счет пользователя, на ваше усмотрение. И эти действия я описывать не буду - все в ваших руках. Только не забудьте не производить этих действий, если это предзапрос ($pre).

Осталось только вернуть системе правильный ответ. Тут все просто. Если обработка успешно завершена - отвечаем YES, а если нет - любой другой текст, он будет воспринят как ошибка и показан пользователю. Такой ответ актуален и для предзапроса тоже.
Пример правильного ответа:
exit('YES');


Вот и все, запрос завершен и эта статья тоже.


четверг, 10 июля 2014 г.

Yandex Maps API. Установка и определение маршрутов

В этой статье я опишу два вида работы с маршрутами. 1 - автоматическая прокладка маршрута между двумя точками на карте. 2 - ручная прокладка маршрута с помощью линии.

Автоматический маршрут


Воспользуемся стандартной функцией прокладки маршрута:
var start_point = [56, 37];
var end_point = [57, 39];
ymaps.route([start_point, end_point], {
 mapStateAutoApply: true,
 avoidTrafficJams: false,
 multiRoute: false,
 routingMode: "auto",
 viaIndexes: []
}).then(function (route) {
 var points = route.getWayPoints();  
 points.get(0).properties.set('balloonContent', '');
 points.get(1).properties.set('balloonContent', 'Дистанция: '+route.getHumanLength()+'
Продолжительность: '+route.getHumanTime()); points.get(0).properties.set('iconContent', 'А'); points.get(1).properties.set('iconContent', 'Б'); map.geoObjects.add(route); }, function (error) { // Ошибка error.message });

start_point - Координаты или адрес точки начала маршрута
end_point - Координаты или адрес точки конца маршрута
mapStateAutoApply - Автоматически позиционировать карту
avoidTrafficJams - Включает построение маршрута с учетом пробок. При использовании опции учитывайте, что объезд пробок не всегда возможен.
multiRoute - Позволяет строить мультимаршруты.
routingMode - Тип маршрутизации для мультимаршрутов (auto - автомобильная маршрутизаци, masstransit - маршрутизация с использованием общественного транспорта)
viaIndexes – Индексы транзитных точек мультимаршрута.




Ручной маршрут


Свой маршрут можно проложить с помощью линии (polyline), но учтите, что линия не будет обращать внимания на дороги и вообще возможность пройти по указанному маршруту.
var poly = new ymaps.Polyline([[56, 37], [57, 37], [57, 38], [55, 38]], {
 hintContent: "Ломаная линия",
 balloonContent: ""
}, {
 cursor: "pointer",
 draggable: true,
 hasBalloon: true,
 hasHint: true,
 interactiveZIndex: false,
 opacity: 1,
 openBalloonOnClick: true,
 openEmptyBalloon: false,
 openEmptyHint: false,
 openHintOnHover: true,
 strokeColor: '#000000',
 strokeOpacity: 0.8,
 strokeStyle: '',
 strokeWidth: 5,
 syncOverlayInit: false,
 visible: true
});
map.geoObjects.add(poly); 
map.setBounds(poly.geometry.getBounds());
poly.editor.startEditing(); 
poly.editor.startDrawing(); 

hintContent - содержимое всплывающей подсказки ломаной
balloonContent - содержимое балуна ломаной
cursor - Вид курсора над ломаной
draggable - Определяет возможность перетаскивания ломаной
hasBalloon - Определяет наличие поля balloon у ломаной
hasHint - Определяет наличие поля hint у ломаной
interactiveZIndex - Включает режим автоматического изменения z-index ломаной в зависимости от ее состояния.
opacity - Прозрачность
openBalloonOnClick - Определяет, показывать ли балун при щелчке на ломаной.
openEmptyBalloon - Определяет, показывать ли пустой балун при щелчке на ломаной.
openEmptyHint - Определяет, показывать ли пустой хинт при наведении указателя мыши на ломаную.
openHintOnHover - Определяет, показывать ли хинт при наведении указателя мыши на ломаную.
strokeColor - Цвет линии или обводки
strokeOpacity - Прозрачность линии или обводки
strokeStyle - Стиль линии или обводки
strokeWidth - Толщина линии или обводки
syncOverlayInit - Включает синхронное добавление оверлея на карту. По умолчанию добавление оверлея осуществляется асинхронно, что позволяет предотвратить зависания браузера при добавлении на карту большого числа ломаных. Однако, асинхронное добавление не позволяет получать доступ к оверлею сразу после добавления ломаной на карту.расстановка стрелок через каждые n пикселей марштура
visible - Определяет видимость ломаной

Для завершения редактирования и рисования линии используйте функции:
poly.editor.stopEditing(); 
poly.editor.stopDrawing();

Чтобы получить актуальный массив с координатами всего маршрута воспользуйтесь этим кодом:
var points = poly.geometry.getCoordinates();




На этом я закончу статьи по Yandex Maps. До тех пор пока не появятся запросы на описание каких-либо пропущенных мною функций.


среда, 9 июля 2014 г.

Yandex Maps API. Маркеры, кластеры и геокодирование

Добавление маркера на карту

Обычный маркер добавить очень просто. Достаточно коротенького кода:
var Placemark = new ymaps.Placemark([55.8, 37.6]);
map.geoObjects.add(Placemark);

и маркер будет установлен. Однако это будет пустой и стандартный маркер.
Сделаем его более уникальным, заменив изображение маркера на свое:
var Placemark = new ymaps.Placemark(
      [55.8, 37.6],
      {},
      {
        iconLayout: 'default#image',
        iconImageHref: 'marker_image.png',
        iconImageSize: [20, 30],
        iconImageOffset: [-10, -20]
      }
);
map.geoObjects.add(Placemark);

marker_image.png - замените на свое изображение маркера
iconImageSize - размер изображения
iconImageOffset - смещение изображения (чтобы якорь маркера был в нужной точке)

Или заменив изображение маркера на другое из стандартного набора:
var Placemark = new ymaps.Placemark([55.8, 37.6], {}, {
        preset: 'islands#redIcon'
});
map.geoObjects.add(Placemark);

Другие варианты переменной preset смотрите здесь:



Изображение маркера изменили, теперь нужно установить на маркер балун (всплывающее окошко при клике на маркер).

Балун добавляется в маркер:
var Placemark = new ymaps.Placemark(
      [55.8, 37.6],
      {
          balloonContent: 'Содержание балуна',
          iconContent: "1"
      },
      {
          balloonCloseButton: true,
          hideIconOnBalloonOpen: false
      }
);
map.geoObjects.add(Placemark);

balloonContent - Содержание балуна. Можно использовать html.
iconContent - Текст выводится над иконкой маркера
balloonCloseButton - включена ли кнопка закрытия балуна.
hideIconOnBalloonOpen - включено ли открытия и закрытие балуна кликом на иконку маркера.




Кластеризация маркеров

В картах яндекса есть встроенная функция кластеризации любых объектов карты.
Для примера создадим маркеры в виде гео-объектов:
var GeoObjects = [];
GeoObjects[0] = new ymaps.GeoObject({
    geometry: { type: "Point", coordinates: [56.034, 36.992] },
    properties: {
        clusterCaption: 'Маркер №1',
        balloonContentBody: 'Содержимое балуна маркера №1.'
    }
});
GeoObjects[1] = new ymaps.GeoObject({
    geometry: { type: "Point", coordinates: [56.021, 36.983] },
    properties: {
        clusterCaption: 'Маркер №2',
        balloonContentBody: 'Содержимое балуна маркера №2.'
    }
});

var clusterer = new ymaps.Clusterer({ 
    gridSize: 64, 
    groupByCoordinates: false,
    hasBalloon: true,
    hasHint: true,
    margin: 10,
    maxZoom: 10,
    minClusterSize: 2,
    showInAlphabeticalOrder: false,
    viewportMargin: 128,
    zoomMargin: 0, 
    clusterDisableClickZoom: true 
});
clusterer.add(GeoObjects);
map.geoObjects.add(clusterer);

gridSize – Размер ячейки кластеризации в пикселях
groupByCoordinates – Специальный режим работы кластеризатора при котором кластеры образуются только из гео-объектов с одинаковыми координатами.
hasBalloon – Открывать ли балун кластера, если он есть
hasHint – Отображать ли всплывающую подсказку кластера, если она есть
margin – Число или массив чисел, задающие отступ для центра кластера относительно ячеек кластеризации. Если задано одно число - оно применяется ко всем сторонам. Если задано два - то это вертикальные и горизонтальные отступы соответственно. Если задан массив из 4х чисел, то это отступы top, right, bottom, left.
maxZoom – Максимальный коэффициент масштабирования карты, на котором происходит кластеризация объектов. Даже если кластеризация отключена, будут показаны только объекты в видимой области карты.
minClusterSize – Минимальное количество объектов, образующих кластер.
showInAlphabeticalOrder – Показывать метки в балуне в алфавитном порядке при нажатии на кластер. Гео-объекты кластера сортируются по специальным полям в данных этих гео-объектов - clusterCaption (или balloonContentHeader, если предыдущее поле не определено). По умолчанию гео-объекты показываются в порядке добавления в кластеризатор.
viewportMargin – Отступ для области, в которой производится кластеризация. Кластеризация проводится для видимой области карты. С помощью данной опции область кластеризации расширяется по отношению к видимой области карты.
zoomMargin – Отступы от границ видимой области карты, которые соблюдаются при приближении карты после клика на кластере.
clusterDisableClickZoom – Отключить масштабирование с помощью клика на кластер

Функция очистки кластера может быть полезна:
clusterer.removeAll();




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

Геокодирование бывает двух видов:
1) Поиск адреса по координатам
2) Поиск координат по адресу
У карт яндекса запросы к этим двум типам геокодирования не отличаются. Ищем адрес - вводим адрес текстом (текстовой переменной), ищем координаты - вводим координаты массивом чисел: [56, 37].

var Geocoder = ymaps.geocode("Адрес", { kind: 'house', results: 1, skip: 0 });
Geocoder.then(
    function (res) {
        map.geoObjects.add(res.geoObjects);
    },
    function (err) {
        // Адрес не найден
    }
);

Массив res.geoObjects может содержать не одну запись, если похожий адрес был найден в нескольких разных точках.

kind - Вид топонима: house, street, metro, district, locality
results - Максимальное количество возвращаемых результатов.
skip - Число результатов, которое необходимо пропустить.


Пример с установкой маркеров и получение их адреса с помощью геокодера. Для установки маркера - кликните на карту.