PayMFC
Добро пожаловать на репозиторий SDK
Что это и зачем?
PayMFC — это платёжный шлюз. Такая система для упрощения приёма платежей в криптовалюте без необходимости установки кошелька на сервер. Это позволяет очень простую интеграцию платежей в любой сайт или приложение
Это безопасно?
Да. Перед подтверждением платежа от нашего сервера, он проверяется в блокчейне. И только когда мы удостоверимся с нескольких нод, что платёж всё-таки прошёл и прошёл правильно, мы подтвердим это вашему сайту. Запросы платежей подписываются нашими сертификатами и пользователь не может изменить ни сумму, ни получателя платежа. Кроме этого, платежи имеют “время жизни”, которое проверяется как кошельком отправителя, так и нашим сервером. Поэтому можно быть уверенным, что платёж вам прийдёт достаточно быстро. Кроме этого, платежи “прямые” — мы выступаем только наблюдателем и валидатором, но не пропускаем деньги через себя, из-за чего они не могут где-то на пол пути “зависнуть”
Это бесплатно?
Нет. На данный момент, у нас происходит бета-тестирование сервиса и комиссия составляет 1%. При достаточных объёмах стабильно проведённых транзакций, но строго после полноценного релиза мы планируем постепенно уменьшать комиссионную ставку вплоть до 0.1%. Даже если мы не выйдем на необходимые объёмы, ставка в 1% не будет повышаться — это максимум. Так что если вы начали работать с нами с комиссионной ставки в 1%, можно не беспокоится — выше точно не будет, а если будет меньше… ну что ж, приятный бонус для вас 😊
Плагины для CMS
Вы можете скачать плагины для некоторых CMS и начать принимать платежи прямо сейчас!
Работа без плагинов
Схема работы
Рассмотрим на примере сайта интернет-магазина. Ваш сценарий использования может отличаться, всё зависит лишь от ваших потребностей.
- Вы создаёте у себя специальный файл-контроллер для внешних обращений по API к вашему сайту с нашего сервера
- Для каждого товара на сайте генерируете ссылку для оплаты и вставляете её на сайт в обычном теге
<a>
- Готово, вы восхитительны!
А теперь подробнее.
Контроллер
Для создания контроллера 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