6.3. Forms Customization

Платёж Page Display Logic

  skinparam ConditionEndStyle hline
  : (1) Initiate transaction;
  if ((2) Additional Payer input required?) then (yes)
  : (3) return input form;
  : (4) submit form;
  else (no)
  endif
  if ((5) External form required?) then (yes)
  : (6) request external form from the payment provider;
  : (7) redirect to external form;
  : (8) submit form on payment provider side;
  else (no)
  endif
  : (9) show wait form;
  : (10) process transaction;
  : (11) show finish form or redirect \nto Connecting Party website;

(1) Транзакции могут инициироваться API-запросами, пакетной загрузкой или через виртуальный терминал в UI. Для каждого метода оплаты предусмотрена собственная логика отображения платёжной страницы.

Примечание

Payment Cashier может содержать несколько транзакций, инициированных в рамках одного платёжного сеанса, поскольку для Плательщика может быть доступно несколько способов оплаты. Когда Плательщик выбирает вкладку оплаты, инициируется соответствующая вспомогательная транзакция. См. Настройка страницы Payment Cashier.

(3) Для способа оплаты банковской картой форма отображается на стороне Платёжного Шлюза и может быть настроена. См. Настройка страницы оплаты. Для некоторых других способов оплаты на стороне Платёжного Шлюза могут быть дополнительные формы. За подробностями обратитесь в службу поддержки SBC.
(7) Некоторые методы оплаты требуют перенаправления плательщика на собственную форму. Эта форма не размещается Платёжным Шлюзом и не может быть настроена.
(9) Пока транзакция не достигнет финального статуса, Платёжный Шлюз отображает Wait Form для Плательщика.
(11) После достижения транзакцией окончательного статуса Платёжный Шлюз показывает плательщику Finish Form или выполняет перенаправление на сайт Присоединяющейся стороны.

Payment Page Customization

Payment Page Example

<html>
<head>
<script type="text/javascript">
  function isCCValid(r){var n=r.length;if(n>19||13>n)return!1;
    for(i=0,s=0,m=1,l=n;i<l;i++)d=parseInt(r.substring(l-i-1,l-i),10)*m,s+=d>=10?d%10+1:d,1==m?m++:m--;
    return s%10==0?!0:!1}
</script>
</head>
<body>
<h3>Order #$!MERCHANT_ORDER_ID - $!ORDERDESCRIPTION</h3>
<h3>Total amount: $!AMOUNT $!CURRENCY to $!MERCHANT</h3>
<form action="${ACTION}" method="post">
  <div>Cardholder name: <input name="${CARDHOLDER}" type="text" maxlength="64"/></div>
  <div><label for="cc-number">Credit Card Number</label> <input id="cc-number" name="${CARDNO}" type="text" maxlength="19" autocomplete="cc-number"/></div>
  <div>Card verification value: <input name="${CVV2}" type="text" maxlength="4" autocomplete="off"/></div>
  <div>
    Expiration date:
    <select class="expiry-month" name="${EXPMONTH}" size="1" autocomplete="cc-exp-month" >
      <option value="01">January</option><option value="02">February</option><option value="03">March</option>
      <option value="04">April</option><option value="05">May</option><option value="06">June</option>
      <option value="07">July</option><option value="08">August</option><option value="09">September</option>
      <option value="10">October</option><option value="11">November</option><option value="12">December</option>
    </select>
      <select class="expiry-year" id="cc-exp-year" name="${EXPYEAR}" size="1" autocomplete="cc-exp-year">
      ${EXPIRE_YEARS}
    </select>
  </div>
  <div><label for="dest-number">Destination card number:</label> <input id="dest-number" name="${DESTINATIONCARDNO}" type="text" maxlength="19" autocomplete="off"/></div>
  $!{INTERNAL_SECTION}
  #if($!card_error)
  <div style="color: red;">$!card_error</div>
  #end
  <input name="submit" onclick="return isCCValid(document.getElementById('cardnumber').value);" type="submit" value="Pay"/>
</form>
</body>
</html>

Примечание

Описанный ниже код позволяет передавать данные карты-получателя в транзакциях типа Transfer:

<div><label for="dest-number">Destination card number:</label>
<input id="dest-number" name="${DESTINATIONCARDNO}" type="text" maxlength="19" autocomplete="off"/></div>

