REST — наиболее полный протокол передачи данных, предоставляющий всю доступную функциональность для приложений электронной коммерции, которые поддерживают автоматизированную логику проведения заказов. Компонент по созданию форм обратной связи Chronoforms таким приложением не является, но, тем не менее, он позволяет реализовать соединение с удаленным сервером, создавать полноценные запросы и принимать массивы данных по протоколу REST.

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

Общий объем работ будет таким:

  1. Настройка REST на стороне Qiwi.
  2. Определение набора параметров для передачи удаленному серверу.
  3. Создание мультистраничной формы, которая сформирует запрос, отправит его и получит массив данных от сервера. Затем, в зависимости от выбора пользователя, форма либо перенаправит его на сайт Qiwi для немедленной оплаты, либо отправит на указанный e-mail сообщение со всем содержимым счета и ссылкой, по которой можно осуществить платеж до указанного времени.

Настройка приема платежей по REST на стороне Qiwi

Для осуществления вышеуказанной задачи в принципе необходимо наличие зарегистрированного и одобренного модераторами магазина Qiwi (https://ishop.qiwi.com).

На странице настроек аккуанта, в протоколах, нужно выбрать пункт «REST-протокол», после чего откроется страница с немногочисленными полями и переключателями настроек и тестовой формой. Нас интересуют верхние два раздела:

  • Аутентификационные данные:
    • ID проекта — 6-значная цифра.
    • API ID — сюда входят сразу два параметра — как идентификатор, так и пароль. Поэтому, если актуальный пароль неизвестен или утерян, нужно кликом по ссылке «Сгенерировать новый ID» получить новую пару «идентификатор-пароль». Сохранить пароль можно в каком-нибудь текстовом файлике, откуда его можно будет скопировать.
  • Настройки Pull (REST) протокола:
    • Основной переключатель нужно установить в положение «Включено».
    • Переключатель «Включить уведомления», если вы не предполагаете интегрировать форму в шаблоны расширений электронной коммерции, можно установить в положение «Выключено» (в нашем примере они не понадобятся).

И еще: вне зависимости от того, какую технологию связи с Qiwi вы выбрали (HTTP или REST), будет целесообразно активировать уведомления системы на ваш email. Сделать это можно так же в разделе настроек аккуанта Qiwi путем перехода к пункту «Оповещение по email» и установки переключателя в положение «Включено». В списке по умолчанию уже должен быть тот адрес электронной почты, который вы указывали при регистрации магазина. Его можно удалить из списка, заменив другим, а можно просто дополнить другими адресами. Эти изменения никак не повлияют на параметр электронный почте в данных вашего договора/проекта.

На этом настройку приема платежей по REST на стороне Qiwi мы завершили и можно переходить к определению набора параметров для передачи на удаленный сервер и оперирования данными полученного ответа.

Параметры формирования счета для передачи серверу Qiwi по технологии REST и содержимое массива ответа

В этом примере мы не будем использовать весь функционал, предоставляемый REST API Qiwi, а рассмотрим лишь те, которые необходимы для формирования счета и обработки ответа от удаленного сервера.

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

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

Таблица 1. Параметры PUT-запроса для выставления счета пользователю

Параметр Формат значения и описание Пример
Обязательные параметры
prv_id Числовой идентификатор провайдера (идентификатор магазина, который отображается в пункте «ID проекта» в аккуанте на  ishop.qiwi.com  и в разделе «REST-протокол» «Аутентификационные данные») 123456
bill_id Номер транзакции в вашей системе. Любая непустая строка до 200 символов, которая может включать цифры, буквы, знаки нижнего подчеркивания, тире 99111-ABCD-1-2-1
АВС _1-2-1  
REST_ID Идентификатор REST API. Целое 9-значное число 123456789
PWD Пароль REST API. Строка. Может содержать как цифры, так и буквы. -
user Идентификатор учетной записи пользователя, которому выставляется счет. Равен номеру телефона пользователя в международном формате с префиксом «tel:+». tel:+97776665544
amount Сумма, на которую выставляется счет. Положительное число, округленное до 2 или 3 знаков после десятичной точки.
Способ округления зависит от валюты.
3.54
ccy Трёхбуквенная аббревиатура. Идентификатор валюты (Alpha-3 ISO 4217 код)  RUB
comment Комментарий к счету. Любой текст -
lifetime Дата, до которой счет будет доступен для оплаты. Если счет не будет оплачен до этой даты, ему присваивается финальный статус и последующая оплата станет невозможна.
Внимание!
1) По истечении 45 суток от даты выставления счет автоматически будет переведен в финальный статус.
2) Указывается московское время Параметр
«Дата/время» указывается с точностью до секунд в формате ISO 8601 (ГГГГ-ММ-ДД'T'чч:мм:сс).
2019-03-05T15:06:28+03:00
Дополнительные параметры
pay_source При значении "mobile" оплата счета будет производиться с баланса мобильного телефона пользователя, "qw" – любым способом через интерфейс Visa QIWI Wallet.
Отсутствие параметра эквивалентно указанию значения "qw"
-
prv_name Название провайдера. Любой текст до 100 символов. Мой магазин

