Criando programaticamente um pedido no Drupal Commerce para usuários anônimos redirecionando para a página de pagamento

19

Ryan tem um ótimo código que você pode criar programaticamente um 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

Eu tenho um site onde desejo receber doações anônimas, por isso tenho dois problemas.

  1. Se um usuário não estiver conectado ao site, ele receberá uma mensagem de acesso negado
  2. O processo de pagamento solicita nome, endereço etc.

O que eu quero fazer é ter uma página em que você confirme o valor e seja levado para a página de pagamento. Nesse caso, estou usando o PayPal WPS, então seria ótimo redirecionar.

Qualquer conselho que você poderia dar seria apreciado.

user13134
fonte
Ótimo, você questionar impedir-me de perguntar qustion e resolver o meu problema encantadoramente :)
Yusef
@zhilevan obrigado por comentar que consegui esse trabalho, então só preciso me lembrar da resposta. Vou acrescentar isso também
user13134
Eu implemento esse código em outro projeto, mas quando nem o usuário root o executa, a página de retorno não é encontrada !!!
Yusef
A página solicitada "/ nashrtest / checkout / 12" não foi encontrada.
Yusef

Respostas:

12

Você pode tentar testar um novo módulo chamado Commerce Drush, que possui a seguinte sintaxe:

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

Solução manual

Para criar um pedido programaticamente no Commerce, você pode usar o código a seguir (ele também funciona com drush, por exemplo drush -vd -u "$1" scr order_code-7.php). Por favor, note que o commerce_payment_examplemódulo é necessário.

<?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: Conforme sugerido no comentário, se você tiver um erro sobre o método de pagamento desconhecido ao salvar o pedido, verifique se o especificou, por exemplo

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 
kenorb
fonte
2
O módulo Commerce Drush parece uma ferramenta incrível.
Francisco Luz
Em relação à parte da solução manual, há um problema com a notificação por email do pedido. O método de pagamento é "desconhecido" Eu não sei por que, eu já testado usando o método exemplo de pagamento e é "desconhecido"
fkaufusi
@fkaufusi Você terá que levantar a nova pergunta para verificar o que está acontecendo.
kenorb
Agora encontrei uma solução para o método de pagamento "desconhecido" no e-mail do pedido. Preciso adicionar o método de pagamento ao pedido antes de salvar o pedido. Isso permitirá que o sistema de token pegue a forma de pagamento e use no e-mail do pedido. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; trade_order_save ($ order);
fkaufusi
5

Este script modificado também funciona para usuários 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
fonte
-1

1. Se um usuário não estiver conectado ao site, ele receberá uma mensagem de acesso negado

Consegui algo funcionando, mas duvido que seja uma boa prática.

No final, eu traí. No formulário, onde você coloca seus dados, incluindo o endereço de e-mail, crio uma conta de usuário em tempo real e, em seguida, efetuo login. Se um endereço de e-mail estiver pronto para uso, efetuo login no usuário. endereço de e-mail do administrador).

Como meu site só possui a página do formulário de doação quando você acessa essa página, garante que você esteja desconectado (se você não for administrador). Em uma transação bem-sucedida, você será desconectado. Desativei o histórico de pedidos / coloquei os redirecionamentos para que você só possa acessar as páginas que conheço quando estiver logado. Nenhum dado pessoal é armazenado e não é possível ver doações anteriores

Na minha situação, estou feliz com como isso funciona. Não é o ideal e só funcionará em alguns casos.

2. O processo de pagamento solicita nome, endereço etc.

eu fui para

/ admin / commerce / config / checkout

E desativado

  • Informação da conta
  • Informações de pagamento
user13134
fonte