Я очень давно не писал в блог - всему дело мой проект, интернет магазин ROBOM.ru, но вот у меня появилась новая тема для поста. Сегодня мы поговорим об оплате на сайте, а точнее об одном из операторов - walletone Единый кошелек
А теперь немного о том, как я выбирал с кем именно сотрудничать.
Большинство онлайн систем оплаты предлагают условия как физическим, так и юр лицам. Так как для магазина я регистрировал все официально и у меня есть ИП, я думал что проблем не должно быть.
Проблема 1.
Если вы регистрируетесь в любой системе как юридическое лицо, то вам нужно иметь расчетный счет. Расчетный счет в банке это не тоже самое что счет на который вам поступает зарплата. Расчетный счет это какая-то фигня, которая требуется для юр лиц (этот момент не слишком важен) и стоит 800 рублей в месяц (а это уже очень важно).
Так как у меня пока было всего 2-3 заказа общей суммой не больше 2-3 тысяч рублей а прибыль (делим на 4 и отнимаем всякие издержки) в районе 500 рублей, я не мог себе позволить спускать всю прибыль на расчетный счет - есть дела и поважнее (например подкопить на jaguar xj220, правда такими темпами я буду копить очень долго, но я отвлекся), поэтому решено было регистрироваться как физ. лицо.
С физ. лицами работают далеко не все агрегаторы, так что круг автоматически сузился.
Проблема 2.
Если вы регистрируетесь как физ. лицо, то в большинстве платежных агрегаторов комиссия списывается не с вас, а с клиента. Многие пользуются этим способом, но у меня же уважающий себя магазин, и, как мне кажется, если у клиента во время заполнения корзины висит счет в 1000 рублей, а при онлайн оплату резко узнается что к оплате 1050 рублей, клиент может заподозрить что если тут обман, то и с товаром могут надуть, и вообще уйдет с сайта, бросив заказ недооформленным.
Есть вариант что сразу же высчитывать комиссию из суммы - например если сумма 1000 рублей, а комиссия 5%, то находим сумму, при добавлении к которой 5% будет как раз 1000 рублей
x / 105 * 100
1000 / 105 * 100 = 952.380952381 // слишком много цифр после запятой
Добавим к 952.38 5% и получим - 999.999. Остается надеяться на то, что агрегатор округлит правильно. Хорошо, вроде все ок, но при подключении нескольких систем для оплаты (ЯД, ВМ, карты) возникает...
Проблема 3
У разных систем оплаты разная комиссия. Собственно, это заявление перечеркивает все наши старания по решению проблемы №2.
Хорошо, посмотрим что великий и могучий гугл сможет мне предложить еще.
Так как единственный ресурс которому я доверяю это хабр, то начал искать информацию про онлайн оплату именно там.
И именно там я наткнулся на агрегатора walletOne.
У них была самая маленькая комиссия, из всех платежек, которые подходят моим требованиям.
После просмотра отзывов о нем я разочаровался в нем, и стал искать другие. После просмотра отзывов о всех остальных я понял что отзывы в интернете это судя по всему какой-то троллинг, так как все системы (любые, не только онлайн платежи) были жестко покрыты матом в каждом 2ом комментарии. Именно поэтому я и вернулся к рассмотрению walletOne
Немного о WalletOne.
- Красивый сайт - Сайт у них реально красивый и функциональный. С этим спорить не буду - тут вроде как все ок.
- Полная деанонимизация - получать деньги вы сможете когда угодно, а вот выводить только после подтверждения личности (кстати часть негативных отзывов было именно по этому поводу)
- Убогое API - Ну реально убогое. Примеры написаны языком года эдак 2004-2006. Кодировка windows-1251, и все передающиеся параметры приходится в нее переводить, и полностью не рабочий скрипт проверки подписи при ответе, висит у них на сайте.
- Отсутствие тестовых платежей - приходится каждый раз для теста платить по рублю. Мне конечно не жалко, но каждый раз вводить данные надоедает.
Собственно зачем вся эта статья - я набросал класс, для генерации кнопки оплаты, и проверки данных, и хочу его вам представить - может кто-то еще пользуется/собирается начать, и ему он может быть полезен.
А вот и сам класс
<?php
class Wallet
{
private $test = 1; // тестовые платежи (любая сумма заменяется на 1 рубль.)
private $key = 'ВАШ СЕКРЕТНЫЙ КЛЮЧ В СИСТЕМЕ';
private $fields = array();
function __construct(){
$fields['WMI_MERCHANT_ID'] = 'ВАШ ИД В СИСТЕМЕ';
$fields['WMI_CURRENCY_ID'] = '643';
$fields['WMI_EXPIRED_DATE'] = date('Y-m-d H:i:s', time() + 3600);
$fields['WMI_SUCCESS_URL'] = 'http://shop.local/pay.php'; // URL успешный
$fields['WMI_FAIL_URL'] = 'http://shop.local/pay.php'; // URL с ошибкой
$this->fields = $fields;
}
function pay($inv_id, $out_summ, $email){
$this->fields['WMI_CUSTOMER_EMAIL'] = $email;
if($this->test){
$this->fields['WMI_PAYMENT_AMOUNT'] = 1;
} else {
$this->fields['WMI_PAYMENT_AMOUNT'] = $out_summ;
}
$this->fields['WMI_PAYMENT_NO'] = $inv_id;
$this->fields['WMI_DESCRIPTION'] = 'BASE64:' .
base64_encode('Оплата заказа #' . $inv_id);
uksort($this->fields, 'strcasecmp');
$signature = iconv("utf-8", "windows-1251", join('', $this->fields));
$this->fields['WMI_SIGNATURE'] = base64_encode(pack('H*', md5($signature . $this->key)));
$form = '<form action="https://wl.walletone.com/checkout/checkout/Index" method="POST">';
foreach($this->fields as $key => $item){
$form .= "\n" . '<input type="hidden" name="' . $key . '" value="' . $item . '">';
}
$form .= '<input type="submit" class="pay_online" value="Оплатить онлайн" /></form>';
return $form;
}
function checkPayment($request)
{
if (
!isset($request['WMI_SIGNATURE']) ||
!isset($request['WMI_PAYMENT_NO']) ||
!isset($request['WMI_ORDER_STATE'])
) {
return array(
'pay' => false,
'security' => false
);
}
$params = array();
foreach ($request as $name => $value) {
if ($name !== 'WMI_SIGNATURE') $params[$name] = urldecode($value);
}
uksort($params, 'strcasecmp');
$signature = join('', $params);
$signature = base64_encode(pack('H*', md5($signature . $this->key)));
var_dump($signature);
if ($signature != urldecode($request['WMI_SIGNATURE'])) {
return array(
'pay' => false,
'security' => false
);
} else {
return array(
'pay' => strtoupper($_POST['WMI_ORDER_STATE']) == 'ACCEPTED',
'security' => true
);
}
}
}
Тут думаю что пояснения не нужны - код и так слишком прост. Я просто упорядочил тот отстой, который лежал на их сайте в разделе API. Используется он тоже достаточно легко
$pay = new wallet();
$form = $pay->pay('1234567', '1000', 'mail@robom.ru');
echo $form;
if($_POST['WMI_SIGNATURE']){
var_dump($pay->checkPayment($_POST));
}
Метод checkPayment возвращает массив, где
- pay - успешная оплата
- security - правильные ли данные
После нажатия на кнопку мы получаем достаточно симпатичную форму оплаты
Единственный недостаток - надпись
Вы совершаете пополнение кошелька физического лица №
Но, не думаю что кто-то будет смотреть на нее, так что мне пока все нравится.
В следующей статье постараюсь рассказать ощущение от работы с ними.
P.S.
На момент написания статьи поддержка не отвечала мне уже больше 6 часов.
2016-04-20 12:25