Для выставления счета пользователю Visa QIWI Wallet от провайдера (с вашего сайта) нужно отправить PUT-запрос по адресу https://api.qiwi.com/api/v2/prv/{prv_id}/bills/{bill_id}.

Ответ сервера представляет собой объект «response», возвращаемый в виде массива данных в формате json, который включает следующие элементы:

  1. result_code (целое число от 0 до 5000, код ошибки выполнения операции)
  2. bill (этот элемент обычно присутствует, если result_code=0):
    • bill_id
    • amount
    • ccy
    • status (у вновь созданного с помощью формы счета этот параметр будет всегда равен «waiting» — ожидает оплаты)
    • error
    • user
    • comment

Таблица 2. Коды ответа сервера Qiwi при формировании счетов (возможные значения параметра result_code) *

Код Описание Фатальность.
Означает, что при повторном запросе результат не изменится (ошибка не временная)
0 Успех -
5 Неверные данные в параметрах запроса Да
13 Сервер занят, повторите запрос позже Нет
78 Недопустимая операция Да
150 Ошибка авторизации провайдера Да
152 Не подключен или отключен протокол Нет
155 Данный идентификатор провайдера (API ID) заблокирован Да
210 Счет не найден Да
215 Счет с таким bill_id уже существует Да
241 Сумма слишком мала Да
242 Сумма слишком велика.
Также возвращается в случае, если сумма, переданная в запросе возврата средств, превышает сумму самого счета либо сумму счета, оставшуюся после предыдущих возвратов
Да
298 Кошелек с таким номером не зарегистрирован Да
300 Техническая ошибка Нет
303 Неверный номер телефона Да
316 Попытка авторизации заблокированным провайдером Нет
319 Нет прав на данную операцию Нет
339 Ваш IP-адрес или массив адресов заблокирован Да
341 Обязательный параметр указан неверно или отсутствует в запросе Да
700 Превышен месячный лимит на операции Да
774 Кошелек временно заблокирован Нет
1001 Запрещенная валюта для провайдера Да
1003 Не удалось получить курс конвертации для данной пары валют Нет
1019 Не удалось определить сотового оператора для мобильной коммерции Да
1419 Нельзя изменить данные счета – он уже оплачивается или оплачен Да

* — Здесь приведен полный список с кодами ошибок.

Таблица 3. Параметры HTTP-запроса, отправляемые методом GET, которые используются при перенаправлении пользователя на Qiwi для последующей оплаты

Название параметра Описание Пример значения
Обязательные параметры
shop ID проекта (вашего магазина в аккуанте QIWI ishop). Шестизначная цифра 123456
transaction Номер транзакции в вашей системе. Должна соответствовать значению bill_id, отправленному на сервер Qiwi при  формировании счета 99111-ABCD-1-2-1
АВС _1-2-1
qiwi_phone Номер телефона пользователя 97776665544
Дополнительные параметры
successUrl Url, на который перенаправляется пользователь при успешной оплате счета. http://myshop.ru/success
failUrl Url, на который перенаправляется пользователь при неудачной операции оплаты счета. http://myshop.ru/fail

