Подключение онлайн оплаты на сайт. WalletOne

Я очень давно не писал в блог – всему дело мой проект, интернет магазин 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.

  1. Красивый сайт – Сайт у них реально красивый и функциональный. С этим спорить не буду – тут вроде как все ок.
  2. Полная деанонимизация – получать деньги вы сможете когда угодно, а вот выводить только после подтверждения личности (кстати часть негативных отзывов было именно по этому поводу)
  3. Убогое API – Ну реально убогое. Примеры написаны языком года эдак 2004-2006. Кодировка windows-1251, и все передающиеся параметры приходится в нее переводить, и полностью не рабочий скрипт проверки подписи при ответе, висит у них на сайте.
  4. Отсутствие тестовых платежей – приходится каждый раз для теста платить по рублю. Мне конечно не жалко, но каждый раз вводить данные надоедает.

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

А вот и сам класс

<?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 часов.

[Всего голосов: 0    Средний: 0/5]

Добавить комментарий

Ваш e-mail не будет опубликован.