Программное создание заказа в 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, так что перенаправление там было бы здорово.

Будем благодарны за любые советы, которые вы можете дать.

user13134
источник
Отлично, ваш вопрос не позволяет мне задать вопрос и очаровательно решить мою проблему :)
Юсеф
@zhilevan спасибо за комментирование, я получил эту работу, так что просто нужно напомнить себе об ответе. Я также добавлю это
user13134
Я реализую этот код в другом проекте, но когда ни пользователь root не запустит его, страница возврата не найдена !!!
Юсеф
Запрашиваемая страница "/ nashrtest / checkout / 12" не найдена.
Юсеф

Ответы:

12

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

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

Ручное решение

Для программного создания заказа в Commerce вы можете использовать следующий код (например, он работает и с Drush 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); 
kenorb
источник
2
Модуль Commerce Drush звучит как отличный инструмент.
Франциско Луз
Что касается ручной части решения, есть проблема с уведомлением по электронной почте. Способ оплаты «неизвестен». Я не уверен, почему, я уже протестировал с использованием примера способа оплаты и «неизвестен»
fkaufusi
@fkaufusi Вам придется поднять новый вопрос, чтобы проверить, что происходит.
Кенорб
Теперь я нашел решение для «неизвестного» способа оплаты по электронной почте заказа. Мне нужно добавить способ оплаты в заказ, прежде чем сохранить заказ. Это позволит системе токенов подобрать способ оплаты и использовать его в электронном письме заказа. $ 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);
Lightmed
источник
-1

1. Если пользователь не вошел на сайт, он получает сообщение об отказе в доступе.

У меня что-то работает, но я очень сомневаюсь, что это лучшая практика.

В конце концов я обманул. В моей форме, куда вы помещаете свои данные, включая адрес электронной почты, я создаю учетную запись пользователя на лету, а затем регистрирую пользователя. Если адрес электронной почты полностью готов к использованию, я регистрирую пользователя. (Я уверен, что вы не используете адрес электронной почты администратора).

Поскольку мой сайт имеет страницу формы пожертвования, когда вы переходите на эту страницу, он гарантирует, что вы вышли из системы (если вы не являетесь администратором). При успешной транзакции он выходит из системы. Я отключил историю заказов / установил перенаправления, чтобы вы могли заходить только на те страницы, о которых я знаю, когда залогинены. Личные данные не сохраняются и не видны в прошлом.

В моей ситуации я доволен тем, как это работает. Это не идеально и будет работать только в нескольких случаях.

2. Процесс проверки запрашивает имя, адрес и т. Д.

я пошел в

/ Администратор / реклама / конфигурации / выписка

И отключен

  • Информация об учетной записи
  • Биллинговая информация
user13134
источник