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을 요청하고 매력적으로 내 문제를 해결하지 못하게 :)
유세프

@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 ($ order);
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. 결제 과정에서 이름, 주소 등을 묻습니다.

나는 갔었다

/ admin / commerce / config / checkout

그리고 비활성화

  • 계정 정보
  • 청구 정보
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.