web-dev-qa-db-ja.com

コマース部分支払い:チェックアウト時にデポジットを支払い、後で全額決済

旅行予約Webサイトで、顧客がチェックアウト時に注文総額の%預金のみを支払うようにチェックアウトを構成するにはどうすればよいですか(オフサイト決済ATOSソリューション) )?

注文が作成された場合:

  • 出発の30日未満の場合、お客様はチェックアウト時に注文総額の100%を支払います。
  • 30〜90日前に、チェックアウト時に30%を支払います。
  • 90日以上前に、チェックアウト時に10%を支払います。

旅行出発前に全額を支払う必要があります(リマインダーメール)...

デポジットまたは部分的な支払いに関する寄稿モジュールはほとんどありません。

  • 私は Commerce deposit サンドボックスを調べましたが、それは製品ごとのソリューションのようですが、グローバルカートのアプローチが必要です。
  • 私はハッキングを始めました Commerce Partial Payment 私自身の必要性のため。モジュールはcheckout_form_alterを変更し、顧客が支払いの直前にデポジット値を入力できるテキストフィールドを提供するため、上記のルールに従ってデポジット額を事前に計算し、フィールドに入力して非表示にしました。

    /**
     * Implements hook_form_BASE_FORM_ID_alter().
     *
     * Alters whichever commerce checkout page includes the commerce_payment
     * checkout pane and adds the amount element to the payment details.
     */
    function commerce_partial_payment_form_commerce_checkout_form_alter(&$form, &$form_state, $form_id) {
    
      $panes = commerce_checkout_panes(array('pane_id' => 'commerce_payment'));
      $checkout_page = $panes['commerce_payment']['page'];
      if ($form_id != "commerce_checkout_form_$checkout_page" || !commerce_partial_payment_access($form_state['order'])) {
        return;
      }
    
      //setting up my own deposit value
      $deposit = vts_commerce_deposit();
    
      // If a values has already been set then use it as the value for the amount.
      // Otherwise, default it to the balance of the order.
      $default = NULL;
    
      if ($deposit > 0) {
         $default = $deposit ;
      }
      elseif (isset($form_state['values']['commerce_payment']['payment_details']['amount'])) {
        $default = $form_state['values']['commerce_payment']['payment_details']['amount'];
      }
      else {
        $balance = commerce_payment_order_balance($form_state['order']);
        $default = commerce_currency_amount_to_decimal($balance['amount'], $balance['currency_code']);
      }
    
      // Add the amount to the payment details form.
      $form['commerce_payment']['payment_details']['amount'] = array(
        '#type' => 'hidden',
        //'#title' => t('Amount'),
        '#weight' => -10,
        '#required' => TRUE,
        '#default_value' => $default,
      );
    }
    

しかし、$form['commerce_payment']['payment_details']['amount']に渡された値がリモート決済サーバーに送信されたものではないため、そこでスタックしました(そのため、このモジュールは機能しません)...

checkout_form_alter$formおよび$form_state)の他の部分を設定しようとしましたが、$depositで注文金額が繰り返されました。これにより、次回の支払いに設定された値が変更されることはありませんステップ...

質問

上記の解決策を使用して、チェックアウトのどの時点で/どのフォームで支払い金額を変更できますか?注文合計を預金金額で置き換えますか?

実際、注文金額を支払い金額から分離する方法を見つけることができませんでした...プロセスに沿った正しいデータを使用して:注文総額/支払われた預金/残高の支払い注文後で。

このデポジットの問題を実装するためのD7コマースの方法が他にもある場合は、ルールなどを使用して、それを学ぶことができてうれしいです。

6
Kojo

私はそれを次のように機能させました。

  • 最初にインストール Commerce Partial Payment
  • 預金を計算するカスタム関数を作成しますMODULENAME_deposit_calculation

顧客預金入力の代わりに希望する預金計算を使用してCommerce Depositを機能させるには、次のようにパッチを適用します。

function commerce_partial_payment_form_commerce_checkout_form_alter(&$form, &$form_state, $form_id) {
  //... line 93
  $acompte = MODULENAME_deposit_calculation($form_state['order']) /100;
    if (!is_null($acompte) && $acompte > 0) {
      $default = $acompte;
    }
  //... line 109 Add the amount to the payment details form,in a hidden field.
  $form['commerce_payment']['payment_details']['amount'] = array(
    '#type' => 'hidden',
  //...
}

function commerce_partial_payment_checkout_validate($form, &$form_state, $checkout_pane, $order) {
  //... line 261
  $amount['amount'] = MODULENAME_deposit_calculation($order)  /100;
  //...
}

function commerce_partial_payment_checkout_submit($form, &$form_state, $checkout_pane, $order) {
  //...line 317
  if ($pane_values['payment_methods']) {
    $amount = MODULENAME_deposit_calculation($order) /100;
    $order->data['atos']['request']['amount'] = $amount;
    if (!empty( $amount)){
      $amount['amount'] = $amount;
  //...
}

サンドボックスが適切に動作しないオフサイトの支払いにデポジット金額を送信する、支払い方法をフックする必要があります:

METHOD_PAYMENT.api.phpファイル

function hook_METHOD_PAYMENT_request_alter(&$settings) {
  //no example
}

次に、注文総額ではなく、デポジット額をサイト外にお支払いください。

function commerce_partial_payment_PAYMENT_METHOD_request_alter(&$settings) {
  $order = commerce_order_load($settings['order_id']);
  $deposit = MODULENAME_deposit_calculation($order);
  $settings['amount'] = $deposit;
}

最後に、価格コンポーネントデポジットを追加合計の下に、顧客に支払う金額を通知します。

function commerce_partial_payment_commerce_price_formatted_components_alter(&$components, $price, $entity) {
  //Add a deposit line to price components
  $deposit= MODULENAME_deposit_calculation($entity);

  $components['deposit'] = array(
      'title' => t('Deposit'),
      'price' => array(
        'amount' => $deposit,
        'currency_code' => $components['commerce_price_formatted_amount']['price']['currency_code'],
        'data' => '',
      ),      
    'weight' => '200',
  );
}
4
Kojo

チェックアウト時にフォームを変更することは、あなたの支払い方法に関心がある場所ではないと思います。実際の注文の合計金額のみが考慮されます、imo。

したがって、カスタムモジュールまたはルールを使用して、チェックアウトフォームの送信時にそれを変更する必要があります。

考慮されるデータは$order->commerce_order_total['und'][0]['amount']

0