Адрес перенаправления пользователя на сервер Qiwi для оплаты счета такой https://qiwi.com/order/external/main.action. Далее к нему добавляются GET-параметры из таблицы 3.

Теперь, исходя из вышеописанного, хочу отметить:

  1. У нас получается, по крайней мере, два параметра, характеризующих каждый, отдельно взятый товар: цена — «amount» и название. Для нашего примера я взяла в качестве названия товара комментарий — «comm». Это сугубо опционально, возможны другие варианты. В вашем проекте таких индивидуальных параметров товара может быть больше. Независимо от количества и типа этих переменных, нужно обеспечить их хранение на стороне Joomla для последующей передачи на форму. Подробно, как это сделать, описано здесь.
  2. Для использования переменных «successUrl» и «failUrl» необходимо создать две соответствующих им страницы в материалах Joomla.
  3. Все действия по двум предыдущим пунктам нужно завершить до начала работы над созданием формы приема платежей. Исключением будет наличие в вашем проекте компонента электронной коммерции. В этом случае вопрос с хранением индивидуальных параметров можно считать решенным — на форме останется только получать эти переменные с помощью соответствующих API-функций.

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

Создание формы для отправки счетов серверу Qiwi по протоколу REST

Форма для отправки счетов на сервер Qiwi будет выполнять следующие действия:

  1. Формирование PUT-запроса и отправку его удаленному серверу Qiwi
  2. Прием и обработку ответа от сервера
  3. Перенаправление пользователя на страницу сервиса Qiwi для немедленной оплаты счета (если таковой вариант оплаты был им выбран)
  4. Отправка почтового сообщения пользователю с содержимым счета и ссылкой для оплаты, если он выбрал соответствующий вариант.

В виде схемы ее работу можно представить так:

Рис. 1

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

Создание интерфейса формы во вкладке «Конструктор»

Создаем новую форму в расширенном режиме. Присваиваем ей имя и алиас. Переходим во вкладку «Конструктор».

Здесь при создании формы первая страница с именем «one» уже сгенерирована. Добавляем к ней остальные три и помещаем на все четыре страницы поля так, как показано на схеме (см. рис. 1).

В итоге интерфейс новой формы должен выглядеть следующим образом:

Теперь пройдемся по настройкам всех полей формы соответственно их типам.

Поля интерфейса формы с типом «Hidden field»

Имя * ID поля * Value
page_url page_url  
shop shop  
bill_id bill_id  
comment comment  
amount amount  
lifetime lifetime  
date date  
successUrl successUrl https://ваш-домен/адрес-страницы-успешной-оплаты-счета
failUrl failUrl https://ваш-домен/адрес-страницы-неудачной-транзакции
delay_order_link delay_order_link  
now_order_link now_order_link  
result_code result_code  

Поля интерфейса формы с типом «Text field»

Имя * ID поля * Метка Текст в поле по умолчанию (placeholder) Вкладка «Валидация»
Переключатель «Обязательное»
Маска Email
familiya familiya Фамилия Введите Вашу фамилию Да    
imya imya Имя Введите Ваше имя Да    
otchestvo otchestvo Отчество Введите Ваше отчество Да    
user user Ваш номер телефона   Да Phone: +9(999)999-9999  
email email Email Введите Ваш адрес электронной почты Да   Да

Поля интерфейса формы с типом «Button»

Имя * ID поля * Контент Тип
button6 button6 Сформировать счет submit
button41 button41 Очистить reset
button22 button22 Далее submit

Вспомогательные поля интерфейса формы с типами «CSS» и «HTML»

