Creazione programmatica di un ordine in Drupal Commerce per utenti anonimi che reindirizzano alla pagina di pagamento


19

Ryan ha degli ottimi codici che puoi creare a livello di codice un ordine

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

Ho un sito dove voglio fare donazioni anonime, quindi ho due problemi.

  1. Se un utente non ha effettuato l'accesso al sito, riceve un messaggio di accesso negato
  2. La procedura di pagamento richiede nome, indirizzo ecc.

Quello che voglio fare è avere una pagina in cui confermi l'importo, quindi vieni indirizzato alla pagina di pagamento. In questo caso sto usando PayPal WPS, quindi il reindirizzamento sarebbe fantastico.

Ogni consiglio che potresti dare sarebbe apprezzato.


Ottimo, la tua domanda mi impedisce di chiedere qustion e risolvere il mio problema in modo affascinante :)
Yusef,

@zhilevan grazie per aver commentato. Ho funzionato, quindi devo solo ricordarmi la risposta. Lo aggiungerò
anch'io

Implemento questo codice in un altro progetto, ma quando né l'utente root lo esegue, la pagina di ritorno non viene trovata !!!
Yusef

La pagina richiesta "/ nashrtest / checkout / 12" non è stata trovata.
Yusef

Risposte:


12

Puoi provare a testare un nuovo modulo chiamato Commerce Drush che ha la sintassi seguente:

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

Soluzione manuale

Per creare un ordine in modo programmatico in Commerce, puoi usare il seguente codice (funziona anche con drush, ad es drush -vd -u "$1" scr order_code-7.php.). Si noti che commerce_payment_exampleè richiesto il modulo.

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

Nota: come suggerito nel commento, se hai riscontrato un errore sul metodo di pagamento sconosciuto durante il salvataggio dell'ordine, assicurati di averlo specificato, ad es.

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

2
Il modulo Commerce Drush sembra uno strumento fantastico.
Francisco Luz,

Per quanto riguarda la parte della soluzione manuale, c'è un problema con la notifica via email dell'ordine. Il metodo di pagamento è "sconosciuto" Non sono sicuro del perché, ho già testato utilizzando il metodo di pagamento di esempio ed è "sconosciuto"
fkaufusi,

@fkaufusi Dovrai quindi porre la nuova domanda per verificare cosa sta succedendo.
Kenorb,

Ora ho trovato una soluzione per il metodo di pagamento "sconosciuto" nell'e-mail dell'ordine. Devo aggiungere il metodo di pagamento all'ordine prima di salvare l'ordine. Ciò consentirà al sistema di token di ritirare il metodo di pagamento e utilizzarlo nell'e-mail dell'ordine. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ ordine);
fkaufusi,

5

Questo script modificato funziona anche per gli utenti anonimi:

<?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. Se un utente non ha effettuato l'accesso al sito, riceve un messaggio di accesso negato

Ho qualcosa che funziona ma dubito fortemente che sia la migliore pratica.

Alla fine ho tradito. Nel mio modulo in cui inserisci i tuoi dati, incluso l'indirizzo e-mail, creo un account utente al volo e quindi accedo l'utente. Se un indirizzo e-mail è pronto per l'uso, accedo l'utente. (Mi assicuro che non stai utilizzando indirizzo email amministratore).

Poiché il mio sito ha solo la pagina del modulo di donazione quando si accede a quella pagina, si assicura che si sia disconnessi (se non si è amministratori). Su una transazione di successo ti disconnette. Ho disattivato la cronologia degli ordini / ho attivato i reindirizzamenti in modo da poter accedere alle pagine che conosco solo quando ho effettuato l'accesso. Nessun dato personale è memorizzato e non è possibile visualizzare le donazioni passate

Nella mia situazione sono contento di come funziona. Non è l'ideale e funzionerà solo in alcuni casi.

2. La procedura di pagamento richiede nome, indirizzo, ecc.

sono andato a

/ Admin / commercio / config / checkout

E disabilitato

  • Informazioni account
  • Informazioni di fatturazione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.