Payment Page Autofill

Если Присоединяющаяся сторона хочет использовать автозаполнение в платёжной форме, некоторые атрибуты элементов <id> <autocomplete> <label for> должны быть жёстко заданы следующим образом:

<label for="cc-number">Credit Card Number</label><span class="form-label-comment">The 13-19 digits on the front of your card</span>
<input class="card-number-field" id="cc-number" name="${CARDNO}" type="text" maxlength="19" autocomplete="cc-number" />

Если необходимо использовать автозаполнение в форме transfer, определённые атрибуты элементов <id> <autocomplete> <label for> должны быть жёстко заданы следующим образом:

#if ($INPUT_SOURCE_CARD_CARDHOLDER)
<!-- Card printed name field -->
<li class="form-li">
    <label class="form-label" for="cc-name">Card printed name:</label>
    <input class="form-name-field" id="cc-name" name="${CARDHOLDER}" type="text" maxlength="50" autocomplete="cc-name" value="${CARDHOLDER_VALUE}"/>
</li>
#end
#if ($INPUT_SOURCE_CARD_CVV2)
<!-- CVV field -->
<li class="form-li">
    <label class="form-label" for="${CVV2}">Card security code (CVV2/CVC2):</label>
    <input class="form-cvv-field" name="${CVV2}" id="${CVV2}" type="password" maxlength="4" autocomplete="off"/>
</li>
#end
#end
#if ($INPUT_DESTINATION_CARD)
<!-- Destination Card Number field -->
#if($!DESTINATIONCARDNO)
<li class="form-li">
    <label class="form-label" for="${DESTINATIONCARDNO}">Destination card number:</label>
    <input class="form-number-field" id="${DESTINATIONCARDNO}" name="${DESTINATIONCARDNO}" type="text" maxlength="19" autocomplete="off"/>
</li>
#end
#end

SBC имеет шаблон формы оплаты по умолчанию, поддерживающий автозаполнение. Если Присоединяющаяся сторона хочет добавить дополнительные поля для автозаполнения, для именования ссылок следует использовать эту спецификацию.

Payment Page Template Macros

Макрос имени поля

Field Value Macro

Описание

${APPLE_PAY}

n/a

Кнопка покупки Apple Pay будет доступна, если используется этот макрос. Недоступно для транзакций Transfer.

${GOOGLE_PAY}

n/a

Кнопка покупки Google Pay будет доступна, если используется этот макрос. Недоступно для транзакций Transfer.

${CARDNO}

${CARDNOVALUE}

Номер кредитной карты плательщика.

${EXPMONTH}

n/a

Месяц окончания срока действия банковской карты.

${EXPYEAR}

n/a

Год окончания срока действия банковской карты.

${CVV2}

${CVV2VALUE}

Код безопасности карты. Пример: 432

${CARDHOLDER}

${CARDHOLDER_VALUE}

Карта printed название.

${MERCHANT}

n/a

End point display название.

${SKIN_VERSION}

n/a

Описание: CSS skin version.

${ORDERDESCRIPTION}

n/a

Описание заказа.

${CUSTOMER_FIRST_NAME}

n/a

Имя плательщика, отправленное Присоединяющейся стороной через входные параметры.

${CUSTOMER_LAST_NAME}

n/a

Фамилия плательщика, отправленная Присоединяющейся стороной через входные параметры.

${CUSTOMER_EMAIL}

n/a

Адрес электронной почты плательщика, отправленный Присоединяющейся стороной через входные параметры.

${DESTINATIONCARDNO}

n/a

Номер кредитной карты получателя. Доступно для транзакций Transfer.

${DESTINATION_CARD_TYPE}

n/a

Тип карты получателя. Доступно для транзакций Transfer.

${DESTINATION_LAST_FOUR_DIGITS}

n/a

Последние четыре цифры карты получателя. Доступно для транзакций Transfer.

${AMOUNT}

n/a

Сумма.

${CURRENCY}

n/a

Currency.

${DESTINATION_PURPOSE}

n/a

Назначение, отправленное Присоединяющейся стороной через входные параметры.

${PAYNET_ORDER_ID}

n/a

