Как создать плагин мерчанта?

Как создать плагин мерчанта?

Плагин мерчанта в фреймворке AiKi это по своей сути обычная форма. Рассмотрим процесс создания плагина на базе платёжной системы RoboKassa.

Создаём папку для плагина /forms/robokassa
В папке создаём файлы:

  • robokassa.php - обработчик формы
  • robokassa_checkout.php - форма подтверждения перехода на платёжную систему
  • robokassa_settings.php - форма настроек, для панели администратора

В обработчике формы обязательно должны присутствовать функции page_checkout() и page_success(), только в этом случае фреймворк автоматически определит, что это форма плагина мерчанта и подключит её к панели администратора. Подробную информацию о процессе обработки платежей вы должны получить из документации API конкретной платёжной системы.

Пример формы robokassa_checkout.php:

<div class="panel-body">
<form action="{{url}}" method="POST" data-disallow="noname">
    <input type=hidden name=MrchLogin value="{{login}}">
    <input type=hidden name=OutSum value="{{summ}}">
    <input type=hidden name=InvId value="{{inv_id}}">
    <input type=hidden name=Desc value="{{inv_desc}}">
    <input type=hidden name=SignatureValue value="{{crc}}">
    <input type=hidden name=IncCurrLabel value="{{currency}}">
    <input type=hidden name=Culture value="{{culture}}">
    <input type=hidden name=IsTest value="{{test}}">
    <input type=hidden name=Shp_orderId value="{{Shp_orderId}}">
    <h4>Внимание</h4>
    <p>После нажания кнопки "продолжить" вы будете перенаправлены на сайт платёжной системы
    <a href="http://www.robokassa.ru" target="_blank">RoboKassa</a>,
    где сможете выбрать наиболее удобную для Вас форму оплаты заказа и совершить платёж.</p>
    <p>После завершения процедуры оплаты Вы снова будете перенаправлены на наш сайт.</p>
    <p><b>Сумма к оплате: {{summ}} рублей</b></p>
    <p>
        <img src="http://robokassa.ru/ru/Images/logo.png" style="width: 200px;" class="pull-right">
        <input class="btn btn-primary" type="submit" value="Продолжить">
    </p>
</form>
<div data-allow="noname">
    <h4>Внимание</h4>
    <p>Оплата доступна только авторизованым пользователям.</p>
    <p>Если вы уже зарегистрированы в системе,
    пожалуйста, авторизуйтесь, нажав кнопку "Войти", если у вас ещё нету учётной записи,
    пожалуйста, нажмите кнопку "Регистрация".</p>
    <a href="/login.htm" class="btn btn-success"><i class="ti-check"></i> Войти</a>
    <a class="btn btn-raised btn-primary ripple-effect checkout" href="#"
    data-ajax="mode=reg&amp;form=users" data-html="#myModal .panel-default">
    <i class="ti-user"></i> Регистрация</a>
</div>
</div>

Пример формы robokassa_settings.php:

<div class="form-group">
    <label class="col-sm-2 control-label">Мерчант ID</label>
    <div class="col-sm-10"><input type="text" name="robokassa[id]" class="form-control" placeholder="Мерчант ID"></div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label">Мерчант URL</label>
    <div class="col-sm-10"><input type="text" name="robokassa[url]" class="form-control" placeholder="Мерчант URL"></div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label">Секретный ключ #1</label>
    <div class="col-sm-10"><input type="text" name="robokassa[key1]" class="form-control" placeholder="Секретный ключ #1"></div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label">Секретный ключ #2</label>
    <div class="col-sm-10"><input type="text" name="robokassa[key2]" class="form-control" placeholder="Секретный ключ #2"></div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label">Тестовый режим</label>
    <div class="col-sm-1"><input type="checkbox" name="robokassa[test]" class="form-control"></div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label">Тестовый ключ #1</label>
    <div class="col-sm-10"><input type="text" name="robokassa[test1]" class="form-control" placeholder="Тестовый ключ #1"></div>
</div>
<div class="form-group">
    <label class="col-sm-2 control-label">Тестовый ключ #2</label>
    <div class="col-sm-10"><input type="text" name="robokassa[test2]" class="form-control" placeholder="Тестовый ключ #2"></div>
</div>

Пример обработчика формы robokassa.php:

