Lập trình tạo một đơn hàng trong Drupal Commerce cho người dùng ẩn danh chuyển hướng đến trang thanh toán


19

Ryan có một số mã tuyệt vời mà bạn có thể lập trình tạo một đơn hàng

<?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.drupalc Commerce.org/questions/3259/it-possible-drupal-commerce-work-without-cart-module

Tôi có một trang web nơi tôi muốn nhận đóng góp ẩn danh để tôi có hai vấn đề.

  1. Nếu người dùng không đăng nhập vào trang web, họ sẽ nhận được thông báo từ chối truy cập
  2. Quá trình thanh toán yêu cầu tên, địa chỉ, vv

Những gì tôi muốn làm là có một trang nơi bạn xác nhận số tiền sau đó được đưa đến trang thanh toán. Trong trường hợp này tôi đang sử dụng PayPal WPS nên việc chuyển hướng sẽ rất tuyệt.

Bất kỳ lời khuyên nào bạn có thể đưa ra sẽ được đánh giá cao.


Tuyệt vời, câu hỏi của bạn ngăn cản tôi hỏi và giải quyết vấn đề của mình một cách duyên dáng :)
Yusef

@zhilevan cảm ơn vì đã bình luận Tôi đã làm việc này vì vậy chỉ cần nhắc nhở bản thân về câu trả lời. Tôi cũng sẽ thêm nó
user13134

Tôi triển khai mã này trong một dự án khác, nhưng khi người dùng root cũng không chạy nó, không tìm thấy trang trả về !!!
Yusef

Không thể tìm thấy trang được yêu cầu "/ nashrtest / checkout / 12".
Yusef

Câu trả lời:


12

Bạn có thể thử kiểm tra một mô-đun mới có tên Commerce Drush có cú pháp sau:

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

Giải pháp thủ công

Để tạo một đơn đặt hàng theo chương trình trong Thương mại, bạn có thể sử dụng mã sau đây (nó cũng hoạt động với drush, ví dụ drush -vd -u "$1" scr order_code-7.php). Xin lưu ý rằng commerce_payment_examplemô-đun là bắt buộc.

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

Lưu ý: Như được đề xuất trong nhận xét, nếu bạn gặp lỗi về phương thức thanh toán không xác định trong khi lưu đơn hàng, hãy đảm bảo bạn đã chỉ định nó, ví dụ:

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

2
Mô-đun Commerce Drush có vẻ như là một công cụ tuyệt vời.
Francisco Luz

Về phần giải pháp thủ công, có một vấn đề với thông báo email đặt hàng. Phương thức thanh toán là "không xác định" Tôi không chắc tại sao, tôi đã thử nghiệm bằng cách sử dụng phương thức thanh toán mẫu và là "không xác định"
fkaufusi

@fkaufusi Bạn sẽ phải đưa ra câu hỏi mới sau đó để kiểm tra xem chuyện gì đang xảy ra.
kenorb

Bây giờ tôi đã tìm thấy một giải pháp cho phương thức thanh toán "không xác định" trên email đặt hàng. Tôi cần thêm phương thức thanh toán vào đơn hàng trước khi lưu đơn hàng. Điều này sẽ cho phép hệ thống mã thông báo chọn phương thức thanh toán và sử dụng trên email đặt hàng. $ order-> data ['Payment_method'] = 'Commerce_payment_example | Commerce_payment_c Commerce_payment_example'; Commerce_order_save ($ order);
fkaufusi

5

Kịch bản sửa đổi này cũng hoạt động cho người dùng ẩn danh:

<?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. Nếu người dùng không đăng nhập vào trang web, họ sẽ nhận được thông báo từ chối truy cập

Tôi có một cái gì đó làm việc nhưng tôi rất nghi ngờ đó là thực hành tốt nhất.

Cuối cùng tôi đã lừa dối. Trên biểu mẫu của tôi nơi bạn đặt chi tiết của bạn bao gồm địa chỉ email Tôi tạo tài khoản người dùng một cách nhanh chóng và sau đó đăng nhập người dùng. Nếu một địa chỉ email đã sẵn sàng sử dụng, tôi đăng nhập người dùng. (Tôi chắc chắn rằng bạn không sử dụng địa chỉ email quản trị).

Vì trang web của tôi chỉ có trang biểu mẫu quyên góp khi bạn nhấn trang đó nên nó đảm bảo bạn đã đăng xuất (nếu bạn không phải là quản trị viên). Trên một giao dịch thành công, nó đăng xuất bạn. Tôi đã tắt lịch sử đặt hàng / đặt chuyển hướng tại chỗ để bạn chỉ có thể truy cập các trang tôi biết khi đăng nhập. Không có thông tin cá nhân nào được lưu trữ và không thể thấy quyên góp trong quá khứ

Trong tình huống của tôi, tôi hài lòng với cách làm việc này. Nó không lý tưởng và sẽ chỉ hoạt động trong một vài trường hợp.

2. Quá trình thanh toán yêu cầu tên, địa chỉ, vv

tôi đã đi đến

/ quản trị / thương mại / cấu hình / thanh toán

Và bị vô hiệu hóa

  • Thông tin tài khoản
  • Thông tin thanh toan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.