Програмно створення замовлення в Drupal Commerce для анонімних користувачів, які перенаправляють на сторінку оплати


19

У Райана є чудовий код, за допомогою якого можна програмно створити замовлення

<?php
global $user;
$product_id = 1;
// Create the new order in checkout; you might also check first to
// see if your user already has an order to use instead of a new one.
$order = commerce_order_new($user->uid, 'checkout_checkout');

// Save the order to get its ID.
commerce_order_save($order);

// Load whatever product represents the item the customer will be
// paying for and create a line item for it.
$product = commerce_product_load($product_id);
$line_item = commerce_product_line_item_new($product, 1, $order->order_id);

// Save the line item to get its ID.
commerce_line_item_save($line_item);

// Add the line item to the order using fago's rockin' wrapper.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$order_wrapper->commerce_line_items[] = $line_item;

// Save the order again to update its line item reference field.
commerce_order_save($order);

// Redirect to the order's checkout form. Obviously, if this were a
// form submit handler, you'd just set $form_state['redirect'].
drupal_goto('checkout/' . $order->order_id);
?>

http://www.drupalcommerce.org/questions/3259/it-possible-drupal-commerce-work-without-cart-module

У мене є сайт, де я хочу взяти анонімні пожертви, тому у мене є дві проблеми.

  1. Якщо користувач не входить на сайт, він отримує повідомлення про заборону доступу
  2. Процес оформлення замовлення запитує ім'я, адресу тощо.

Що я хочу зробити - це сторінка, на якій ви підтвердите суму, а потім перейдете на сторінку оплати. У цьому випадку я використовую PayPal WPS, тому переспрямування було б чудово.

Будь-яка порада, яку ви могли б дати, буде вдячна.


Чудово, ви запитаєте, заважайте мені задавати питання про чистку і чарівно вирішувати свою проблему :)
Yusef

@zhilevan спасибі за коментар, я отримав це, тому просто потрібно нагадати собі відповідь. Додам і це
user13134

Я реалізую цей код в іншому проекті, але коли жоден користувач root не запустить його, повернення сторінки не знайдено !!!
Юсеф

Не вдалося знайти запитувану сторінку "/ nashrtest / checkout / 12".
Юсеф

Відповіді:


12

Ви можете спробувати протестувати новий модуль під назвою Commerce Drush, який має такий синтаксис:

drush commerce-order-add 1
drush --user=admin commerce-order-add MY_SKU123

Ручне рішення

Для створення програмного замовлення в програмі Commerce ви можете використовувати наступний код (він працює і з друком, наприклад drush -vd -u "$1" scr order_code-7.php). Зверніть увагу, що commerce_payment_exampleмодуль обов'язковий.