function robokassa_checkout() {
    if (isset($_GET["order_id"])) {$_SESSION["order_id"]=$_GET["order_id"];}
    $order=aikiReadItem("orders",$_SESSION["order_id"]);
    $form=formGetForm($_GET["form"],$_GET["mode"]);
    $SETT=$_SESSION["settings"][$_GET["form"]];
    $test_mode = $SETT['test']; if ($test_mode=="on") {$test_mode=1;}
    $success_url = "http://{$_SERVER['HTTP_HOST']}/{$_GET["form"]}/success/{$order['id']}.htm";
    $fail_url = "http://{$_SERVER['HTTP_HOST']}/{$_GET["form"]}/fail/{$order['id']}.htm";
    $result_url = "http://{$_SERVER['HTTP_HOST']}/{$_GET["form"]}/result/{$order['id']}.htm";
    $test_mode = $SETT['test'];
    $mrh=array();
    $mrh["login"] = $SETT['id'];
    $mrh["url"]=$SETT["url"]; // url мерчанта
    $mrh["inv_id"] = 0; // номер заказа системный (не принимает шестнатиричные)
    $mrh["Shp_orderId"] = $order["id"];
    $mrh["inv_desc"] = "Кафе Купон - заказ № {$order['id']}"; // описание заказа
    $mrh["summ"] = $order["total"]; // сумма заказа
    $mrh["currency"] = ""; // предлагаемая валюта платежа
    $mrh["culture"] = "ru"; // язык
    if ($test_mode=="on") {
        $mrh["pass"] = $SETT['test1'];
        $mrh["test"] = 1;
    } else {$mrh["pass"] = $SETT['key1'];}
    $crc="{$mrh['login']}:{$mrh['summ']}:{$mrh['inv_id']}:{$mrh['pass']}:Shp_orderId={$mrh['Shp_orderId']}";
    $mrh["crc"]  = md5($crc); // формирование подписи
    $form->contentSetData($mrh);
return $form->outerHtml();
}

function robokassa_success() {
    $order=aikiReadItem("orders",$_REQUEST["Shp_orderId"]);
    $SETT=$_SESSION["settings"]["robokassa"];
    $test_mode = $SETT['test'];
    // HTTP parameters:
    $mrh=array();
    $mrh["login"] = $SETT['id'];
    $mrh["summ"] = $_REQUEST["OutSum"];
    $mrh["inv_id"] = $_REQUEST["InvId"];
    $mrh["Shp_orderId"]=$_REQUEST["Shp_orderId"];
    if ($test_mode=="on") {$mrh["pass"] = $SETT['test1'];} else {$mrh["pass"] = $SETT['key1'];}
    // build own CRC
    $my_crc="{$mrh['summ']}:{$mrh['inv_id']}:{$mrh['pass']}:Shp_orderId={$mrh['Shp_orderId']}";
    $my_crc = strtoupper(md5($my_crc));
    $crc = $_REQUEST["SignatureValue"];
    $crc = strtoupper($crc);  // force uppercase
    if (strtoupper($my_crc) != strtoupper($crc)) {  robokassa_fail();  exit();    }
        $out=aikiGetTpl("member.php");
        $_SESSION["order_id"]=newIdRnd();
        setcookie("order_id","",time()-3600,"/"); unset($_COOKIE["order_id"]);
        header('Location: /admin.htm');
    return $out;
}

function robokassa_result() {
    $order=aikiReadItem("orders",$_REQUEST["Shp_orderId"]);
    $SETT=$_SESSION["settings"]["robokassa"];
    $test_mode = $SETT['test'];
    // HTTP parameters:
    $mrh=array();
    $mrh["login"] = $SETT['id'];
    $mrh["summ"] = $_REQUEST["OutSum"];
    $mrh["inv_id"] = $_REQUEST["InvId"];
    $mrh["Shp_orderId"]=$_REQUEST["Shp_orderId"];
    if ($test_mode=="on") {$mrh["pass"] = $SETT['test2'];} else {$mrh["pass"] = $SETT['key2'];}
    // build own CRC
    $my_crc="{$mrh['summ']}:{$mrh['inv_id']}:{$mrh['pass']}:Shp_orderId={$mrh['Shp_orderId']}";
    $my_crc = strtoupper(md5($my_crc));
    $crc = $_REQUEST["SignatureValue"];
    $crc = strtoupper($crc);  // force uppercase
    if (strtoupper($my_crc) != strtoupper($crc)) {  robokassa_fail();  exit();    }
        if (!is_callable("ordersCheckoutSuccess")) {include_once($_SESSION["root_path"]."/forms/orders/orders.php");}
        ordersCheckoutSuccess($order["id"]);
    echo "OK{$mrh['inv_id']}";
}

function robokassa_fail() {
    echo "fail";  die;
}

function robokassa_settings() {
    $form=formGetForm($_GET["form"],$_GET["mode"]);
    $form->contentSetValues($_SESSION["settings"]);  // проставляем значения
    return $form->outerHtml();
}

Интеграция с Bootstrap v.3

Чистый & понятный код

Парсер DOM в PHP