php - 自動 - 請求 とお 支払い




この文脈の流れはどうあるべきですか?(選択したお支払い方法に応じて支払いを処理するコードはどこに置くのですか?) (2)

あなたの疑問と同じように、コードを整理して論理を分離する(DRYの概念)ためには、いくつかのことをすべきです:

  • 3つの関数を使ってPaymentsControllerを作成します(最初は、ここにもっと追加します)

    1. あなたの参照を処理するための
    2. クレジットカード処理用
    3. (ユーザがステップ3を完了するまで、セッションに支払い方法を記憶する)

    これらの関数の名前は完全に自由ですが、 processViaCreditCardstorePaymentMethodprocessViaCreditCardなどをstorePaymentMethodます。

    それらを分離しておけば、読みやすく、検証する方がはるかに簡単です。

    彼らのための対応するポストルートを作成し、適切に参照してください。

  • フォームのみを含むパーツビューを作成します。

    次に、これらの部品ビューを@includeを介して含めると、ビューレベルで分離されます。 javascript / jQueryでの参照については、正しいIDを保持してください。 あなたがまだそれをしていない場合は、javascriptを抽出することができます、他のビューの部品のビューや別のjsファイルも。

    あなたのビュー/フォームコードは、これらのパーツビューに移動する必要があります...

私はユーザーが会議に登録するための複数ステップのフォームを持っています、すべてのステップは同じregistration.blade.phpページにあります。ステップ1とステップ2でフォームフィールドを検証するajaxリクエストが行われます。

手順は次のとおりです。

  • ステップ1では、ユーザーに関する情報( 名前と錫番号 )を収集し、
  • ステップ2は、支払方法( クレジットカードまたは参照 )を収集することです。
  • ステップ3は支払いです
  • ステップ4に成功メッセージが表示されます( このステップはクレジットカードでの支払いが成功した後にのみ表示されますが、このステップの参照は表示されません。参照の支払い方法でステップ1,2および3のみが表示されます

私の疑念は、ステップ2と3の間にあります。

下記のコードを実行するために選択した支払方法の参照が必要な場合は、支払参照を生成し、ステップ3でその参照をユーザに提示します。ユーザが支払いを支払うと、システムは通知を受け取り、支払テーブルに挿入する必要がありpricepayment_method_idregistration_idおよびstatus支払済 )。

参照で支払いを処理するコード:

    public function ReferencesCharge(Request $request)
        {
           $payment_info = [
        'name' => "user name",
        'email' => 'user email',
        'value' => 'registration total price',
        'id' => 'registration id',
    ];

    $newPayment = new Payment($payment_info);
    $reference = $newPayment->gererateReferences();

    //$reference returns an array with necessary codes to present to the user so he can pay

    // after generate references is necessary:
            // show in step 3 the generated references
            // insert an entry in the payments table when the system receives a notification from 3rd party service informing that the user did the payment

}

選択された支払いがクレジットカードであった場合は、以下のコードを実行してクレジットカードを請求し、その後、支払いテーブルにpricepayment_method_idregistration_idおよびstatus支払済 )を挿入します。 そして、ユーザーはステップ4にリダイレクトして成功メッセージを表示する必要があります:

クレジットカード支払いを処理するコード:

public function creditCardCharge(Request $request)
    {
        Stripe::setApiKey(config('services.stripe.secret'));
        $source = $request->stripeToken;

        try{
            Charge::create([
                'currency' => 'eur',
                'amount' => 2500,
                'source' => $source,
            ]);
        }
        catch(\Exception $e){
            return response()->json(['status' => $e->getMessage()], 422);
        }

        // after charging the card with success:
            // insert an entry in the payments table 
            // redirect to success confirmation step to inform the user that payment was done with success 
    }

私の疑いは、参照との支払いを処理するコードとクレジットカードによる支払いを処理するコードを配置する必要があるフローがどのようなものかということです。 このシナリオを達成することは可能です:

今のところ、ステップ1とステップ2を正しく動作させるだけです。 step1とstep2を処理するために私はRegistrationControllerを持っています。 ステップ1では、ユーザーが導入した情報は、ユーザーがステップ2に進む200の場合は、 RegistrationController storeUserInfo()メソッドに対するajaxポスト要求を使用して検証されます。

ステップ2では、ユーザは支払い方法を選択し、「ステップ3に進む」で、 RegistrationController storePaymentMethods()に対するajaxリクエストを実行して、ユーザが少なくとも1つの支払い方法を選択したかどうかを確認する。 私の疑いは、このメソッドの後にコード200がどのようにプロセスがあるべきかを返すことです。