Идентификатор заказа SBC.

${MERCHANT_ORDER_ID}

n/a

Идентификатор заказа Присоединяющейся Стороны.

${refresh_interval}

n/a

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

${uuid}

n/a

Internal.

${INTERNAL_SECTION}

n/a

Внутренний для интеграции iFrame.

${CUSTOMER_IP_COUNTRY_ISO_CODE}

n/a

Страна плательщика, определённая по IP-адресу.

${PREFERRED_LANGUAGE}

n/a

Язык Плательщика, переданный Присоединяющейся стороной через входные параметры. Недоступно для Account Verification.

${BROWSER_LANGUAGE}

n/a

Язык плательщика, определённый настройками браузера.

${CUSTOMER_LANGUAGE}

n/a

Язык Плательщика, переданный Присоединяющейся стороной через входные параметры или определяемый настройками браузера, если первый не задан.

${MERCHANT_FORM_DATA}

n/a

Параметры, отправленные в API-параметре MERCHANT_FORM_DATA, разбираются на макросы с тем же именем; параметр кодируется в URL, например testparam%3Dtest1%26mynewparam%3Dtest2, и разбирается в форме на макросы $MFD_testparam = test1 и $MFD_mynewparam = test2. Символы имени параметра: [a-zA-Z0-9], символы значения параметра: [a-zA-Z0-9], управляющие символы: [=&], максимальный размер — 2 МБ. Недоступно для Account Verification. Например, этот параметр можно использовать для отображения платёжной формы в светлом/тёмном режиме в зависимости от значения, переданного Присоединяющейся стороной (например, передайте merchant_form_data=theme%3Ddark в запросе, и заполнитель макроса $MFD_theme в платёжной форме изменится на dark).

${MIN_AMOUNT}

n/a

Этот макрос имеет значение, указанное в параметре minimum-transaction-amount исходного запроса. Его можно использовать для проверки суммы транзакции перед отправкой платёжной формы. Обратитесь к менеджеру поддержки, чтобы включить эту функцию.

${MAX_AMOUNT}

n/a

Этот макрос имеет значение, указанное в параметре maximum-transaction-amount исходного запроса. Его можно использовать для проверки суммы транзакции перед отправкой платёжной формы. Обратитесь к менеджеру поддержки, чтобы включить эту функцию.

${CUSTOMER_ZIP_CODE}

n/a

Генерирует почтовый индекс (ZIP), если он не был получен от Плательщика. Недоступно для Account Verification.

Prefilled Cardholder Data in Payment Page

Данные держателя карты Плательщика, использованные для обработки предыдущей транзакции, можно токенизировать для будущего использования запросом к /api/v2/create-card-ref/. Полученный токен cardrefid затем можно передавать в следующих запросах к соответствующему API. При отправке этого параметра все поля ввода данных держателя карты будут неизменяемыми и предварительно заполненными на странице оплаты. CVV не токенизируется и должен быть предоставлен Плательщиком на этой странице оплаты. Ниже приведён пример настройки формы для работы с предварительно заполненными данными держателя карты на странице оплаты.

Примечание

Эта функция доступна только для типов транзакций Sale и Preauth и не может использоваться в платёжной кассе.

Prefilled Cardholder Data Payment Page Example

<html>
<head>
</head>
<body>
  <h3>Order #$!MERCHANT_ORDER_ID - $!ORDERDESCRIPTION</h3>
  <h3>Total amount: $!AMOUNT $!CURRENCY to $!MERCHANT</h3>
  <h4>Card Holder: ${CARDHOLDER} </h4>
  <h4>Card Number: $!CARD_BIN ...... $!CARD_LAST4DIGITS </h4>
  <h4>Exp year: $!EXPYEAR_VALUE </h4>
  <h4>Exp month: $!EXPMONTH_VALUE </h4>
  <form action="${ACTION}" method="post">
    <div>Cvv: <input name="${CVV2}" type="text" maxlength="4" autocomplete="off"/></div>
    $!{INTERNAL_SECTION}
    #if($!card_error)
      <div style="color: red;">$!card_error</div>
    #end
    <input name="submit" type="submit" value="Pay"/>
  </form>
</body>
</html>

Prefilled Cardholder Data Payment Page Macros

