Programowe tworzenie zamówienia w Drupal Commerce dla anonimowych użytkowników przekierowujących na stronę płatności

19

Ryan ma świetny kod, który możesz programowo utworzyć zamówienie

<?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

Mam witrynę, na której chcę pobierać anonimowe datki, więc mam dwa problemy.

  1. Jeśli użytkownik nie jest zalogowany na stronie, otrzyma komunikat odmowy dostępu
  2. Proces realizacji zamówienia wymaga podania nazwy, adresu itp.

Chcę mieć stronę, na której potwierdzisz kwotę, a następnie przejdziesz na stronę płatności. W tym przypadku korzystam z PayPal WPS, więc przekierowanie byłoby świetne.

Wszelkie porady, które możesz udzielić, będą mile widziane.

użytkownik13134
źródło
Świetnie, pytasz, nie pozwól mi zadać pytania i uroczo rozwiązać mój problem :)
Yusef,
@zhilevan dzięki za komentowanie Mam to działa, więc muszę przypomnieć sobie odpowiedź. Dodam to również
user13134,
Wdrażam ten kod w innym projekcie, ale kiedy nie uruchomi go ani użytkownik root, nie znaleziono strony zwrotnej !!!
Yusef
Nie można znaleźć żądanej strony „/ nashrtest / checkout / 12”.
Yusef

Odpowiedzi:

12

Możesz spróbować przetestować nowy moduł o nazwie Commerce Drush, który ma następującą składnię:

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

Rozwiązanie ręczne

Aby programowo utworzyć zamówienie w Commerce, możesz użyć następującego kodu (działa również z drush, np drush -vd -u "$1" scr order_code-7.php.). Należy pamiętać, że commerce_payment_examplemoduł jest wymagany.

<?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.");
  }

Uwaga: Zgodnie z sugestią w komentarzu, jeśli masz błąd o metodzie płatności jest nieznany podczas zapisywania zamówienia, upewnij się, że określono je, na przykład

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 
kenorb
źródło
2
Moduł Commerce Drush brzmi jak niesamowite narzędzie.
Francisco Luz
W przypadku części dotyczącej ręcznego rozwiązania występuje problem z powiadomieniem e-mail dotyczącym zamówienia. Metoda płatności jest „nieznana” Nie jestem pewien, dlaczego, już przetestowałem przy użyciu przykładowej metody płatności i jest „nieznany”
fkaufusi
@fkaufusi Musisz zadać nowe pytanie, aby sprawdzić, co się dzieje.
kenorb
Teraz znalazłem rozwiązanie dla „nieznanej” metody płatności w wiadomości e-mail z zamówieniem. Przed zapisaniem zamówienia muszę dodać metodę płatności do zamówienia. Umożliwi to systemowi tokenów pobranie metody płatności i użycie jej w wiadomości e-mail z zamówieniem. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ order);
fkaufusi
5

Ten zmodyfikowany skrypt działa również dla anonimowych użytkowników:

<?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
źródło
-1

1. Jeśli użytkownik nie jest zalogowany na stronie, otrzyma komunikat odmowy dostępu

Mam coś działającego, ale bardzo wątpię, żeby to była najlepsza praktyka.

W końcu oszukałem. W moim formularzu, w którym podajesz swoje dane, w tym adres e-mail, tworzę konto użytkownika w locie, a następnie loguję się. Jeśli adres e-mail jest gotowy do użycia, loguję użytkownika. (Upewnij się, że nie używasz adres e-mail administratora).

Ponieważ moja witryna ma tylko stronę formularza darowizny, gdy trafisz na tę stronę, musisz się wylogować (jeśli nie jesteś administratorem). Po udanej transakcji wylogowuje Cię. Wyłączyłem historię zamówień / umieściłem przekierowania w miejscu, abyś mógł wchodzić tylko na strony, o których wiem, kiedy jestem zalogowany. Żadne dane osobowe nie są przechowywane i nie widzę dawnych datków

W mojej sytuacji jestem zadowolony z tego, jak to działa. To nie jest idealne i będzie działać tylko w kilku przypadkach.

2. W procesie kasowym wymagane jest podanie imienia i nazwiska, adresu itp.

Poszłam do

/ admin / commerce / config / checkout

I wyłączone

  • Informacje o koncie
  • Informacje rozliczeniowe
użytkownik13134
źródło