Код обработки платежей для Новой Интеркассы

Всем привет. Сегодня очень короткий и очень полезный пост о приёме платежей с помощью сервиса Интеркасса.

Интеркасса недавно запустила новую версию с крутым и удобным дизайном, а также абсолютно новыми протоколами.

Обитает она пока на поддомене new.interkassa.com в бета-версии и активно предлагает пользователям переход в новый интерфейс. Правда почему-то в уведомлении забыли написать, что нужно изменить запросы. Из-за этого оплата просто перестаёт работать.

Надо сказать, что теперь стало гораздо удобней тестировать приём оплаты и другие функции. И взаимодействие стало намного более функциональным и понятным.

Чего не скажешь о Робокассе, которая заставляет изрядно попортить себе нервы, только для того, чтобы не брать комиссии с плательщиков, а удерживать её с продавца. Недавно имел удовольствие ковыряться с этим вопросом. В Интеркассе этот вопрос решается парой кликов в админке.

Но это лирика. Перейдём к действительно важным вещам. А точнее к паре функций, которых вполне достаточно, чтобы автоматизировать приём оплаты в небольшом интернет-магазине.

Я не хотел написать полный класс взаимодействий с сервисом и использовать по максимуму все возможности (которых немало). Нет. Меня интересует лишь простейшие функции, которые позволяют принимать платёж и проверять результат оплаты.

Вот эти функции. Пользуйтесь на здоровье.

 /**
 * Функция инициализирует оплату
 *
 * @return string $payment_form
 */
 public function InitiatePayment($shop_id, $sum, $payment_id, $payment_desc)
 {
 $payment_form = '
 <form name="payment" action="https://sci.interkassa.com/" method="post" enctype="utf-8">
 <input type="hidden" name="ik_co_id" value="' . $shop_id . '">
 <input type="hidden" name="ik_am" value="' . $sum . '">
 <input type="hidden" name="ik_pm_no" value="' . $payment_id . '">
 <input type="hidden" name="ik_desc" value="' . $payment_desc . '">
 <input type="submit" value="Оплатить">
 </form>';

 return $payment_form;
 }
, где
$shop_id - идентификатор кассы
$sum - сумма платежа (в формате 0.00)
$payment_id - номер заказа
$payment_desc - описание платежа

 /**
 * Функция проверяет результат оплаты
 *
 * @return boolean
 */
 public function CheckResult($shop_id, $secret_key, $post, $test_key)
 {
 if ($post['ik_co_id'] != $shop_id)
 return false;
 
 $ik_key = ($post['ik_pw_via'] == 'test_interkassa_test_xts') ? $test_key : $secret_key; 
 
 $data = array();
 foreach ($post as $key => $value)
 {
 if (!preg_match('/ik_/', $key))
 continue;
 $data[$key] = $value;
 }
 
 $ik_sign = $data['ik_sign'];
 unset($data['ik_sign']);
 
 ksort($data, SORT_STRING);
 array_push($data, $ik_key);
 
 $signString = implode(':', $data);
 $sign = base64_encode(md5($signString, true));

 if ($sign === $ik_sign && $data['ik_inv_st'] == 'success')
 return true;
 else
 return false;
 }
, где
$shop_id - идентификатор кассы
$secret_key - секретный ключ
$post - массив $_POST
$test_key - тестовый ключ

Код абсолютно рабочий. Уже принял несколько платежей с его помощью.

Именно эти функции уже успешно используются в JSale и скоро попадут в JCart.

Подпишитесь на обновления блога

Получить в подарок мини-книги и 21-дневный тренинг по личностному росту.

Подписаться на рассылку «Инструменты Интернет для онлайн бизнеса»

Поделиться ссылкой:


Комментарии:

10.12.2013 09:15:22

Стоит обратить внимание, что данные от интеркассы передаются в кодировке UTF-8 и на это следует обратить внимание, если Ваш сайт не в этой кодировке.

10.12.2013 09:44:38

Иван, согласен. Конечно, стоило бы перекодировать его давно в utf-8, но если не судьба, то нужно добавить пару строк.

11.12.2013 22:01:05

Предпочитаю не связываться с этой платёжкой. Они сдают информацию о своих клиентах направо и налево.

16.12.2013 15:06:30

krebun, не слышал об этом ранее.

08.05.2014 11:53:08
#5 Ivan

Ребята, обязательно делайте проверку суммы платежа, особенно если вы не используете цифровую подпись при формировании платежа!

08.05.2014 12:02:57
#6 Николай

Кроме как проверка суммы, должна быть и проверка валюты! Если у вас мультивалютный!! магазин и вы не формируете подпись на Интеркассу, то ОБЯЗАНЫ не только хранить валюту выставленного счета, но и проверять ее, когда данные приходят от Интеркассы.

20.05.2014 16:07:04

Ivan, конечно, проверку суммы нужно делать обязательно.

Николай, и валюту, если магазин мультивалютный.

04.08.2014 07:59:32

Код действительно рабочий и понятный, в отличии от описания в документации Интеркассы...
В общем, большое спасибо!

12.08.2014 11:41:12

Вопрос нуба, возможно. Можете показать пример как применять эти функции?

Оставьте комментарий [форматирование]

Пожалуйста, воздержитесь от спама и идиотских высказываний. Жёсткая модерация. Ссылки закрыты атрибутом nofollow, а значит не несут пользы для продвижения!
Ссылки на всё кроме личных блогов и тематических блогов, сходных по тематике с данным, вырезаются.



Мой Telegram канал
Мой RSS фид