Макрос имени поля

Field Value Macro

Описание

${CARDHOLDER}

n/a

Имя на карте плательщика.

${CARD_BIN}

n/a

Описание: Full card number.

${CARD_LAST4DIGITS}

n/a

Последние 4 цифры карты.

${EXPMONTH_VALUE}

n/a

Значение месяца истечения срока действия карты.

${EXPYEAR_VALUE}

n/a

Значение года истечения срока действия карты.

${CVV2}

n/a

Описание: CVV2 card value.

Wait Page Customization

Wait Page Template

Страница ожидания — форма, на которой плательщик остаётся до достижения транзакцией окончательного статуса.

<html>
<head>
    <script type="text/javascript">
      function fc(t) {
        document.getElementById("seconds-remaining").innerHTML = t;
        (t > 0) ? setTimeout(function(){fc(--t);}, 1000) : document.checkform.submit();}
    </script>
</head>
<body onload="fc($!refresh_interval)">
    <h3>Order #$!MERCHANT_ORDER_ID - $!ORDERDESCRIPTION</h3>
    <h3>Total amount: $!AMOUNT $!CURRENCY to $!MERCHANT</h3>
    Please wait, your payment is being processed, remaining <span id="seconds-remaining">&nbsp;</span> seconds.
    <form name="checkform" method="post">
        <input type="hidden" name="tmp" value="$!uuid"/>
        $!{INTERNAL_SECTION}
        <input type="submit" value="Check" />
    </form>
</body>
</html>

Примечание

Описанный ниже код не относится к Account Verification:

<h3>Total amount: $!AMOUNT $!CURRENCY to $!MERCHANT</h3>

Wait Page Template Macros

Макрос имени поля

Field Value Macro

Описание

$!refresh_interval

n/a

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

$!MERCHANT_ORDER_ID

n/a

Идентификатор заказа Присоединяющейся Стороны.

$!ORDERDESCRIPTION

n/a

Описание заказа.

$!AMOUNT

n/a

Сумма. Недоступно для Account verification.

$!CURRENCY

n/a

Валюта. Недоступно для Account verification.

$!MERCHANT

n/a

End point display название.

$!uuid

n/a

Internal.

$!{INTERNAL_SECTION}

n/a

Внутренний для интеграции iFrame.

${SKIN_VERSION}

n/a

Описание: CSS skin version.

${PAYNET_ORDER_ID}

n/a

Идентификатор заказа SBC.

${CUSTOMER_IP_COUNTRY_ISO_CODE}

n/a

Страна плательщика, определённая по IP-адресу.

${PREFERRED_LANGUAGE}

n/a

Язык плательщика, отправленный Присоединяющейся стороной через входные параметры.

${BROWSER_LANGUAGE}

n/a

Язык плательщика, определённый настройками браузера.

${CUSTOMER_LANGUAGE}

n/a

Язык Плательщика, переданный Присоединяющейся стороной через входные параметры или определяемый настройками браузера, если первый не задан.

Finish Page Customization

Finish Page Template

Форма, на которой плательщику показывается окончательный статус его запроса.

<html>
    <head>
    </head>
    <body>
        <h3>Processing of the payment has finished</h3>
        <h3>Order Invoice: $!{MERCHANT_ORDER_ID}</h3>
        <h3>Order ID: $!{PAYNET_ORDER_ID}</h3>
        <h3>Status: $!{STATUS}</h3>
        #if($ERROR_MESSAGE)
            <h3>Error: $!{ERROR_MESSAGE}</h3>
        #end
    </body>
</html>

Finish Page Macros

Макрос имени поля

Field Value Macro

Описание

${STATUS}

n/a

Order статус.

${PAYNET_ORDER_ID}

n/a

Описание: System order id.

${MERCHANT_ORDER_ID}

n/a

Идентификатор заказа Присоединяющейся Стороны.

${ERROR_MESSAGE}

n/a

Содержит причину отклонения или сведения об ошибке.

${SKIN_VERSION}

n/a

Описание: CSS skin version.

${CUSTOMER_IP_COUNTRY_ISO_CODE}

n/a

Страна плательщика, определённая по IP-адресу.

${PREFERRED_LANGUAGE}

n/a