Имя *:
css8
Контент:
    .tableresponse {
        border: 2px solid #777;
        width: 100%;
        margin: 1.5em 0;
        padding: 0;
        word-wrap: break-word;
        border-collapse: collapse;
        border-spacing: 0;
        display: table;
    }
    .tableresponse, .tableresponse * {
        box-sizing: border-box;
        vertical-align: baseline;
    }
    .tableresponse thead {
        display: table-header-group;
        border-color: inherit;
    }
    .tableresponse tr {
        display: table-row;
        border: 1px solid #777;
        text-align: center;
    }
    .tableresponse td, .tableresponse th {
        display: table-cell;
        vertical-align: inherit;
        padding:0.3em !important;
        border: 1px solid #999;
    }
    .tableresponse th  {
        font-style:italic;
        font-weight:bold;
        color:#666;
        border: 2px solid #777;
        text-align:center !important;
    }
    .tableresponse td  {
        border-left: 2px solid #777;
    }
    .tableresponse td:first-child, .tableresponse th:first-child  {
        text-align:left !important;
    }
    
    @media screen and (max-width: 480px) {
    
      .tableresponse thead {
           display: none;
      }
      .tableresponse td:before {
          content: attr(data-label);
          float: left !important;
          clear:right;
          font-style:italic;
          font-weight:bold;
          color:#777;
          padding:0.3em !important;
          margin-top:-0.3em;
          vertical-align: baseline;
      }
      .tableresponse tr {  
          display: block;
          border-bottom: 2px solid #777;
          border-left:none;
          border-right:none;
      }
      .tableresponse > * > tr + tr {
         margin-top:0.8em;
      }
      .tableresponse td {
        display: block;
        text-align: right;
        border: 0;
        border-bottom: 1px solid #999;
        width: 100%;
      }
      .tableresponse td:first-child {
          text-align:right !important;
          border-top: 2px solid #777;
      }
      .tableresponse th:first-child {
          text-align:left !important;
      }
    }
Имя *:
html13
Контент:
  <table class="tableresponse">
      <thead>
          <tr>
              <th>Номер транзакции</th>
              <th>Товар</th>
              <th>Сумма</th>
          </tr>
      </thead>
      <tbody>
          <tr>
              <td data-label="Номер транзакции">{data:bill_id}</td>
              <td data-label="Товар">{data:comment}</td>
              <td data-label="Сумма">{data:amount}</td>
          </tr>
      </tbody>
  </table>
Имя *:
html17
Контент:
  <?php
 
      $user = preg_replace('![^0-9]+!', '', $this->data('user', null));
      $SHOP_ID = $this->data('shop', null);
      
      $successUrl = $this->data('successUrl', null);
      $failUrl = $this->data('failUrl', null);
      
      $delay_link = 'https://qiwi.com/order/external/main.action?shop='.$SHOP_ID.'&transaction='
      .($this->data('bill_id', null)).'&qiwi_phone='.$user;
      
      $this->data('delay_order_link',  $delay_link, true);     // Передаем
      
      $now_link = 'https://qiwi.com/order/external/main.action?shop='.$SHOP_ID.'&transaction='
      .($this->data('bill_id', null)).'&successUrl='.$successUrl.'&failUrl='.$failUrl.'&qiwi_phone='.$user;
      
      $this->data('now_order_link',  $now_link, true);     // Передаем
 
  ?>
  <div class="alert-block alert-success">
    <h3 align="center">Уважаемый (ая)  {data:imya} {data:otchestvo}!</h3>
    <p align="center">Для Вас сформирован счет № <strong><em>{data:bill_id}</em></strong> на сумму <strong><em>{data:amount}</em></strong> рублей, доступный к оплате до <strong><em>{data:date}</em></strong>.</p>
  </div>