お支払い方法によっては、上記の適切なコード( お支払い情報を生成するコードまたはクレジットカードの請求コード )を実行する必要があります。

だから、コントローラとメソッドの面でこのコードをどのように整理するのか、選択した支払い方法に応じて実行するコードをどこに配置するのか、疑いの余地があります。 それを達成するためには、どのような流れが必要なのか分かりますか?

たぶん、アプローチはstorePaymentMethods()以下のようになる可能性がありますが、このメソッドではすべてが正しく行われていないようです。

public function storePaymentMethods(Request $request){
       $request->validate([
            'payment_method' => 'required',
        ]);

        if($request->payment_method == "references"){
          // generate codes and present to the user that codes
        }
        else if($request->payment_method == "credit_card"){
          // show credit card inputs to the user
          // and process the credit card payment with stripe
        }



        return response()->json([
            'success' => true,
            'message' => 'success',
            'payment_method' => $request->payment_method,
        ], 200);
    }

私が今持っている多段階フォームによる登録の流れの完全な要約:

だからstep1には、次のような形式があります:

<div>
    <form method="post" id="step1form" action="">
        {{csrf_field()}}
        <!-- fields of the step 1-->
        <input type="submit" href="#step2" id="goToStep2" class="btn next-step" value="Go to step 2"/>
    </form>
</div>

より良い説明のためのstep1画像:

ユーザが「ステップ2に進む」ボタンをクリックすると、データを検証するためのajaxリクエストが行われ、エラーがなければコード200が返され、ユーザはステップ2に進む。

$('#goToStep2').on('click', function (event) {
    event.preventDefault();
    var custom_form = $("#" + page_form_id_step1);
    $.ajax({
        method: "POST",
        url: '{{ route('conferences.storeRegistrationInfo', compact('id','slug') ) }}',
        data: custom_form.serialize(),
        datatype: 'json',
        success: function (data, textStatus, jqXHR) {
            var $active = $('.nav-pills li a.active');
            nextTab($active);
        },
        error: function (data) {    
            // show errors
        }
    });
});

ConferencesControllerには、上記のajaxリクエストを処理するstoreRegistrationInfo()があります:

public function storeRegistrationInfo(Request $request, $id, $slug = null, Validator $validator){  
    $rules = [];
    $messages = [];

    $rules["name_invoice"] = 'required|max:255|string';
    $rules["TIN_invoice"] = ['required', 'string', new ValidTIN()];

    $validator = Validator::make($request->all(), $rules, $messages);

    $errors = $validator->errors();
    $errors =  json_decode($errors);

    if($validator->fails()) {
        return response()->json([
            'success' => false,
            'errors' => $errors
        ], 422);
    }
    return response()->json([
        'success' => true,
        'message' => 'success'
    ], 200);
}

したがって、コード200が返された場合、ユーザーはstep2formに入ります。

<div>
    <form method="post" id="step2form" action="">
        {{csrf_field()}}
        <!-- fields of the step 2-->
         <input type="submit" href="#step3" id="goToStep3" class="btn next-step" value="Go to step 3"/>
    </form>
</div>

より良く説明するstep2イメージ:

ユーザーが「ステップ3に進む」ボタンをクリックすると、データを検証するためのajaxリクエストが行われ、エラーがなければコード200が返され、ステップ3に進みます。ajaxリクエスト:

$("#credit_card_section").hide();
$("#references_section").hide();

var page_form_id_step2 = "step2form";

    $('#goToStep3').on('click', function (event) {
        event.preventDefault();
        var custom_form = $("#" + page_form_id_step2);
        $.ajax({
            method: "POST",
            url: '{{ route('conferences.storePaymentMethods', compact('id','slug') ) }}',
            data: custom_form.serialize(),
            datatype: 'json',
            success: function (data, textStatus, jqXHR) {
                var result = data;
                if(result['payment_method'] == 'credit_card'){
                    $("#credit_card_section").show();
                    $("#references_section").hide();
                }else{
                    $("#references_section").show();
                    $("#credit_card_section").hide();
                }
                var $active = $('.nav-pills li a.active');
                nextTab($active);
            },
            error: function (data) {
               // show errors
            }
        });
    });

ConferenceControllerには上記のajaxリクエストを処理するstorePayment()があり、ユーザーが支払いメソッドを選択したかどうかを検証し、yesの場合はコード200返します。