Язык плательщика, отправленный Присоединяющейся стороной через входные параметры.

${BROWSER_LANGUAGE}

n/a

Язык плательщика, определённый настройками браузера.

${CUSTOMER_LANGUAGE}

n/a

Язык Плательщика, переданный Присоединяющейся стороной через входные параметры или определяемый настройками браузера, если первый не задан.

${AMOUNT}

n/a

Сумма. Недоступно для Account verification.

${CURRENCY}

n/a

Валюта. Недоступно для Account verification.

${DESCRIPTION}

n/a

Описание транзакции. Недоступно для Account verification.

${DATE}

n/a

Дата транзакции. Недоступно для Account verification.

${PAYNET_PROCESSING_DATE}

n/a

Дата обработки SBC. Недоступно для Account verification.

${RRN}

n/a

Номер ссылки на получение. Недоступно для Account verification.

${AUTH_CODE}

n/a

Код авторизации. Недоступно для Account verification.

${CARD_TYPE}

n/a

Тип карты. Недоступно для Account verification.

${LAST_FOUR_DIGITS}

n/a

Последние четыре цифры карты. Недоступно для Account verification.

${CUSTOMER_REDIRECT_URL}

n/a

URL, на который держатель карты будет перенаправлен после завершения транзакции.

Payment Cashier Page Customization

Примечание

Эта страница относится только к интеграции Payment Cashier.

Parallel Form Template Sample

Parallel Form — это форма для выбора Плательщиком одного из доступных способов оплаты для выполнения транзакции.

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<!-- country selector -->
<span id="countryIsoCode" style="display: none;">$!CUSTOMER_IP_COUNTRY_ISO_CODE</span>
<div class="container">
    <input name="customer_language_code" id="iso" type="hidden" value="$CUSTOMER_LANGUAGE"/>
    #if (!$HAS_PARALLEL_FORM_PAYMENT_METHODS)
        <select id="countrySelector" onchange="onCountrySelected(this);">
            <option value="EU">Europe</option>
            <!-- You may add other countries for selection to this list -->
        </select>
    #end
    #if ($HAS_PARALLEL_FORM_PAYMENT_METHODS)
        <div class="form-tabs">
            <ul id="formTabs" class="form-tabs-ul">
                #foreach ($paymentMethod in $PARALLEL_FORM_PAYMENT_METHODS)
                    <li id="$!{paymentMethod.identifier}-FORM-button" class="form-tab-button#if($velocityCount == 1) form-tab-button-active form-tab-button-active-$!{paymentMethod.identifier}#end" #if($paymentMethod.iframe) onclick="chooseIframe('$!{paymentMethod.identifier}');" #end>
                        $!{paymentMethod.name}
                    </li>
                #end
            </ul>
            <select id="countrySelector" onchange="onCountrySelected(this);">
                <option value="EU">Europe</option>
                <!-- You may add other countries for selection to this list -->
            </select>
        </div>
    #foreach ($paymentMethod in $PARALLEL_FORM_PAYMENT_METHODS)
        <div class="ssl-header ssl-header-$!{paymentMethod.identifier}" id="merchant-description-$!{paymentMethod.identifier}" #if ($velocityCount> 1) style="display: none;"#end>
            <span class="ssl-text">${MERCHANT}</span>
            <div>
                <span class="flag-EN" id="flag-$!{paymentMethod.identifier}"></span>
                <select id="langSelector-$!{paymentMethod.identifier}" class="langSelector langSelector-$!{paymentMethod.identifier}" onchange="selectLang('$!{paymentMethod.identifier}');">
                    <option value="EN">English</option>
                    <!-- You may add other languages for selection to this list -->
                </select>
            </div>
        </div>
        <script>
            merchantОписаниеIds.push("merchant-description-$!{paymentMethod.identifier}");
            paymentMethodsCountries["$!{paymentMethod.identifier}"] = "$!{paymentMethod.countries}";
        </script>
    #end
    #end
    #if ($HAS_PARALLEL_FORM_PAYMENT_METHODS)
        #foreach ($paymentMethod in $PARALLEL_FORM_PAYMENT_METHODS)
            #if ($paymentMethod.iframe)
                <div class="frame-container-$!{paymentMethod.identifier} payment-method-iframe" id="$!{paymentMethod.identifier}-FORM" pneopen="#if ($velocityCount == 1)true#{else} false#end" pnesrc="$!paymentMethod.initSessionUrl" #if ($velocityCount> 1) style="display: none;"#end>
                    <iframe src="#if ($velocityCount == 1)$!paymentMethod.initSessionUrl#end" scrolling="#if $!{paymentMethod.identifier} == 'QIWI' || $!{paymentMethod.identifier} == 'ASTROPAY')yes#{else}no#end">
                    </iframe>
                </div>
            #end
        #end
        <form id="waitForm" action="$!WAIT_FORM_URL">
            #foreach( $p in $WAIT_FORM_PARAMETERS )
                <input type="hidden" name="$p.key" value="$!p.value">
            #end
            <!--$!{INTERNAL_SECTION}-->
        </form>
    #end
