私はSagepayサンドボックスでUbercartをテストしましたが、支払いのたびに入力するのは非常に不便です。もう1つの欠点は、内部ホストで作業する場合、外部支払いゲートウェイからのリダイレクトURLが機能しないため、テスト時に支払いが完了しないことです。
チェックアウト後に支払いをバイパスして、テスト目的で注文を完了する方法はありますか?オプションやモジュールはありますか?
Drupal 6および7
「支払い不要」という無料の支払い方法を追加して、これらの支払いに適切なルール条件を設定できます。
bercartカスタム支払い モジュールと bercart割引クーポン モジュールの組み合わせを使用してこれを行う1つの方法、つまり100%
割引のクーポンを作成し、支払いプロセスをバイパスするubercart custom payment
モジュールが必要になります(デフォルトでは、それを使用できるルールが提供されます)。
Ubercart割引クーポン:クーポンは、固定価格割引またはパーセンテージ割引を注文の小計または選択した製品価格に適用できます。
クーポンは、[ストアの管理]> [クーポン]で構成します。モジュールのグローバル設定は、[ストアの管理]> [構成]> [クーポンモジュール設定]で構成します。
Ubercartカスタム支払いモジュール:
は「無料注文」の支払い方法を提供し、これを可能にするデフォルトのルール設定が提供されます。
Drupal 6
私は以下のようにいくつかのカスタムバイパス機能を定義しました:
/**
* Implementation of hook_menu().
*/
function foo_menu() {
// URL for user to be directed to on test order completion
$items['test/order/%/complete'] = array(
'title' => 'Fake payment bypass.',
'page callback' => 'foo_test_order_complete',
'page arguments' => array(2),
// 'access callback' => variable_get('my_environment', 'live') <> 'live', // disabled on live
'access callback' => 'user_access',
'access arguments' => array('administer site configuration'), // Only admin can test that
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Test order completion page
*/
function foo_test_order_complete($order_id) {
if (empty($_SESSION['cart_order'])) {
$_SESSION['cart_order'] = $order_id;
}
$order = uc_order_load($_SESSION['cart_order']);
// This lets us know it's a legitimate access of the complete page.
$_SESSION['do_complete'] = TRUE;
module_load_include('inc', 'uc_cart', 'uc_cart.pages');
uc_cart_checkout_complete();
drupal_goto('cart/checkout/complete');
}
したがって、レビュー注文を送信すると、次のようになります。
test/order/12345/complete
ここで、12345は注文番号または次の番号です。
test/order/current/complete
は、セッションから注文を読み込みます。
これらのURLには管理者のみがアクセスできますが、必要に応じて自由に権限を拡張できます。
Drupal 6
次のPHPコードを使用できます。
<?php
// See: http://www.ubercart.org/forum/development/17963/programmatically_submit_entire_ubercart_order_using_drupal_execute_debugging
/*
* Node IDs for the products:
* 4844 - My product
*/
$nid = 4844;
$form_state = array(
'values' => array(
'nid' => $nid,
'qty' => 1,
),
);
$node = node_load($nid);
drupal_execute("uc_product_add_to_cart_form", $form_state, $node);
// Load the relevant include files for checkout, as normally done by hook_menu
module_load_include('inc', 'uc_cart', 'uc_cart.pages');
$uc_cart_checkout_form_state = array();
// Define billing information in the form_state variable
// Note: When using Sagepay in test mode, to simulate successful payment the first line of the address must be '88' and the postcode should be '412'.
// Customer e-mail
$uc_cart_checkout_form_state['values']['panes']['customer']['primary_email'] = '[email protected]';
// Billing details
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_first_name'] = 'Test';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_last_name'] = 'Order';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_address_select'] = '0';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_company'] = 'Company LTD';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_street1'] = '88 Test Street';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_street2'] = '';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_city'] = 'London';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_country'] = '826';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_zone'] = '2806';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_postal_code'] = '412';
$uc_cart_checkout_form_state['values']['panes']['billing']['billing_phone'] = '0123';
$uc_cart_checkout_form_state['values']['panes']['uc_termsofservice_agreement_checkout']['tos_agree']['agreed'] = 'agreed';
// VAT and Discounts
$uc_cart_checkout_form_state['values']['panes']['vat_number']['vat_number'] = '';
$uc_cart_checkout_form_state['values']['panes']['uc_discounts']['uc-discounts-codes'] = '';
$uc_cart_checkout_form_state['values']['panes']['uc_discounts']['uc-discounts-placeholder'] = '';
$uc_cart_checkout_form_state['values']['panes']['uc_discounts']['uc-discounts-button'] = '';
// Payment details
$uc_cart_checkout_form_state['values']['panes']['payment']['current_total'] = NULL;
$uc_cart_checkout_form_state['values']['panes']['payment']['payment_method'] = 'free_order';
// $uc_cart_checkout_form_state['values']['panes']['payment']['payment_method'] = 'uc_sagepayserver'; // enable when testing SagePay payments
// Etc etc etc
// Define the credit card information in the $_POST directly.
// See uc_payment_method_credit($op = 'cart-process') for why this is necessary.
$_POST['cc_type'] = 'uc_credit_visa';
$_POST['cc_owner'] = 'Test Order';
$_POST['cc_number'] = '4929000000006';
$_POST['cc_exp_month'] = '12';
$_POST['cc_exp_year'] = '2018';
$_POST['cc_cvv'] = '123';
// Programmatically emulate the hitting of the 'Review order' button
$uc_cart_checkout_form_state['values']['op'] = t('Review order');
drupal_execute('uc_cart_checkout_form', $uc_cart_checkout_form_state);
if ($uc_cart_checkout_form_state['redirect'] == 'cart/checkout/review') {
// We're good to move forward!!
$uc_cart_checkout_review_form_state = array();
// Define the session's sescrd info in the $_POST directly
// See uc_credit_cart_review_pre_form_submit() for why this is necessary.
$_POST['sescrd'] = base64_encode($_SESSION['sescrd']);
//Programmatically emulate the hitting of the 'Submit order' button
$uc_cart_checkout_review_form_state['values']['op'] = t('Submit order');
drupal_execute('uc_cart_checkout_review_form', $uc_cart_checkout_review_form_state);
if ($uc_cart_checkout_review_form_state['redirect'] == 'cart/checkout/complete') {
// The order checks out -- go ahead and complete it using uc_cart_checkout_complete()!
drupal_set_message(uc_cart_checkout_complete());
}
}
?>
上記のファイルは、order-6.phpに貼り付けて、以下のようにdrushコマンドとして使用できます。
drush -v scr order-6.php
オプションで、-u user
を使用して、別のユーザーを使用して注文をテストできます。 Drupal 7の場合、主に drupal_execute() を drupal_form_submit() で変更する必要があります。
コマース
コマースの例については、以下をご覧ください。