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;
}
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
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);
}