</div>
</body>
</html>

Подробнее см. Country Codes и Language Codes.

Parallel Form Macros

Макрос имени поля

Field Value Macro

Описание

$!CUSTOMER_IP_COUNTRY_ISO_CODE

n/a

Страна плательщика, определённая по IP-адресу.

$!CUSTOMER_COUNTRY_CODE

n/a

Страна выставления счёта клиента, переданная во входящем API-запросе.

$CUSTOMER_LANGUAGE

n/a

Язык Плательщика, переданный Присоединяющейся стороной через входные параметры или определяемый настройками браузера, если первый не задан.

$HAS_PARALLEL_FORM_PAYMENT_METHODS

n/a

Определяет доступность параллельных методов оплаты формы.

$paymentMethod

n/a

Объект метода оплаты.

$PARALLEL_FORM_PAYMENT_METHODS

n/a

Массив с доступными параллельными методами оплаты формы.

$!{paymentMethod.identifier}

n/a

Идентификатор метода оплаты.

$velocityCount

n/a

Порядковый номер метода оплаты.

$paymentMethod.iframe

n/a

Iframe метода оплаты.

$!{paymentMethod.name}

n/a

Описание: Payment method name.

${MERCHANT}

n/a

End point display название.

$!{paymentMethod.countries}

n/a

Страны, установленные для этого метода оплаты.

$$!paymentMethod.initSessionUrl

n/a

URL для инициализации сессии метода оплаты.

$!WAIT_FORM_URL

n/a

Описание: Waiting form URL.

$p

n/a

Параметр формы ожидания.

$WAIT_FORM_PARAMETERS

n/a

Массив параметров формы ожидания.

$p.key

n/a

Ключ параметра формы ожидания.

$!p.value

n/a

Значение параметра формы ожидания.

$!{INTERNAL_SECTION}

n/a

Внутренний для интеграции iFrame.

Parallel Form Scripts

Следующие скрипты Parallel Form необходимы для её работы. Первый скрипт следует добавить в тег <head> html-документа:

<script type="text/javascript">
var merchantОписаниеIds = [];
var paymentMethodsCountries = {};
function isCCValid(r) {
    var n = r.length;
    if (n > 19 || 13 > n) return !1;
    for (i = 0, s = 0, m = 1, l = n; i < l; i++) d = parseInt(r.substring(l - i - 1, l - i), 10) * m, s += d >= 10 ? d % 10 + 1 : d, 1 == m ? m++ : m--;
    return s % 10 == 0 ? !0 : !1
}

function runPayment(t) {
    if (isCCValid(t)) {
        return !0;
    } else {
        document.getElementById('cardnumber').style.borderColor = '#fb860f';
        return !1;
    }
}

function chooseIframe(paymentMethodName) {
    var id = paymentMethodName + '-FORM';
    var iframes = document.getElementsByTagName('IFRAME');
    for (var i = 0; i < iframes.length; i++) {
        var iframe = iframes[i].parentNode;
        var isCurrent = iframe.id == id;
        iframe.style.display = isCurrent ? 'block' : 'none';
        if (isCurrent && iframe.getAttribute("pneopen") == 'false') {
            iframe.firstElementChild.src = iframe.getAttribute("pnesrc") + "?country=" + document.getElementById("countryIsoCode").innerText;
            iframe.setAttribute("pneopen", 'true');
        }
        var buttonElem = document.getElementById(iframe.id + '-button');
        buttonElem.className = (iframe.id == id) ? 'form-tab-button form-tab-button-active form-tab-button-active-' + paymentMethodName : 'form-tab-button';
    }
    var descriptionId = 'merchant-description-' + paymentMethodName;
    for (var i = 0; i < merchantОписаниеIds.length; i++) {
        var isCurrent = merchantОписаниеIds[i] == descriptionId;
        document.getElementById(merchantОписаниеIds[i]).style.display = isCurrent ? 'flex' : 'none';
    }
}

