Programmgesteuertes Erstellen einer Bestellung in Drupal Commerce für anonyme Benutzer, die zur Zahlungsseite umleiten

19

Ryan hat einen großartigen Code, mit dem Sie programmgesteuert eine Bestellung erstellen können

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

Ich habe eine Website, auf der ich anonyme Spenden entgegennehmen möchte, daher habe ich zwei Probleme.

  1. Wenn ein Benutzer nicht auf der Site angemeldet ist, erhält er eine Meldung, dass der Zugriff verweigert wurde
  2. Beim Checkout werden Name, Adresse usw. abgefragt.

Ich möchte eine Seite haben, auf der Sie den Betrag bestätigen und dann zur Zahlungsseite weitergeleitet werden. In diesem Fall verwende ich PayPal WPS. Eine Umleitung wäre also großartig.

Jeder mögliche Rat, den Sie geben könnten, würde geschätzt.

user13134
quelle
Großartig, deine Frage hindert mich daran, eine Frage zu stellen und mein Problem auf charmante Weise zu lösen :)
Yusef
@ zhilevan danke für den Kommentar, ich habe das zum Laufen gebracht, muss mich also nur an die Antwort erinnern. Ich werde das auch hinzufügen
user13134
Ich implementiere diesen Code in einem anderen Projekt, aber wenn kein Root-Benutzer ihn ausführt, wird die Rückgabeseite nicht gefunden !!!
Yusef
Die angeforderte Seite "/ nashrtest / checkout / 12" wurde nicht gefunden.
Yusef

Antworten:

12

Sie können versuchen, ein neues Modul namens Commerce Drush mit der folgenden Syntax zu testen :

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

Manuelle Lösung

Zum programmgesteuerten Erstellen eines Auftrags in Commerce können Sie den folgenden Code verwenden (funktioniert auch mit drush, z drush -vd -u "$1" scr order_code-7.php. B. ). Bitte beachten Sie, dass das commerce_payment_exampleModul erforderlich ist.

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

Hinweis: Wenn Sie, wie im Kommentar vorgeschlagen, beim Speichern der Bestellung einen Fehler bezüglich der Zahlungsmethode nicht kennen , geben Sie diesen an, z

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 
Kenorb
quelle
2
Das Commerce Drush-Modul klingt nach einem großartigen Tool.
Francisco Luz
In Bezug auf den manuellen Lösungsteil gibt es ein Problem mit der Bestell-E-Mail-Benachrichtigung. Die Zahlungsmethode ist „unbekannt“ Ich bin nicht sicher , warum ich schon getestet , indem das Beispiel Zahlungsmethode und ist „unbekannt“
fkaufusi
@fkaufusi Du musst die neue Frage dann stellen, um zu überprüfen, was los ist.
Kenorb
Ich habe jetzt eine Lösung für die "unbekannte" Zahlungsmethode in der Bestell-E-Mail gefunden. Ich muss der Bestellung die Zahlungsmethode hinzufügen, bevor ich die Bestellung speichern kann. Auf diese Weise kann das Tokensystem die Zahlungsmethode auswählen und in der Bestell-E-Mail verwenden. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ order);
Fkaufusi
5

Dieses geänderte Skript funktioniert auch für anonyme Benutzer:

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

1. Wenn ein Benutzer nicht auf der Site angemeldet ist, erhält er eine Meldung, dass der Zugriff verweigert wurde

Ich habe etwas zum Laufen gebracht, bezweifle jedoch, dass es sich um eine bewährte Methode handelt.

Am Ende habe ich geschummelt. Auf meinem Formular, auf dem Sie Ihre Daten einschließlich der E - Mail - Adresse eintragen, erstelle ich im Handumdrehen ein Benutzerkonto und logge den Benutzer ein. Wenn eine E - Mail - Adresse vollständig verwendet wird, logge ich den Benutzer ein E-Mail-Adresse des Administrators).

Da meine Website nur die Spendenformularseite enthält, wenn Sie auf diese Seite klicken, wird sichergestellt, dass Sie abgemeldet sind (wenn Sie kein Administrator sind). Bei einer erfolgreichen Transaktion werden Sie abgemeldet. Ich habe den Bestellverlauf deaktiviert / Weiterleitungen eingerichtet, sodass Sie nur die Seiten aufrufen können, die mir bekannt sind, wenn Sie angemeldet sind. Es werden keine persönlichen Daten gespeichert, und vergangene Spenden werden nicht angezeigt

In meiner Situation bin ich zufrieden damit, wie das funktioniert. Es ist nicht ideal und funktioniert nur in wenigen Fällen.

2. Beim Auschecken werden Name, Adresse usw. abgefragt.

ich ging zu

/ admin / commerce / config / checkout

Und behinderte

  • Kontoinformationen
  • Abrechnungsdaten
user13134
quelle