Имя *:
html18
Контент:
  <?php
      $result_code = $this->data('result_code', 'event');
      $error_message = "";
      
      switch ($result_code) {
      case 150 : $error_message = "Код  #150. Ошибка авторизации провайдера.";
          break;
      case 152 :
          $error_message = "Код #152. Протокол не был подключен (либо был отключен).";
          break;
      case 155 :
          $error_message = "Код #155. Идентификатор провайдера заблокирован.";
          break;
      case  298 :
          $error_message = "Код #298. Кошелек с таким номером не зарегистрирован.";
          break;
      case 300 :
          $error_message = "Код #300. Техническая ошибка.";
          break;
      case 303 :
          $error_message = "Код #303. Недействительный номер телефона пользователя.";
          break;
      case 316 :
          $error_message = "Код #316. Попытка авторизации заблокированным провайдером.";
          break;
      case 341 :
          $error_message = "Код #341. Обязательный параметр указан неверно или отсутствует в запросе.";
          break;
      case 700 :
          $error_message = "Код #700. Превышен месячный лимит на операции.";
          break;
      case 774 :
          $error_message = "Код #774. Кошелек временно заблокирован.";
          break;
      default:
          $error_message =  "Ошибка неизвестна.";
      }
  ?>
  <div class="alert-block alert-danger">
      <h3 align="center">Счет не был сформирован!</h3>
      <p align="center"><?php echo $error_message; ?></p>
  </div>
Имя *:
html21
Контент:
  <div class="alert-block alert-success">
      <h3 align="center">Уважаемый (ая)  {data:imya} {data:otchestvo}!</h3>
      
      <p>На указанный Вами e-mail отправлен счет № <strong><em>{data:bill_id}</em></strong> на сумму <strong><em>{data:amount}</em></strong> рублей, который Вы сможете оплатить до <strong><em>{data:date}</em></strong> в удобное для Вас время.</p>
      <p>Для оплаты счета необходимо перейти по ссылке в письме.</p>
      
      <p align="center">Благодарим за покупку!<br>
      Вы сделали правильный выбор!</p>
  </div>

Элемент с типом «Radios group»

Имя:
choicepayment
ID поля:
choicepayment
Внешний вид:
Вертикальное
Options:
now=Оплатить сейчас
deferred=Оплатить позже
Вкладка «Валидация» «Обязательное»:
Включено
Вкладка «Дополнительно» «Стиль»:
По умолчанию.

* — Имена и идентификаторы этих полей не обязательно должны быть именно такими, а некоторые из них не подлежат корректировке («HTML» и «CSS», например). Но если они все же будут отличаться от указанных в таблицах, необходимо внимательно отнестись к правкам кода в предложенных здесь скриптах.

С визуальной частью проекта закончили и теперь можно преступить к настройке его функционала.

Создание функционала формы во вкладке «Настройка»

Здесь будем двигаться от простого к сложному.

Добавим к существующим событиям «load» и «submit» еще три:

  • page_two
  • page_three
  • page_four

и расположим в областях четырех событий те элементы и в том порядке, как указано на этих рисунках:

Рис. 2

Рис. 3

Рис. 4

Рис. 5

Теперь вернемся к событию «submit» и выполним, согласно схеме (см. рис. 1) следующие действия (по порядку сверху вниз):

  1. Добавим в область события функции:
    • Multi Page
    • PHP
    • Event Switcher
  2. У добавленного в п. 1 элемента «Event Switcher» в поле «События — список разделенных запятой элементов» создаем события, разделенные запятой без пробела «true,false» (без кавычек). После чего нажимаем кнопку «Обновить события».
  3. В область события «true», добавленного в п. 2 помещаем следующие функции:
    • PHP
    • Custom Code
    • PHP
    • Event Switcher
  4. У добавленного в п. 3 элемента «Event Switcher» в поле «События — список разделенных запятой элементов» создаем события, разделенные запятой без пробела «true,false» (без кавычек). После чего нажимаем кнопку «Обновить события».
  5. В область события «true», добавленного в п. 4 помещаем функцию «Redirect».
  6. В область события «false», добавленного в п. 4 помещаем функцию «Redirect».
  7. В область события «false», добавленного в п. 2 помещаем функцию «Event Switcher».
  8. У добавленного в п. 7 элемента «Event Switcher» в поле «События — список разделенных запятой элементов» создаем события, разделенные запятой без пробела «now,deferred» (без кавычек). После чего нажимаем кнопку «Обновить события».
  9. В область события «now», добавленного в п. 8 помещаем функцию «Redirect».
  10. В область события «deferred», добавленного в п. 8 помещаем функцию «Redirect».

