Оплата доступа к ноде с помощью Робокассы
Пример организации платного доступа к конкретной ноде с помощью модуля 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.
В коде для краткости нет логики работы с анонимными пользователями.