Secara terprogram membuat pesanan di Drupal Commerce untuk pengguna anonim yang mengarahkan ulang ke halaman pembayaran

19

Ryan memiliki beberapa kode hebat yang secara terprogram Anda dapat membuat pesanan

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

Saya memiliki situs di mana saya ingin mengambil donasi anonim jadi saya punya dua masalah.

  1. Jika pengguna tidak masuk ke situs mereka mendapat akses ditolak pesan
  2. Proses checkout menanyakan nama, alamat, dll.

Yang ingin saya lakukan adalah memiliki halaman di mana Anda mengkonfirmasi jumlah kemudian dibawa ke halaman pembayaran. Dalam hal ini saya menggunakan PayPal WPS sehingga mengarahkan ulang akan bagus.

Setiap saran yang bisa Anda berikan akan dihargai.

pengguna13134
sumber
Hebat, pertanyaan Anda mencegah saya untuk bertanya qustion dan menyelesaikan masalah saya dengan apik :)
Yusef
@ Zhilevan terima kasih sudah berkomentar saya dapat ini, jadi hanya perlu mengingatkan diri sendiri tentang jawabannya. Saya akan menambahkan itu juga
user13134
Saya menerapkan kode ini di proyek lain, tetapi ketika pengguna root tidak menjalankannya, halaman kembali tidak ditemukan !!!
Yusef
Halaman yang diminta "/ nashrtest / checkout / 12" tidak dapat ditemukan.
Yusef

Jawaban:

12

Anda dapat mencoba menguji modul baru bernama Commerce Drush yang memiliki sintaks berikut:

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

Solusi manual

Untuk membuat pesanan secara terprogram di Commerce, Anda dapat menggunakan kode berikut (ini berfungsi dengan drush juga, mis drush -vd -u "$1" scr order_code-7.php.). Harap dicatat bahwa commerce_payment_examplemodul diperlukan.

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

Catatan: Seperti yang disarankan dalam komentar, jika Anda mendapat kesalahan tentang metode pembayaran tidak diketahui saat menyimpan pesanan, pastikan Anda telah menentukannya, mis.

$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_‌​example';
commerce_order_save($order); 
kenorb
sumber
2
Modul Commerce Drush terdengar seperti alat yang luar biasa.
Francisco Luz
Mengenai bagian solusi manual, ada masalah dengan pemberitahuan email pesanan. Metode pembayaran "tidak diketahui" Saya tidak yakin mengapa, saya sudah diuji dengan menggunakan metode pembayaran contoh dan "tidak diketahui"
fkaufusi
@fkaufusi Anda harus mengajukan pertanyaan baru kemudian untuk memeriksa apa yang terjadi.
kenorb
Saya sekarang menemukan solusi untuk metode pembayaran "tidak dikenal" pada email pesanan. Saya perlu menambahkan metode pembayaran ke pesanan sebelum menyimpan pesanan. Ini akan memungkinkan sistem token untuk mengambil metode pembayaran dan digunakan pada email pesanan. $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ order);
fkaufusi
5

Skrip yang dimodifikasi ini juga berfungsi untuk pengguna anonim:

<?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);
Menyala
sumber
-1

1. Jika pengguna tidak masuk ke situs mereka mendapat akses ditolak pesan

Saya punya sesuatu yang bekerja tetapi saya sangat meragukan itu adalah praktik terbaik.

Pada akhirnya saya selingkuh. Pada formulir saya di mana Anda menaruh detail Anda termasuk alamat email, saya membuat akun pengguna dengan cepat dan kemudian login pengguna. Jika alamat email semua siap digunakan saya login pengguna. (Saya pastikan Anda tidak menggunakan alamat email admin).

Karena situs saya hanya memiliki halaman formulir donasi ketika Anda menekan halaman itu, itu memastikan Anda sudah keluar (jika Anda bukan admin). Pada transaksi yang berhasil itu membuat Anda keluar. Saya telah menonaktifkan riwayat pesanan / mengalihkan pengalihan sehingga Anda hanya dapat membuka halaman yang saya ketahui saat masuk. Tidak ada detail pribadi yang disimpan dan tidak dapat melihat donasi sebelumnya.

Dalam situasi saya, saya senang dengan cara ini bekerja. Ini tidak ideal dan hanya akan berfungsi dalam beberapa kasus.

2. Proses checkout menanyakan nama, alamat dll.

saya pergi ke

/ admin / commerce / config / checkout

Dan dinonaktifkan

  • Informasi Akun
  • Informasi tagihan
pengguna13134
sumber