После действий, выполненных по пунктам 1–10, событие «submit» будет выглядеть следующим образом:

Рис. 6

После того, как завершили размещение функций-обработчиков в областях всех событий, можно преступать к их непосредственной настройке. Так же, как и в случае с визуальной частью формы, привожу настройки схожих по свойствам функций в таблицах, а некоторых — в списках. При этом их имена будут соответствовать именам функций на рисунках 2–6:

Настройки функций «Multi Page»

Имя * Источник данных Идентификатор Галка «Добавить данные этого звена многострочной цепочки к глобальным данным?»
multi_page51 {data:} multipage Да
multi_page38 {session:multipage} multipage Да
multi_page37 {session:multipage} multipage Да
multi_page16 {session:multipage} multipage Да

Настройки функций «Display Section»

Настройки функций «Event Switcher» (для сверки существующих значений и добавления новых)

Имя * Источник данных События - список разделенных зяпятой элементов
switch_events53 {var:php57} true,false
switch_events59 {var:php64} true,false
switch_events14 {data:choicepayment} now,deferred

Настройки функций «Redirect»

Имя * Событие URL-адрес перенаправления Параметры URL
redirect65 page_three {url:_self} chronoform=qiwirest (где qiwirest – имя вашей формы, соответствует ее алиасу)
redirect66 page_two {url:_self} chronoform=qiwirest (где qiwirest – имя вашей формы, соответствует ее алиасу)
redirect40   {data:now_order_link}  
redirect42 page_four {url:_self} chronoform=qiwirest (где qiwirest – имя вашей формы, соответствует ее алиасу)

Настройки функций «PHP» и «Custom Code»

Имя:
php9
Код:
  $_SESSION = array();
  ////////////////  shop  ////////////////////////////////////
  $this->data('shop', 'ID_вашего_проекта', true);  // Передаем
 
  ////////////////  bill_id  ////////////////////////////////////
  $string = '';
      $array = array_merge(range('A','Z'));
      for($i = 0; $i < 3; $i++){
          $string .= $array[mt_rand(0, 25)];
      }
 
      $alpha =  $string;
      $aID = JRequest::getInt('id');
      $datetime = date ("dmYHis");
      $this->data('bill_id', $alpha.'_'.$aID.'_'.$datetime, true);  // Передаем
 
  ////////////////  comment  ////////////////////////////////////
  $doc = \JFactory::getDocument();  
  $title = $doc->getTitle();
  $this->data('comment', $title, true);  // Передаем
 
  ////////////////  page_url  ////////////////////////////////////
  $page_url = $doc->getBase();
  $this->data('page_url', $page_url, true);  // Передаем
 
  //////////////// amount ////////////////////////////////////
  $article_id = JRequest::getInt('id');
                                                      // получаем массив имен jcfields по ID статьи
  $customFieldnames = FieldsHelper::getFields('com_content.article', $article_id, true);
                                                      // получаем массив идентификаторов jcfields по массиву имен $customFieldnames
  $customFieldIds = array_map(create_function('$o', 'return $o->id;'), $customFieldnames);
                                                      // получаем модель  jcfields
  $model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
                                                      // получаем массив значений  jcfields по массиву идент-ров $customFieldIds
 
  $customFieldValues = $model->getFieldValues($customFieldIds, $article_id);
 
  $customFValue = null;
  foreach ($customFieldValues as $value) {
  $customFValue = $value;
  }
  $this->data('amount', $customFValue, true); // Передаем
 
  //////////////// lifetime ////////////////////////////////////
  $date= strtotime('+3 days');
  $lifetime = date('c', $date);
  $this->data('lifetime', $lifetime, true);     // Передаем
 
  //////////////// date ////////////////////////////////////////
  $this->data('date',  date('d.m.Y  H:i', strtotime($this->data('lifetime',""))), true);     // Передаем
Имя *:
php57
Код:
  if (isset($_POST['button6'])) { return true; } else {return false; }