public function storePaymentMethods(Request $request){
       $request->validate([
            'payment_method' => 'required',
        ]);
        return response()->json([
            'success' => true,
            'message' => 'success',
            'payment_method' => $request->payment_method,
        ], 200);
    }

次にstep3 divがあります。 step3 divでは、前の手順で選択したお支払い方法( クレジットカードまたは参照 )に応じてdiv #credit_card_section visibleまたは#references_section表示されます

<div>
    <form method="post" id="step3form" action="">
            {{csrf_field()}}
            <div id="credit_card_section">
                <!-- present necessary fields to
                payments with credit card-->
            </div>
              <div id="references_section">
        <!-- present generated reference to the user so he can pay-->
            </div>
    </form>
</div>

ステップ3のイメージをよく説明してください。支払い方法によっては、ステップ3で表示するのに必要な情報が異なります。 支払い方法がクレジットカードの場合は、クレジットカードによるstep4後の成功メッセージを示すstep4 divも表示されます。

次に、クレジットカードでの支払いが完了した後、成功メッセージが表示されるステップ4divがあります。

<div id="step4">
   <p>
   <i class="fa fa-plus" aria-hidden="true"></i>
   Payment and registration completed with  success.
   </p>
</div>

//私が今持っているRegistrationControllerのメソッドの再開、RegistrationControllerは私が多段階のフォームを扱うコントローラです

class RegistrationController extends Controller
{
    public :function storeQuantities(Request $request, $id, $slug = null){
        // method that stores in session the ticket types 
       // selected by the user in the conference details page
        Session::put('selectedRtypes', $selectedRtypes);
        Session::put('allParticipants' , $allParticipants);
        Session::put('customQuestions' ,  $selectedRtypes[$rtype->name]['questions']);

        // and then redirects the user to the registartion page registration.blade.php 
        // using the route 'conferences.registration
        // this route is associated with the displayRegistrationPage() method
        return redirect(route('conferences.registration',['id' => $id, 'slug' => $slug]));
    }


  // method of the route 'conferences.registration' that displays
 //  the registration.blade.php that is the page with the multi step form
    public function displayRegistrationPage(Request $request, $id, $slug=null){
        // get the session values
        $selectedRtypes =  Session::get('selectedRtypes');
        $allParticipants = Session::get('allParticipants');
        $customQuestions = Session::get('customQuestions');

   // redirect the user to the registration.blade.php
        if(isset($selectedRtypes)) {
            return view('conferences.registration',
                ['selectedRtypes' => $selectedRtypes, 'customQuestions' => $customQuestions, 'id' => $id, 'slug' => $slug]);
        }
        else{
            // return user to the conference details page
            return redirect(route('conferences.show',['id' => $id, 'slug' => $slug]));
        }
    }

   /* the following methods are to handle the registration
      multi step  form of the registration.blade.php view */

   // method to handle the step1 of the multi step form
    public function storeRegistrationInfo(Request $request, $id, $slug = null, Validator $validator){

        // get and validate the fields of the step1 
       // and returns code 200 if al is ok

        return response()->json([
            'success' => true,
            'message' => 'success'
        ], 200);
    }


   // method to handle the step2 of the multi step form
    public function storePaymentMethods(Request $request){

        // validate if the payment_method field was filled
        // if was filled return code 200 
        // and returns the payment_method 
        //so in the step 3 div is possible to show a section for
       // when the payment_method is credit card (#credit_card_section) 
          or transfers ("transfers_section")
        return response()->json([
            'success' => true,
            'message' => 'success',
            'payment_method' => $request->payment_method,
        ], 200);
    }
}

ステップ1のルート:

Route::post('/conference/{id}/{slug?}/registration/storeRegistrationInfo', [
    'uses' => '[email protected]',
    'as'   =>'conferences.storeRegistrationInfo'
]);

step2ルート:

Route::post('/conference/{id}/{slug?}/registration/storePaymentMethods', [
    'uses' => '[email protected]',
    'as'   =>'conferences.storePaymentMethods'
]);

明確な説明はありません。コードを整理する方法を自分で決定する必要があります。

支払いを担当するPHPコードをどこに配置するかを正確に選択できない場合は、両方の支払いの処理をPaymentsController.phpに配置します

したがって、支払い方法を選択した後で、データベースの注文のようなものを作成する必要があることは明らかです。

  1. 参照の場合、それらはこの順序に縛られなければならない。
  2. クレジットカードを使用する場合、支払いはこの注文と結び付けられます。




laravel