Création par programme d'une commande dans Drupal Commerce pour les utilisateurs anonymes redirigeant vers la page de paiement

19

Ryan a un excellent code que vous pouvez créer par programmation une commande

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

J'ai un site où je veux faire des dons anonymes donc j'ai deux problèmes.

  1. Si un utilisateur n'est pas connecté au site, il reçoit un message d'accès refusé
  2. Le processus de commande demande le nom, l'adresse, etc.

Ce que je veux faire, c'est avoir une page où vous confirmez le montant, puis vous serez redirigé vers la page de paiement. Dans ce cas, j'utilise PayPal WPS, donc la redirection serait formidable.

Tout conseil que vous pourriez donner serait apprécié.

user13134
la source
Génial, vous vous interrogez m'empêche de poser la question et de résoudre mon problème avec charme :)
Yusef
@zhilevan merci d'avoir commenté j'ai réussi à le faire fonctionner, il suffit donc de me rappeler la réponse. J'ajouterai cela aussi
user13134
J'implémente ce code dans un autre projet, mais quand aucun utilisateur root ne l'exécute, la page de retour est introuvable !!!
Yusef
La page demandée "/ nashrtest / checkout / 12" est introuvable.
Yusef

Réponses:

12

Vous pouvez essayer de tester un nouveau module appelé Commerce Drush qui a la syntaxe suivante:

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

Solution manuelle

Pour créer une commande par programme dans Commerce, vous pouvez utiliser le code suivant (il fonctionne également avec drush, par exemple drush -vd -u "$1" scr order_code-7.php). Veuillez noter que le commerce_payment_examplemodule est requis.

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

Remarque: Comme suggéré dans le commentaire, si vous avez une erreur sur le mode de paiement est inconnue lors de l'enregistrement de la commande, assurez-vous que vous l'avez spécifié, par exemple

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 
kenorb
la source
2
Le module Commerce Drush ressemble à un outil génial.
Francisco Luz
En ce qui concerne la partie solution manuelle, il y a un problème avec la notification par e-mail de commande. La méthode de paiement est "inconnue", je ne sais pas pourquoi, j'ai déjà testé en utilisant l'exemple de méthode de paiement et elle est "inconnue"
fkaufusi
@fkaufusi Vous devrez soulever la nouvelle question puis vérifier ce qui se passe.
kenorb
J'ai maintenant trouvé une solution pour le mode de paiement "inconnu" sur l'e-mail de commande. Je dois ajouter le mode de paiement à la commande avant de sauvegarder la commande. Cela permettra au système de jetons de récupérer le mode de paiement et de l'utiliser sur l'e-mail de commande. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ order);
fkaufusi
5

Ce script modifié fonctionne également pour les utilisateurs anonymes:

<?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
la source
-1

1. Si un utilisateur n'est pas connecté au site, il reçoit un message d'accès refusé

J'ai obtenu que quelque chose fonctionne, mais je doute fortement que ce soit la meilleure pratique.

Finalement, j'ai triché. Sur mon formulaire où vous mettez vos coordonnées, y compris l'adresse e-mail, je crée un compte utilisateur à la volée, puis je connecte l'utilisateur. Si une adresse e-mail est prête à l'emploi, je connecte l'utilisateur. (Je m'assure que vous n'utilisez pas le adresse e-mail de l'administrateur).

Comme mon site n'a que la page du formulaire de don lorsque vous cliquez sur cette page, il vous assure que vous êtes déconnecté (si vous n'êtes pas administrateur). Lors d'une transaction réussie, il vous déconnecte. J'ai désactivé l'historique des commandes / mis en place des redirections afin que vous ne puissiez accéder qu'aux pages que je connais lorsque vous êtes connecté. Aucune donnée personnelle n'est stockée et je ne peux pas voir les dons passés

Dans ma situation, je suis satisfait de la façon dont cela fonctionne. Ce n'est pas idéal et ne fonctionnera que dans quelques cas.

2. Le processus de commande demande le nom, l'adresse, etc.

je suis allé à

/ admin / commerce / config / checkout

Et désactivé

  • Information sur le compte
  • Détails de facturation
user13134
la source