Имя *:
php10
Код:
  $user = preg_replace('![^0-9]+!', '', $this->data('user', null));
  $bill_id = $this->data('bill_id', null);
  $amount = $this->data('amount', "0.00");
  $comment = $this->data('comment', "");
  $lifetime = $this->data('lifetime', null);       
 
  $SHOP_ID = $this->data('shop', null);;
  $REST_ID = "Ваш_REST_ID";
  $PWD = "Ваш_пароль_REST_API";
  $CURRENCY = "RUB";
  $PROJECTNAME = "Название_вашего_проекта";
  $PAYSOURCE = "qw";
 
  $data = array(
   "user" => "tel:+" . $user,
   "amount" => $amount,
   "ccy" => $CURRENCY,
   "comment" => $comment,
   "lifetime" => $lifetime,
   "pay_source" => $PAYSOURCE,
   "prv_name" => $PROJECTNAME
  );
 
  $ch = curl_init('https://api.qiwi.com/api/v2/prv/'.$SHOP_ID.'/bills/'.$bill_id);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($ch, CURLOPT_USERPWD, $REST_ID.":".$PWD);
  curl_setopt($ch, CURLOPT_HTTPHEADER,array (
   "Accept: application/json"
  ));
 
  $results = curl_exec ($ch);
 
  $newresults = json_decode($results, true);
 
  echo curl_error($ch);
  curl_close ($ch);
 
  return $newresults;
Имя *:
custom_code81
Контент:
  {session.set:result_code$(var:php10.response.result_code)}
Имя *:
php64
Код:
  if ($this->get("php10.response.result_code", null) > 0) { return true;} else {return false;}
Имя *:
custom_code68
Контент:
  {data.set:result_code$(session:result_code)}

Настройки функции «Email»

Имя *:
email43
Список получателей (через запятую без пробелов можно добавить адреса администраторов сайта):
{data:email}
Тема:
Счет № {data:bill_id} ожидает оплаты
Автодобавление значений полей:
«Отключено»
Тело документа:
  <h3 align="center">Уважаемый (ая)  {data:imya} {data:otchestvo}!</h3>
  <p>Вы сформировали на сайте MYSITE.RU следующий счет:</p>
  <table border="1" cellpadding="5" cellspacing="0" align="center">
      <thead>
          <tr>
              <th>№ счета</th>
              <th>Товар</th>
              <th>Сумма</th>
              <th>Статус</th>
          </tr>
      </thead>
      <tbody>
          <tr>
              <td>{data:bill_id}</td>
              <td>{data:comment}</td>
              <td>{data:amount}</td>
              <td>ожидает оплаты</td>
          </tr>
      </tbody>
  </table>
  <p>Вы можете совершить оплату в удобное для Вас время до {data:date} путем перехода по <a href="{data:delay_order_link}" target="_blank">ссылке</a>.</p>
  <hr style="margin-top:40px;">
  <p><small><em color="gray">Спасибо за покупку!</em></small></p>
Отправить как:
HTML

* — Имена функций, опять же, не обязательно должны быть именно такими, как указано на рисунках 2–6, в таблицах и списках с описанием настроек. Но если они в вашем проекта все же отличаются, то нужно предельно внимательно присвоить их настройкам указанные выше значения, а в коде полей «Контент» и «Код» скрипты должны передавать значения соответствующим полям и функциям. В противном случае работоспособность формы (или ее части) окажется под вопросом.

На этом, работа над формой приема платежей закончена. Ее сохраняем и закрываем. Далее создаем модуль в панели управления Joomla с типом «ChronoForms6», где нужно присвоить в качестве имени алиас нашей формы. Выводим модуль в заранее заготовленную в шаблоне материала/товара позицию. О том, как подготовить позицию, подробно описано здесь.

Если же при создании и работе над проектом формы что-то все же упустили, и она не работает или работает не так, как нужно, можно воспользоваться функцией отладки «Debugger». В данном случае, такие функции должны быть размещены самыми последними в теле каждого из событий. Результирующие листинги отладчиков с большей вероятностью помогут разобраться, где именно совершена ошибка.

 
Добавить комментарий