function pneInit() {
    window.pneMasterSessionProcessed = function() {
        document.getElementById('waitForm').submit()
    }
    foreach( $paymentMethod in $PARALLEL_FORM_PAYMENT_METHODS )
        if( $paymentMethod.default )chooseIframe('$!{paymentMethod.identifier}-FORM');
        break
    end
    end
}
</script>

Второй скрипт следует добавить в HTML-код перед закрывающим тегом </body>.

<script type="text/javascript">
function updateTabsVisibility() {
    var countryCode = getSelectedCountryCode();
    var paymentMethods = getPaymentMethods();
    var someIframeShown = false;
    for (var i = 0; i < paymentMethods.length; i++) {
        var paymentMethod = paymentMethods[i];
        var visible = isPaymentMethodVisible(paymentMethod, countryCode);
        updateTabVisibility(paymentMethod, visible);
        if (visible && !someIframeShown) {
            chooseIframe(paymentMethod);
            someIframeShown = true;
        }
    }
}

function getSelectedCountryCode() {
    return document.getElementById('countryIsoCode').innerText;
}

function setSelectedCountryCode(countryCode) {
    document.getElementById('countryIsoCode').innerText = countryCode;
}

function getPaymentMethods() {
    var lis = document.getElementById("formTabs").children;
    var result = [];
    for (var i = 0; i < lis.length; i++) {
        var li = lis[i];
        var id = li.id;
        if (id != null) {
            result.push(id.substring(0, id.indexOf("-FORM-button")));
        }
    }
    return result;
}

function isPaymentMethodVisible(paymentMethodId, countryCode) {
    if (paymentMethodsCountries[paymentMethodId] == "") {
        return true;
    } else {
        return paymentMethodsCountries[paymentMethodId].indexOf(countryCode) > -1;
    }
}

function updateTabVisibility(paymentMethod, visible) {
    document.getElementById(paymentMethod + '-FORM-button').style.display = visible ? 'inline-block' : 'none';
}

function onCountrySelected(selector) {
    setSelectedCountryCode(selector.value);
    updateTabsVisibility();
}

document.addEventListener('DOMContentLoaded', function() {
    pneInit();
    updateTabsVisibility();
    document.getElementById('countrySelector').value = getSelectedCountryCode();
});

function syncLangSelectors(ISO) {
    var methods = getPaymentMethods();
    for (var i = 0; i < methods.length; i++) {
        document.getElementById('flag-' + methods[i]).className = "flag-" + ISO;
        document.getElementById('langSelector-' + methods[i]).value = ISO;
    }
}

var ISO = document.getElementById('iso').value.toUpperCase();
ISO = 'EN';
document.getElementById('iso').value = ISO;
syncLangSelectors(ISO);

document.addEventListener('DOMContentLoaded', function() {
    //l10n();
});

function selectLang(method) {
    var ISO = document.getElementById('langSelector-' + method).value.toUpperCase();
    document.getElementById('iso').value = ISO;

    syncLangSelectors(ISO);
    //l10n();
}
</script>

Если необходимо определить страну биллинга Плательщика по данным, переданным через API, используется $!CUSTOMER_COUNTRY_CODE. Если необходимо определить страну биллинга Плательщика по IP-адресу из браузера Плательщика, используйте $!CUSTOMER_IP_COUNTRY_ISO_CODE; страна биллинга также изменится в соответствии с IP.

Основной набор по стране выставления счёта:

<span id="countryIsoCode" style="display: none;">$!CUSTOMER_COUNTRY_CODE</span>
<input name="customer_language_code" id="iso" type="hidden" value="$CUSTOMER_LANGUAGE"/>
        <div class="country-select">