<?php

  if (!function_exists('drush_print')) {
    function drush_print ($text) {
      print $text . "\n";
    }
  }

  $is_cli = php_sapi_name() === 'cli';

  global $user;

  // Add the product to the cart
  $product_id = 5;
  $quantity = 1;

  if ($is_cli) {
    drush_print('Creating new order for ' . $quantity . ' item(s) of product ' . $product_id . '...');
  }

  // Create the new order in checkout; you might also check first to
  // see if your user already has an order to use instead of a new one.
  $order = commerce_order_new($user->uid, 'checkout_checkout');

  // Save the order to get its ID.
  commerce_order_save($order);

  if ($is_cli) {
    drush_print('Order created. Commerce order id is now ' . $order->order_id);
    drush_print('Searching product ' . $product_id . ' in a Commerce system...');
  }

  // Load whatever product represents the item the customer will be
  // paying for and create a line item for it.
  $product = commerce_product_load((int)$product_id);

  if((empty($product->product_id)) || (!$product->status)){
    if ($is_cli) {
      drush_print('  Cannot match given product id with a Commerce product id.');
    }

    drupal_set_message(t('Invalid product id'));
    drupal_goto(); // frontpage
    return FALSE;
  }

  if ($is_cli) {
    drush_print('  Found a Commerce product ' . $product->product_id . '.');
  }

  // Create new line item based on selected product
  $line_item = commerce_product_line_item_new($product, 1, $order->order_id);

  if ($is_cli) {
    drush_print('  Added product to the cart.');
  }

  // Save the line item to get its ID.
  commerce_line_item_save($line_item);

  // Add the line item to the order using fago's rockin' wrapper.
  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  $order_wrapper->commerce_line_items[] = $line_item;

  if ($is_cli) {
    drush_print('Saving order...');
  }

  // Save the order again to update its line item reference field.
  commerce_order_save($order);

  // Redirect to the order's checkout form. Obviously, if this were a
  // form submit handler, you'd just set $form_state['redirect'].

  if ($is_cli) {
    drush_print('Checking out the order...');
  }

  commerce_checkout_complete($order);

  if ($is_cli) {
    drush_print('Marking order as fully paid...');
  }

  $payment_method = commerce_payment_method_instance_load('commerce_payment_example|commerce_payment_commerce_payment_example');

  if (!$payment_method) {
    if ($is_cli) {
      drush_print("  No example payment method found, we can't mark order as fully paid. Please enable commerce_payment_example module to use this feature.");
    }
  }
  else {
    if ($is_cli) {
      drush_print("  Creating example transaction...");
    }

    // Creating new transaction via commerce_payment_example module.
    $charge      = $order->commerce_order_total['und'][0];

    $transaction = commerce_payment_transaction_new('commerce_payment_example', $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 = 'Name: @name';
    $transaction->message_variables = array('@name' => 'Example payment');

    if ($is_cli) {
      drush_print("  Notifying Commerce about new transaction...");
    }

    commerce_payment_transaction_save($transaction);

    commerce_payment_commerce_payment_transaction_insert($transaction);
  }

  if ($is_cli) {
    drush_print("Marking order as completed...");
  }

  commerce_order_status_update($order, 'completed');

  if ($is_cli) {
    drush_print("\nDone.");
  }

Примітка: Як запропоновано в коментарі, якщо ви зберегли помилку щодо способу оплати, невідомо під час збереження замовлення, переконайтеся, що ви вказали його, наприклад

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 

2
Модуль Commerce Drush звучить як дивовижний інструмент.
Франциско Луз

Що стосується частини ручного рішення, то існує проблема із сповіщенням електронної пошти про замовлення. Спосіб оплати "невідомий" Я не впевнений, чому я вже перевірив, використовуючи
прикладний

@fkaufusi Вам потрібно буде поставити нове запитання, щоб перевірити, що відбувається.
kenorb

Зараз я знайшов рішення для "невідомого" способу оплати на електронному листі замовлення. Мені потрібно додати спосіб оплати до замовлення, перш ніж зберегти замовлення. Це дозволить токеновій системі вибрати спосіб оплати та використовувати електронний лист із замовленням. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ замовлення);
fkaufusi

5

Цей модифікований сценарій працює також для анонімних користувачів:

<?php
global $user;

$product_id = 2;
// Create the new order in checkout; you might also check first to
// see if your user already has an order to use instead of a new one.
$order = commerce_order_new($user->uid, 'checkout_checkout');
// Save the order to get its ID.
commerce_order_save($order);

// Link anonymous user session to the cart
if (!$user->uid) {
    commerce_cart_order_session_save($order->order_id);
}

// Load whatever product represents the item the customer will be
// paying for and create a line item for it.
$product = commerce_product_load($product_id);
$line_item = commerce_product_line_item_new($product, 1, $order->order_id);

// Save the line item to get its ID.
commerce_line_item_save($line_item);

// Add the line item to the order using fago's rockin' wrapper.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$order_wrapper->commerce_line_items[] = $line_item;

// Save the order again to update its line item reference field.
commerce_order_save($order);

// Redirect to the order's checkout form. Obviously, if this were a
// form submit handler, you'd just set $form_state['redirect'].
drupal_goto('checkout/' . $order->order_id);


-1

1. Якщо користувач не входить на сайт, він отримує повідомлення про заборону доступу

У мене щось працює, але я дуже сумніваюся, що це найкраща практика.

Врешті-решт я обдурила. У моїй формі, де ви вводите свої дані, включаючи адресу електронної пошти, я створюю обліковий запис користувача на льоту, а потім входжу в систему користувача. Якщо електронна адреса готова до використання, я входжу в систему користувача (я переконуюсь, що ви не використовуєте електронна адреса адміністратора).

Оскільки на моєму веб-сайті є сторінка форми пожертвування, коли ви потрапляєте на цю сторінку, вона гарантує, що ви вийшли (якщо ви не адміністратор). Після успішної транзакції він виходить із системи. Я вимкнув історію замовлень / поставив переадресації, щоб ви могли переходити лише на ті сторінки, про які я знаю, коли увійшли в систему. Жодні особисті дані не зберігаються і не можна побачити минулі пожертви

У своїй ситуації я задоволений тим, як це працює. Це не ідеально і буде працювати лише в кількох випадках.

2. Процес оформлення замовлення запитує ім'я, адресу тощо.

я пішов до

/ admin / commerce / config / checkout

І інваліди

  • Інформація про обліковий запис
  • Платіжна інформація
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.