Выбрать массив блейдов как json строка из laravel блейда до ajax после запроса - PullRequest
0 голосов
/ 07 февраля 2020

Я действительно новичок в реализации Ajax в Laravel Интеграция лезвий и razorpay. Я отправил информацию о продукте из функции контроллера bill по почте на страницу оплаты. После успешной оплаты я хочу отправить сведения о продукте в функцию dopayment и сохранить детали заказа в бэкэнд. Когда я пытаюсь отправить детали, либо получаю ошибку $ products, я получаю, что htmlspecialchars () ожидает, что параметр 1 будет строка, массив, заданный, когда я положил $product направленно в ajax данные или неверный аргумент для foreach в Laravel для json ответа, когда я кодирую $ product с помощью json_encode($product) и отправляю его в данные ajax.

счет функции контроллера

public function bill(Request $request){

            $input = $request->all();

            return view('cart/checkout')->with('product' , $request->product)
                              ->with('subtotal' , round($request->subtotal));
        }

функция доплаты

public function dopayment(Request $request) {
            //Input items of form
            $input = $request->all();

            $product = $request->product;

            //if i use foreach here i get the error invalid argument suppy for foreach

            print_r($product);
            exit;
        }

страница просмотра

@extends('app.app')

@section('content')

<div id="main-content">

    <div class="container clear">
        <div class="panel-body" style="border: 1px solid #ddd;">
            <form id="rzp-footer-form" action="{!!route('dopayment')!!}" method="POST" style="width: 100%; text-align: center" >
                @csrf

                <a href="#">
                    <img src="{{asset('/img/amcor.JPG')}}" />
                </a>    
                <br/>
                <p><br/>Price: {{ $subtotal }} INR </p>
                <input type="hidden" name="amount" id="amount" value="{{ $subtotal }}"/>
                <div class="pay">
                    <button class="razorpay-payment-button btn filled small" id="paybtn" type="button">Pay with Razorpay</button>                        
                </div>
            </form>
            <br/><br/>
            <div id="paymentDetail" style="display: none">
                <center>

                    @foreach($product as $input => $details)
                    <input type="text" id="name" name="name" value="{{ json_decode($details)->name}}">
                    @endforeach
                    <div>paymentID: <span id="paymentID" name="txn_id"></span></div>
                    <div>paymentDate: <span id="paymentDate" name="date"></span></div>

                </center>
            </div>
        </div>

    </div>
</div>

<script>
    $('#rzp-footer-form').submit(function (e) {
        var button = $(this).find('button');
        var parent = $(this);
        button.attr('disabled', 'true').html('Please Wait...');
        $.ajax({
            method: 'get',
            url: this.action,
            data: $(this).serialize(),
            complete: function (r) {
                console.log('complete');
                console.log(r);
            }
        })
        return false;
    })
</script>

<script>
    function padStart(str) {
        return ('0' + str).slice(-2)
    }

    function demoSuccessHandler(transaction) {
        // You can write success code here. If you want to store some data in database.
        $("#paymentDetail").removeAttr('style');
        $('#paymentID').text(transaction.razorpay_payment_id);
        var paymentDate = new Date();
        $('#paymentDate').text(
                padStart(paymentDate.getDate()) + '.' + padStart(paymentDate.getMonth() + 1) + '.' + paymentDate.getFullYear() + ' ' + padStart(paymentDate.getHours()) + ':' + padStart(paymentDate.getMinutes())
                );

        $.ajax({
            method: 'post',
            url: "{!!route('dopayment')!!}",
            dataType:"json",
            data: {
                "_token": "{{ csrf_token() }}",
                "product": "{{ json_encode($productcode,JSON_FORCE_OBJECT) }}",
                "Company": "{{ $company}}",
                "Address": "{{$address}}",
                "Contact": "{{$contact}}",
                "razorpay_payment_id": transaction.razorpay_payment_id
            },
            complete: function (r) {
                console.log('complete');
                console.log(r);
            }
        })
    }
</script>
<script>
    var options = {
        key: "{{ env('RAZORPAY_KEY') }}",
        amount: '{{ $subtotal}}00',
        name: 'AMCOR RAZORPAY',
        description: 'AMCOR INTERNATIONAL',
        image: 'https://i.imgur.com/n5tjHFD.png',
        handler: demoSuccessHandler
    }
</script>
<script>
    window.r = new Razorpay(options);
    document.getElementById('paybtn').onclick = function () {
        r.open()
    }
</script>

@endsection

функции маршрутов

Route::post('bill', 'RazorpayController@bill')->name('pay');
Route::post('dopayment', 'RazorpayController@dopayment')->name('dopayment');

1 Ответ

0 голосов
/ 07 февраля 2020

Ajax автоматически преобразует данные в JSON (проверьте детали на консоли)

Поэтому, когда вы получаете на dopayment(), вам нужно декодировать данные JSON в массив, чтобы вы можно через него oop: $product = json_decode($request->product, true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...