การสร้างคำสั่งซื้อใน Drupal Commerce โดยทางโปรแกรมสำหรับผู้ใช้ที่ไม่ระบุชื่อซึ่งเปลี่ยนเส้นทางไปยังหน้าการชำระเงิน


19

Ryan มีรหัสที่ยอดเยี่ยมที่คุณสามารถสร้างคำสั่งซื้อโดยทางโปรแกรม

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

ฉันมีเว็บไซต์ที่ฉันต้องการบริจาคโดยไม่ระบุชื่อดังนั้นฉันจึงมีปัญหาสองข้อ

  1. หากผู้ใช้ไม่ได้เข้าสู่เว็บไซต์พวกเขาจะได้รับข้อความปฏิเสธการเข้าถึง
  2. กระบวนการเช็คเอาต์ถามชื่อที่อยู่ ฯลฯ

สิ่งที่ฉันต้องการจะทำคือมีหน้าที่คุณยืนยันจำนวนเงินและนำไปที่หน้าการชำระเงิน ในกรณีนี้ฉันใช้ PayPal WPS ดังนั้นการเปลี่ยนเส้นทางจะดีมาก

คำแนะนำใด ๆ ที่คุณจะให้จะได้รับการชื่นชม


ดีคุณถามป้องกันไม่ให้ฉันไปถาม qustion และแก้ปัญหาของฉันเสน่ห์ :)
Yusef

@zhilevan ขอบคุณสำหรับการแสดงความคิดเห็นฉันได้ทำงานนี้ดังนั้นเพียงแค่ต้องเตือนตัวเองถึงคำตอบ ฉันจะเพิ่มที่เช่นกัน
user13134

ฉันใช้รหัสนี้ในโครงการอื่น แต่เมื่อไม่มีผู้ใช้รูทรันจะไม่พบหน้าส่งคืน !!!
Yusef

ไม่พบหน้าที่ร้องขอ "/ nashrtest / checkout / 12"
Yusef

คำตอบ:


12

คุณอาจลองทดสอบโมดูลใหม่ที่ชื่อว่าCommerce Drushซึ่งมีไวยากรณ์ต่อไปนี้:

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

วิธีแก้ปัญหาด้วยตนเอง

สำหรับการสร้างคำสั่งซื้อแบบเป็นโปรแกรมใน Commerce คุณสามารถใช้รหัสต่อไปนี้ (ใช้ได้กับ drush เช่นกันdrush -vd -u "$1" scr order_code-7.php) โปรดทราบว่าcommerce_payment_exampleจำเป็นต้องมีโมดูล

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

หมายเหตุ: ในฐานะที่เป็นข้อเสนอแนะในการแสดงความคิดเห็นถ้าคุณมีข้อผิดพลาดเกี่ยวกับวิธีการชำระเงินเป็นที่รู้จักในขณะที่ประหยัดเพื่อให้แน่ใจว่าคุณได้ระบุไว้ก็เช่น

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

2
โมดูล Commerce Drush ดูเหมือนเครื่องมือที่ยอดเยี่ยม
Francisco Luz

ในส่วนของการแก้ปัญหาด้วยตนเองมีปัญหากับการแจ้งเตือนทางอีเมลของคำสั่งซื้อ วิธีการชำระเงินคือ "ไม่ทราบ" ฉันไม่แน่ใจว่าทำไมฉันได้ทดสอบแล้วโดยใช้วิธีการชำระเงินตัวอย่างและเป็น "ไม่ทราบ"
fkaufusi

@fkaufusi คุณจะต้องตั้งคำถามใหม่เพื่อตรวจสอบสิ่งที่เกิดขึ้น
kenorb

ตอนนี้ฉันพบวิธีแก้ปัญหาสำหรับวิธีการชำระเงิน "ไม่ทราบ" ในอีเมลคำสั่งซื้อ ฉันต้องเพิ่มวิธีการชำระเงินในการสั่งซื้อก่อนบันทึกการสั่งซื้อ สิ่งนี้จะช่วยให้ระบบโทเค็นรับวิธีการชำระเงินและใช้ในอีเมลคำสั่งซื้อ $ order-> data ['payment_method'] = 'commerce_payment_example | commerce_payment_commerce_payment_example'; commerce_order_save ($ ตามลำดับ);
fkaufusi

5

สคริปต์ที่แก้ไขนี้ทำงานได้กับผู้ใช้ที่ไม่ระบุชื่อด้วย:

<?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. หากผู้ใช้ไม่ได้เข้าสู่เว็บไซต์พวกเขาจะได้รับข้อความปฏิเสธการเข้าถึง

ฉันทำงานบางอย่างได้ แต่ฉันสงสัยอย่างยิ่งว่านี่เป็นแนวทางปฏิบัติที่ดี

ในที่สุดฉันก็โกง ในแบบฟอร์มของคุณที่คุณใส่รายละเอียดของคุณรวมถึงที่อยู่อีเมลฉันสร้างบัญชีผู้ใช้ทันทีและจากนั้นเข้าสู่ระบบผู้ใช้หากที่อยู่อีเมลพร้อมใช้งานแล้วฉันจะเข้าสู่ระบบของผู้ใช้ (ฉันแน่ใจว่าคุณไม่ได้ใช้ ที่อยู่อีเมลผู้ดูแลระบบ)

เนื่องจากไซต์ของฉันมีหน้าแบบฟอร์มการบริจาคเท่านั้นเมื่อคุณเข้าสู่หน้านั้นคุณต้องออกจากระบบ (ถ้าไม่ใช่ผู้ดูแลระบบ) ในการทำธุรกรรมที่ประสบความสำเร็จจะเป็นการออกจากระบบคุณ ฉันปิดประวัติคำสั่งซื้อ / เปลี่ยนเส้นทางในสถานที่เพื่อให้คุณสามารถไปบนหน้าเว็บที่ฉันรู้เกี่ยวกับเมื่อเข้าสู่ระบบไม่มีรายละเอียดส่วนบุคคลจะถูกเก็บไว้และไม่สามารถเห็นการบริจาคที่ผ่านมา

ในสถานการณ์ของฉันฉันมีความสุขกับวิธีการทำงาน มันไม่เหมาะและจะทำงานในบางกรณีเท่านั้น

2. กระบวนการเช็คเอาต์ถามชื่อที่อยู่ ฯลฯ

ฉันไปที่

/ ธุรการ / พาณิชย์ / config / ชำระเงิน

และปิดการใช้งาน

  • ข้อมูลเกี่ยวกับบัญชี
  • ข้อมูลการเรียกเก็บเงิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.