PayMFC

Добро пожаловать на репозиторий SDK

Что это и зачем?

PayMFC — это платёжный шлюз. Такая система для упрощения приёма платежей в криптовалюте без необходимости установки кошелька на сервер. Это позволяет очень простую интеграцию платежей в любой сайт или приложение

Это безопасно?

Да. Перед подтверждением платежа от нашего сервера, он проверяется в блокчейне. И только когда мы удостоверимся с нескольких нод, что платёж всё-таки прошёл и прошёл правильно, мы подтвердим это вашему сайту. Запросы платежей подписываются нашими сертификатами и пользователь не может изменить ни сумму, ни получателя платежа. Кроме этого, платежи имеют “время жизни”, которое проверяется как кошельком отправителя, так и нашим сервером. Поэтому можно быть уверенным, что платёж вам прийдёт достаточно быстро. Кроме этого, платежи “прямые” — мы выступаем только наблюдателем и валидатором, но не пропускаем деньги через себя, из-за чего они не могут где-то на пол пути “зависнуть”

Это бесплатно?

Нет. На данный момент, у нас происходит бета-тестирование сервиса и комиссия составляет 1%. При достаточных объёмах стабильно проведённых транзакций, но строго после полноценного релиза мы планируем постепенно уменьшать комиссионную ставку вплоть до 0.1%. Даже если мы не выйдем на необходимые объёмы, ставка в 1% не будет повышаться — это максимум. Так что если вы начали работать с нами с комиссионной ставки в 1%, можно не беспокоится — выше точно не будет, а если будет меньше… ну что ж, приятный бонус для вас 😊

Плагины для CMS

Вы можете скачать плагины для некоторых CMS и начать принимать платежи прямо сейчас!

Работа без плагинов

Схема работы

Рассмотрим на примере сайта интернет-магазина. Ваш сценарий использования может отличаться, всё зависит лишь от ваших потребностей.

  1. Вы создаёте у себя специальный файл-контроллер для внешних обращений по API к вашему сайту с нашего сервера
  2. Для каждого товара на сайте генерируете ссылку для оплаты и вставляете её на сайт в обычном теге <a>
  3. Готово, вы восхитительны!

А теперь подробнее.

Контроллер

Для создания контроллера API вам понадобится скачать SDK. Если вашего языка нету в перечне — не стоит переживать, вы можете запросить разработку SDK под свой язык, создав соответствующую задачу на GitHub, а можете написать и сами согласно простой схеме. Pull Request’ы приветствуются и могут быть вознаграждены 😊.

После скачивания или написания SDK, необходимо создать сам файл контроллера. Звучит страшно, но на деле очень просто. Разберём на примере PHP:

<?php
require './paymfc_sdk.php';

/* 
 * Вместо базы данных для простоты создадим массив, куда впишем идентификаторы,
 * названия продуктов и их цены в MFC
 */
$products = [
    'notebook75' => [ 'Ультрабук Dell Inspiron 3147', 20000],
    'memory2' => [ 'Диск SSD 128GB Goodram CX400 Phison', 2816.25 ],
    'phone15' => [ 'Nokia N8-00', 1901.7994],
];

$payMFC = new PayMFC(
    '', // публичный ключ
    '' // приватный ключ. Пока оставим пустыми, вернёмся сюда после создания магазина
);

$payMFC -> onRequest(function($req) use ($products){
    /* 
     * Этот слушатель немедленно перехватит соединение и ответит на запрос.
     * Важно понимать, что PHP однопоточный, поэтому такое поведение предсказуемо.
     * Тем не менее, оговоримся, что код после этой функции выполнен не будет, поэтому
     * все необходимые действия проводим или тут, или ранее.
     * Лучше всего все действия проводить именно здесь,
     * поскольку в случае какой-либо ошибки,
     * пользовватель в кошельке увидит внятный текст ошибки.
     * Также стоит оговориться, что поле txid в запросе
     * не будет совпадать с идентификатором транзакции в блокчейне,
     * поскольку он создаётся раньше, чем проходит транзакция
     */
    if($req['type'] == 'confirm'){
        /*
         * на этом этапе записываем в базу данных, что платёж проведён.
         * Переменная `$req` будет иметь следующие поля:
         * `type: 'confirm'`
         * `txid: string` - id транзакции
         * Также, на этом же этапе сообщаем администратору, что платёж проведён
         * и можно отправлять товар. Функция не возвращает ничего
         */
    } else if($req['type'] == 'decline'){
        /*
         * такой запрос приходит, если всё-таки платёж не был совершён.
         * Переменная `$req` будет иметь следующие поля:
         * `type: 'decline'`
         * `txid: string` - id транзакции
         */
    } else {
        /*
         * Тут нам необходимо ответить серверу со следующими данными:
         * имя товара, цена, адрес для зачисления платежа.
         * Можно использовать дополнительные данные с помощью `callback_data`,
         * это будет рассмотрено ниже
         * Переменная `$req` будет иметь следующие поля:
         * `product: string` - id товара
         * `txid: string` - id транзакции
         * `...: any` - любая другая информация, переданная по ссылке
         */
        $product_id = $req['product'];
        // проверяем, наличие товара
        if(array_key_exists($product_id, $products)){
            /*
             * зарезервируем товар для транзакции txid и
             * ответим серверу с ценой, именем товара и адресом платежа
             */
            $name = $products[$product_id][0];
            $price = $products[$product_id][1];
            return [
                'name' => $name,
                'price' => $price,
                'payment_address' => 'MtLuhPhaexZjxYUTJAp9gGMU1M7bMxhLo8'
            ];
        } else {
            // сообщим пользователю в кошельке, что он не успел) Видимо, все товары уже расхватали
            throw new Exception('Запрошенного товара больше не существует');
        }
    }
});

?>

Теперь нужно создать магазин. Для этого предусмотрен бот в Telegram (@paymfcbot).

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

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

Генерация ссылок

Тут нас опять выручит SDK. Кроме того, вы можете сгенерировать ссылки вручную. В SDK уже есть встроенный метод для генерации ссылок для оплаты:

$payMFC -> link(string $product_id[, array $callback_data]);

Тем не менее, вы можете генерировать ссылки не только для отдельных товаров, но и для их групп или пользовательских корзин — в зависимости от того, какой тип оплаты используется на вашем сайте. Если у вас используются скидки или специальные предложения для конкретных пользователей — сгенерируйте ссылку с параметром $callback_data вида

$payMFC -> link($cart_id, [ 'uid' => $user -> id, 'coupon_id' => $selected_coupon -> id ]);

Таким образом, при запросе товара, у переменной $req появляется дополнительные поля: uid и coupon_id, которое соответствуют тем, которые мы передали в $callback_data