Создание, продвижение сайтов
40-33-54

Оплата доступа к ноде с помощью Робокассы

14 января 2017

Пример организации платного доступа к конкретной ноде с помощью модуля Robokassa Merchant и своего кода.

Будем продавать доступ к материалам типа article.

1. Настраиваем модуль робокассы и сам мерчант.

2. Добавляем типу материала Article два поля:

— Цена, field_price, тип Integer
— Покупатели, field_buyers, тип Entity reference

3. Скрываем контент для не оплативших пользователей — будем при просмотре full ноды переключать дисплей на teaser:

/**
 * Return TRUE if user paid node.
 */
function modulename_user_is_paid($node, $uid = NULL) {
  if ($uid === NULL) {
    $uid = $GLOBALS['user']->uid;
  }
  $node_wrapper = entity_metadata_wrapper('node', $node);
  return in_array($uid, $node_wrapper->field_buyers->raw());
}
 
/**
 * Implements hook_entity_view_mode_alter().
 */
function modulename_entity_view_mode_alter(&$view_mode, $context) {
  if ($context['entity_type'] == 'node'
  && $context['entity']->type == 'article'
  && $view_mode == 'full'
  && !modulename_user_is_paid($context['entity'])) {
    $view_mode = 'teaser';
  }
}

4. Выводим не оплатившим пользователям форму оплаты:

/**
 * Payment form.
 */
function modulename_payment_form($form, &$form_state, $nid) {
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Оплатить',
  );
  return $form;
}
 
/**
 * Implements hook_node_view().
 */
function modulename_node_view($node, $view_mode, $langcode) {
  if ($node->type == 'article' && !modulename_user_is_paid($node)) {
    $node->content['payment_form'] = drupal_get_form('modulename_payment_form', $node->nid);
    $node->content['payment_form']['#weight'] = 100;
  }
}

5. Реализуем submit callback формы оплаты, в нём создаём транзакцию и редиректим на промежуточную страницу:

/**
 * Submit callback.
 */
function modulename_payment_form_submit($form, &$form_state) {
  $nid = $form_state['build_info']['args'][0];
  $node_wrapper = entity_metadata_wrapper('node', $nid);
 
  $payment = robokassa_api('insert', array(
    'uid' => $GLOBALS['user']->uid,
    'created' => REQUEST_TIME,
    'amount' => $node_wrapper->field_price->value(),
    'currency' => 'RUB',
    'memo' => 'Оплата материала',
    'nid' => $nid,
  ));
 
  $form_state['redirect'] = 'robokassa/payment/' . $payment['pid'];
}

6. После успешной оплаты заносим юзера в поле field_buyers:

/**
* Implements hook_robokassa().
*/
function modulename_robokassa($op, $pid, $payment = array()){
  if ($op == 'enrolled' && $payment['memo'] == 'Оплата материала') {
    $params = unserialize($payment['params']);
    $node = node_load($params['nid']);
    $node->field_buyers['und'][]['target_id'] = $payment['uid'];
    node_save($node);
  }
}

7. Даём авторизованным пользователям право делать оплату своих платежей.

Profit.

В коде для краткости нет логики работы с анонимными пользователями.

Статьи

Сделайте заказ с сайта и получите 10% скидку на услугу

Заказ услуги с сайта raybin.ru

Нажимая на кнопку "Получить консультацию", я даю согласие на обработку персональных данных и соглашаюсь c условиями политики конфиденциальности
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Заказать бесплатную SEO-консультацию

Запрос бесплатной SEO - консультации с сайта raybin.ru

Нажимая на кнопку "Получить консультацию", я даю согласие на обработку персональных данных и соглашаюсь c условиями политики конфиденциальности
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Письмо в компанию Райбин

Письмо в компанию RAYBIN

Нажимая на кнопку "Получить консультацию", я даю согласие на обработку персональных данных и соглашаюсь c условиями политики конфиденциальности
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.