SlideShare une entreprise Scribd logo
1  sur  17
Разработка платежных
модулей для Drupal Commerce
  и сравнение с Ubercart 3.x
Виды оплат
1. С уходом на сторонний сервис
 - webmoney
 - paypal


2. Не покидая сайта продавца
 - внутренняя валюта (points)
 - наличные в офисе
 - чеки и т.д.
Хуки регистрации платежных методов
                       UBERCART
hook_payment_method(){
$methods[] = array(
  'id' => 'check', //машинное имя метода
  'name' => t('Check'), // общедоступное название
  'title' => t('Check or Money Order'), // тайтл собственно
  'desc' => t('Pay by mailing a check or money order.'),
  'callback' => 'uc_payment_method_check', // ф-ция
  'weight' => 1, // вес
  'checkout' => TRUE, //отображать или нет в процессе
);
return $methods;
Хуки регистрации платежных методов
               Drupal Commerce

hook_commerce_payment_method_info(){
return array(
'mypaymentmethod' => array( // машинное имя способа оплаты.
  'title' => t('My Payment Method'), // Название способа оплаты для админки.
  'display_title' => t('My Payment Method'), // для отображения в форме чекаута.
  'description' => t('Example of Payment Method'), // Описание способа оплаты.
  'active' => TRUE, // Состояние способа оплаты: по умолчанию TRUE
  'terminal' => TRUE, // может ли администратор самостоятельно добавить этот
                       способ оплаты для завершённого заказа. По умолчанию TRUE.
  'offsite' => FALSE, // Нужно ли покупателю покидать пределы сайта при оплате
                      заказа этим способом.
  'offsite_autoredirect' => FALSE, // Автоматический редирект на сторонний сайт
                      при оплате заказа этим способом
  ),
);
}
Настройки платежных методов
                          UBERCART

'callback' => 'uc_payment_method_check'

function uc_payment_method_check($op, &$order, &$form, &$form_state){
  switch ($op) {
    case 'cart-details': // настройки для выбора (например select)
    case 'cart-process': // обработка данных для метода
    case 'settings': // настройки для платежного метода return $form;
    case 'order-view': // отображение на ордере
  }
}
Настройки платежных методов
                        Drupal Commerce

hook_settings_form();

function mypaymentmethod_settings_form($settings){
 $form = array();

    // набор значений необходимых для формирования данных

    return $form;
}
Обработка данных при выборе метода
function mypaymentsmethod_submit_form($payment_method, $pane_values,
$checkout_pane, $order) {
  $form = array();
  if(!empty($order->data['mypaymentsmethod'])) {
    $pane_values += $order->data['mypaymentsmethod'];
  }
  $pane_values += array(
    'user_purse' => '',
  );

    $form['user_purse'] = array(
      '#type' => 'textfield',
      '#title' => t('Purse'),
      '#description' => t('Enter your purse'),
      '#default_value' => $pane_values['user_purse'],
      '#required' => TRUE,
    );
    return $form;
}
Обработка данных при выборе метода
                      UBERCART

'callback' => 'uc_payment_method_check'

function uc_payment_method_check($op, &$order, &$form, &$form_state){
 switch ($op) {

        case 'cart-details': // настройки для выбора (например select)

    }
}
Обработка данных при выборе метода
                         Drupal Commerce

hook_submit_form_validate();

function mypaymentmethod_submit_form_validate($payment_method,
$pane_form, $pane_values, $order, $form_parents = array()){

    // набор действий необходимых для проверки введенных данных

    return FALSE;
}
Обработка данных при выборе метода
                      UBERCART

'callback' => 'uc_payment_method_check'

function uc_payment_method_check($op, &$order, &$form, &$form_state){
 switch ($op) {

        case 'cart-process': // обработка данных для метода

    }
}
Если не нужно на сайт платёжной системы
             UBERCART :( :( :(
function uc_rbkmoney_form_alter(&$form, &$form_state, $form_id) {
  $order_id = isset($_SESSION['cart_order']) ?
     intval($_SESSION['cart_order']) : 0;
  if ($form_id == 'uc_cart_checkout_review_form' && $order_id > 0) {
    $order = uc_order_load($order_id);
    if ($order->payment_method == 'rbkmoney') {
      unset($form['actions']['submit']);
      $form['#prefix'] = '<table><tr><td>';
      $form['#suffix'] = '</td><td>' .
     drupal_render(drupal_get_form('uc_rbkmoney_submit_form', $order)) .
     '</td></tr></table>';
    }
  }
}
Если не нужно на сайт платёжной системы
                Drupal Commerce
function mypaymentmethod_submit_form_submit($payment_method,
   $pane_form, $pane_values, $order, $charge) {

    $order->data['mypaymentmethod'] = $pane_values;
    // Создаём транзакцию
    $transaction = commerce_payment_transaction_new('mypaymentmethod',
       $order->order_id);
    $transaction->instance_id = $payment_method['instance_id'];
    $transaction->amount = $charge['amount'];
    $transaction->currency_code = $charge['currency_code'];
    $transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS;
    $transaction->message = t('The payment has completed.');
    commerce_payment_transaction_save($transaction);
}
Если нужно на сайт платёжной системы
             UBERCART :( :( :(
function mypaymentmethod_form_alter(&$form, &$form_state, $form_id) {
  drupal_render(drupal_get_form());
}

Redirect → на сайт платежной системы

hook_menu() {
  //регистрируем url на который придет ответ от мерчанта
}

- возврат к оплате если FALSE
- завершение оплаты если TRUE
Если нужно на сайт платёжной системы
              Drupal Commerce
function mypaymentmethod_redirect_form($form, &$form_state, $order,
     $payment_method) {
  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  $form['#action'] = 'https://example.com/payment'; // Адрес шлюза
    $form['amount'] = array(
    '#type' => 'hidden',
    '#value' => $order_wrapper->commerce_order_total->amount->value(),
  );
   $form['redirect_uri'] = array( '#type' => 'hidden', '#value' => url(''));
   $form['error_uri'] = array('#type' => 'hidden', '#value' => url(''));
   $form['submit'] = array('#type' => 'submit', '#value' => t('Pay'));
   return $form;
}
Если нужно на сайт платёжной системы
             Drupal Commerce
Вернулись на страницу checkout/[order_id]/payment/return/[key]

function mypaymentmethod_redirect_form_validate($order,
     $payment_method) {
  if (/* ... */) {
    return TRUE; // будет вызван callback
     PAYMENTNAME_redirect_form_submit()
  }
  else {
    return FALSE; // покупатель возвратится на шаг назад в форме чекаута
  }
}
Если нужно на сайт платёжной системы
             Drupal Commerce
function mypaymentmethod_redirect_form_submit($order, $payment_method)
     {
  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  // Создаём транзакцию
  $transaction = commerce_payment_transaction_new('mypaymentmethod',
     $order->order_id);
  $transaction->instance_id = $payment_method['instance_id'];
  $transaction->amount = $order_wrapper->commerce_order_total->amount-
     >value();
  $transaction->currency_code = $order_wrapper->commerce_order_total-
     >currency_code->value();
  $transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS;
  $transaction->message = t('The payment has completed.');
  commerce_payment_transaction_save($transaction);
}
Спасибо за внимание
Контакты:
+38 066 048-84-85
+38 093 146-92-72
Skype: yuriglu
E-mail: yury.glushkov@ardas.dp.ua
ardas.dp.ua

Contenu connexe

Similaire à Create payment systems for Drupal Commerce

Новая eCommerce платформа D7: заказы, холдинг, персональный раздел
Новая eCommerce платформа D7:  заказы, холдинг, персональный разделНовая eCommerce платформа D7:  заказы, холдинг, персональный раздел
Новая eCommerce платформа D7: заказы, холдинг, персональный раздел1С-Битрикс
 
DevHub 3 - Pricing
DevHub 3 - PricingDevHub 3 - Pricing
DevHub 3 - PricingMagento Dev
 
Forms 2 - Drupal 6 - Полный контроль над формами
Forms 2 - Drupal 6 - Полный контроль над формамиForms 2 - Drupal 6 - Полный контроль над формами
Forms 2 - Drupal 6 - Полный контроль над формамиAndrii Podanenko
 
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
Новая eCommerce платформа D7:  скидки, управление заказами, автоматизацияНовая eCommerce платформа D7:  скидки, управление заказами, автоматизация
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация1С-Битрикс
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in MagentoVrann Tulika
 
Ubercart -nemnogo_primerov_iz_zhizni
Ubercart  -nemnogo_primerov_iz_zhizniUbercart  -nemnogo_primerov_iz_zhizni
Ubercart -nemnogo_primerov_iz_zhiznidrupalconf
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в MagentoMagecom Ukraine
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
In-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятIn-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятPavel Bashmakov
 

Similaire à Create payment systems for Drupal Commerce (11)

Новая eCommerce платформа D7: заказы, холдинг, персональный раздел
Новая eCommerce платформа D7:  заказы, холдинг, персональный разделНовая eCommerce платформа D7:  заказы, холдинг, персональный раздел
Новая eCommerce платформа D7: заказы, холдинг, персональный раздел
 
DevHub 3 - Pricing
DevHub 3 - PricingDevHub 3 - Pricing
DevHub 3 - Pricing
 
Forms 2 - Drupal 6 - Полный контроль над формами
Forms 2 - Drupal 6 - Полный контроль над формамиForms 2 - Drupal 6 - Полный контроль над формами
Forms 2 - Drupal 6 - Полный контроль над формами
 
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
Новая eCommerce платформа D7:  скидки, управление заказами, автоматизацияНовая eCommerce платформа D7:  скидки, управление заказами, автоматизация
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in Magento
 
Ubercart -nemnogo_primerov_iz_zhizni
Ubercart  -nemnogo_primerov_iz_zhizniUbercart  -nemnogo_primerov_iz_zhizni
Ubercart -nemnogo_primerov_iz_zhizni
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
I Net
I NetI Net
I Net
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
In-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятIn-App-Purchases и с чем их едят
In-App-Purchases и с чем их едят
 

Create payment systems for Drupal Commerce

  • 1. Разработка платежных модулей для Drupal Commerce и сравнение с Ubercart 3.x
  • 2. Виды оплат 1. С уходом на сторонний сервис - webmoney - paypal 2. Не покидая сайта продавца - внутренняя валюта (points) - наличные в офисе - чеки и т.д.
  • 3. Хуки регистрации платежных методов UBERCART hook_payment_method(){ $methods[] = array( 'id' => 'check', //машинное имя метода 'name' => t('Check'), // общедоступное название 'title' => t('Check or Money Order'), // тайтл собственно 'desc' => t('Pay by mailing a check or money order.'), 'callback' => 'uc_payment_method_check', // ф-ция 'weight' => 1, // вес 'checkout' => TRUE, //отображать или нет в процессе ); return $methods;
  • 4. Хуки регистрации платежных методов Drupal Commerce hook_commerce_payment_method_info(){ return array( 'mypaymentmethod' => array( // машинное имя способа оплаты. 'title' => t('My Payment Method'), // Название способа оплаты для админки. 'display_title' => t('My Payment Method'), // для отображения в форме чекаута. 'description' => t('Example of Payment Method'), // Описание способа оплаты. 'active' => TRUE, // Состояние способа оплаты: по умолчанию TRUE 'terminal' => TRUE, // может ли администратор самостоятельно добавить этот способ оплаты для завершённого заказа. По умолчанию TRUE. 'offsite' => FALSE, // Нужно ли покупателю покидать пределы сайта при оплате заказа этим способом. 'offsite_autoredirect' => FALSE, // Автоматический редирект на сторонний сайт при оплате заказа этим способом ), ); }
  • 5. Настройки платежных методов UBERCART 'callback' => 'uc_payment_method_check' function uc_payment_method_check($op, &$order, &$form, &$form_state){ switch ($op) { case 'cart-details': // настройки для выбора (например select) case 'cart-process': // обработка данных для метода case 'settings': // настройки для платежного метода return $form; case 'order-view': // отображение на ордере } }
  • 6. Настройки платежных методов Drupal Commerce hook_settings_form(); function mypaymentmethod_settings_form($settings){ $form = array(); // набор значений необходимых для формирования данных return $form; }
  • 7. Обработка данных при выборе метода function mypaymentsmethod_submit_form($payment_method, $pane_values, $checkout_pane, $order) { $form = array(); if(!empty($order->data['mypaymentsmethod'])) { $pane_values += $order->data['mypaymentsmethod']; } $pane_values += array( 'user_purse' => '', ); $form['user_purse'] = array( '#type' => 'textfield', '#title' => t('Purse'), '#description' => t('Enter your purse'), '#default_value' => $pane_values['user_purse'], '#required' => TRUE, ); return $form; }
  • 8. Обработка данных при выборе метода UBERCART 'callback' => 'uc_payment_method_check' function uc_payment_method_check($op, &$order, &$form, &$form_state){ switch ($op) { case 'cart-details': // настройки для выбора (например select) } }
  • 9. Обработка данных при выборе метода Drupal Commerce hook_submit_form_validate(); function mypaymentmethod_submit_form_validate($payment_method, $pane_form, $pane_values, $order, $form_parents = array()){ // набор действий необходимых для проверки введенных данных return FALSE; }
  • 10. Обработка данных при выборе метода UBERCART 'callback' => 'uc_payment_method_check' function uc_payment_method_check($op, &$order, &$form, &$form_state){ switch ($op) { case 'cart-process': // обработка данных для метода } }
  • 11. Если не нужно на сайт платёжной системы UBERCART :( :( :( function uc_rbkmoney_form_alter(&$form, &$form_state, $form_id) { $order_id = isset($_SESSION['cart_order']) ? intval($_SESSION['cart_order']) : 0; if ($form_id == 'uc_cart_checkout_review_form' && $order_id > 0) { $order = uc_order_load($order_id); if ($order->payment_method == 'rbkmoney') { unset($form['actions']['submit']); $form['#prefix'] = '<table><tr><td>'; $form['#suffix'] = '</td><td>' . drupal_render(drupal_get_form('uc_rbkmoney_submit_form', $order)) . '</td></tr></table>'; } } }
  • 12. Если не нужно на сайт платёжной системы Drupal Commerce function mypaymentmethod_submit_form_submit($payment_method, $pane_form, $pane_values, $order, $charge) { $order->data['mypaymentmethod'] = $pane_values; // Создаём транзакцию $transaction = commerce_payment_transaction_new('mypaymentmethod', $order->order_id); $transaction->instance_id = $payment_method['instance_id']; $transaction->amount = $charge['amount']; $transaction->currency_code = $charge['currency_code']; $transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS; $transaction->message = t('The payment has completed.'); commerce_payment_transaction_save($transaction); }
  • 13. Если нужно на сайт платёжной системы UBERCART :( :( :( function mypaymentmethod_form_alter(&$form, &$form_state, $form_id) { drupal_render(drupal_get_form()); } Redirect → на сайт платежной системы hook_menu() { //регистрируем url на который придет ответ от мерчанта } - возврат к оплате если FALSE - завершение оплаты если TRUE
  • 14. Если нужно на сайт платёжной системы Drupal Commerce function mypaymentmethod_redirect_form($form, &$form_state, $order, $payment_method) { $order_wrapper = entity_metadata_wrapper('commerce_order', $order); $form['#action'] = 'https://example.com/payment'; // Адрес шлюза $form['amount'] = array( '#type' => 'hidden', '#value' => $order_wrapper->commerce_order_total->amount->value(), ); $form['redirect_uri'] = array( '#type' => 'hidden', '#value' => url('')); $form['error_uri'] = array('#type' => 'hidden', '#value' => url('')); $form['submit'] = array('#type' => 'submit', '#value' => t('Pay')); return $form; }
  • 15. Если нужно на сайт платёжной системы Drupal Commerce Вернулись на страницу checkout/[order_id]/payment/return/[key] function mypaymentmethod_redirect_form_validate($order, $payment_method) { if (/* ... */) { return TRUE; // будет вызван callback PAYMENTNAME_redirect_form_submit() } else { return FALSE; // покупатель возвратится на шаг назад в форме чекаута } }
  • 16. Если нужно на сайт платёжной системы Drupal Commerce function mypaymentmethod_redirect_form_submit($order, $payment_method) { $order_wrapper = entity_metadata_wrapper('commerce_order', $order); // Создаём транзакцию $transaction = commerce_payment_transaction_new('mypaymentmethod', $order->order_id); $transaction->instance_id = $payment_method['instance_id']; $transaction->amount = $order_wrapper->commerce_order_total->amount- >value(); $transaction->currency_code = $order_wrapper->commerce_order_total- >currency_code->value(); $transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS; $transaction->message = t('The payment has completed.'); commerce_payment_transaction_save($transaction); }
  • 17. Спасибо за внимание Контакты: +38 066 048-84-85 +38 093 146-92-72 Skype: yuriglu E-mail: yury.glushkov@ardas.dp.ua ardas.dp.ua