Creación programática de un pedido en Drupal Commerce para usuarios anónimos que redirigen a la página de pago

19

Ryan tiene un gran código que puede crear mediante programación un pedido

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

Tengo un sitio donde quiero recibir donaciones anónimas, así que tengo dos problemas.

  1. Si un usuario no ha iniciado sesión en el sitio, recibe un mensaje de acceso denegado
  2. El proceso de pago solicita nombre, dirección, etc.

Lo que quiero hacer es tener una página donde confirme el monto y luego sea llevado a la página de pago. En este caso, estoy usando PayPal WPS, por lo que redirigir allí sería genial.

Cualquier consejo que pueda dar sería apreciado.

usuario13134
fuente
Genial, tu pregunta no me permite hacer preguntas y resolver mi problema con encanto :)
Yusef
@zhilevan, gracias por comentar, esto funcionó, así que solo necesito recordarme la respuesta. También lo
agregaré
Implemento este código en otro proyecto, pero cuando ni el usuario root lo ejecuta, ¡no se encuentra la página de retorno!
Yusef
No se pudo encontrar la página solicitada "/ nashrtest / checkout / 12".
Yusef

Respuestas:

12

Puede intentar probar un nuevo módulo llamado Commerce Drush que tiene la siguiente sintaxis:

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

Solución manual

Para crear un pedido mediante programación en Commerce, puede usar el siguiente código (también funciona con drush, por ejemplo drush -vd -u "$1" scr order_code-7.php). Tenga en cuenta que commerce_payment_examplese requiere un módulo.

<?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: Como se sugiere en el comentario, si tiene un error sobre el método de pago es desconocido al guardar el pedido, asegúrese de haberlo especificado, p. Ej.

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 
kenorb
fuente
2
El módulo Commerce Drush suena como una herramienta increíble.
Francisco Luz
Con respecto a la parte de la solución manual, hay un problema con la notificación por correo electrónico del pedido. El método de pago es "desconocido" No estoy seguro de por qué, ya lo probé utilizando el método de pago de ejemplo y es "desconocido"
fkaufusi
@fkaufusi Tendrás que plantear la nueva pregunta para ver qué sucede.
kenorb
Ahora encontré una solución para el método de pago "desconocido" en el correo electrónico del pedido. Necesito agregar el método de pago al pedido antes de guardarlo. Esto permitirá que el sistema de tokens recoja el método de pago y lo use en el correo electrónico del pedido. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ orden);
fkaufusi
5

Este script modificado también funciona para los usuarios anónimos:

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

1. Si un usuario no ha iniciado sesión en el sitio, recibe un mensaje de acceso denegado

Tengo algo funcionando pero dudo mucho que sea la mejor práctica.

Al final hice trampa. En mi formulario donde pones tus datos, incluida la dirección de correo electrónico, creo una cuenta de usuario sobre la marcha y luego ingreso al usuario. Si una dirección de correo electrónico está lista para usar, ingreso al usuario (me aseguro de que no estés usando dirección de correo electrónico del administrador).

Como mi sitio solo tiene la página del formulario de donación cuando llega a esa página, se asegura de que haya cerrado la sesión (si no es administrador). En una transacción exitosa, cierra la sesión. Desactivé el historial de pedidos / establecí redirecciones para que solo pueda ir a las páginas que conozco cuando inicie sesión. No se almacenan datos personales y no puedo ver donaciones pasadas

En mi situación, estoy contento con cómo funciona esto. No es ideal y solo funcionará en algunos casos.

2. El proceso de pago solicita nombre, dirección, etc.

fui a

/ admin / commerce / config / checkout

Y deshabilitado

  • Información de la cuenta
  • Datos de facturación
usuario13134
fuente