在另一个ajax中将ajax的数据发送到laravel

时间:2018-05-23 00:06:45

标签: javascript php ajax laravel

我想知道是否可以通过另一个ajax从一个ajax发送数据?

我知道这听起来很混乱,但这是解释:

我有付款方式,它获取数据并通过Ajax处理它们(不幸的是,这个API的创建者限制了他们的代码)所以即使我尝试在控制器代码中添加输入请求Ajax什么都行不通,这就是为什么我需要制作另一个Ajax来处理输入请求。

让我们通过代码解释更多:

controller

public function orderspayonline(Request $request, $id){
        error_log('masuk ke snap token dri ajax');
        $midtrans = new Midtrans;
        //products data + user info etc.

        //here magic happens
        try
        {
            $snap_token = $midtrans->getSnapToken($transaction_data);
            echo $snap_token;
        } 
        catch (Exception $e) 
        {   
          return $e->getMessage;
        }
    }

如果我在try{部分添加任何内容(我的意思是什么),它将停止运行并返回错误! `甚至我试图重新定向我的用户,除了回显给出错误的令牌代码。 所以看来我真的没有任何选择,只能创建新的功能和Ajax

JavaScript

<script type="text/javascript">
  $('.pay-button').click(function (event) {

    $.ajaxSetup({
        headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }
      });
    event.preventDefault();
    // $(this).attr("disabled", "disabled");
    var prdfoId = $(this).data('id');
        $.ajax({
          url: '{{url("orderspayonline")}}/'+encodeURI(prdfoId),
          type: "POST",
          cache: false,

          success: function(data) {
            var resultType = document.getElementById('result-type');
            var resultData = document.getElementById('result-data');

            function changeResult(type,data){
              $("#result-type").val(type);
              $("#result-data").val(JSON.stringify(data));
            }

            snap.pay(data, {
              onSuccess: function(result){
                changeResult('success', result);
                console.log(result.status_message);
                console.log(result);
                $("#payment-form").submit();
              },
              onPending: function(result){
                changeResult('pending', result);
                console.log(result.status_message);
                $("#payment-form").submit();
              },
              onError: function(result){
                changeResult('error', result);
                console.log(result.status_message);
                $("#payment-form").submit();
              }
            });
          }
        });
    });
</script>

我需要操纵的部分是snap.pay(data, {,结果会回来。

目前,他们在控制台中返回,并在我的控制器中echo $snap_token;结果消失。 我试图将它们隐藏在输入中,但正如我所提到的,我无法获得结果,因为我无法更改try代码,即使我尝试在{{1}之后获取它们部分关闭,同样的事情发生错误

问题

  1. 如何在控制器中获得结果?
  2. 我需要使用该结果更新我的数据库。

    感谢。

1 个答案:

答案 0 :(得分:0)

从我所看到的,你有两个选择。

  1. snap.pay函数
  2. 中添加另一个客户端AJAX调用
  3. payment-form的提交重定向到您自己的应用,然后从服务器端进行提交。
  4. 选项1:

    function serverSubmit(d) {
        $.ajaxSetup({
            headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }
        });
    
        $.ajax({
          url: '{{url("newroute")}}',
          type: "POST",
          cache: false,
          data: d
         });
    };
    

    然后修改snap.pay以提交,例如

    snap.pay(data, {
        onSuccess: function(result){
            changeResult('success', result);
            console.log(result.status_message);
            console.log(result);
            serverSubmit(result); // <----------
            $("#payment-form").submit();
        }
        ...
    

    如果数据敏感,您可能需要对数据进行加密,如果没有从serverSubmit获得成功结果,您可能希望决定不提交表单。您可能还想提交result之外的补充数据,但这只是一个开始。

    选项2

    <form id="payment-form... action更改为{{url('newroute')}}

    在您的控制器中添加新方法并将post newroute映射到该方法。

    public function new_method(Request $request)
    {
          $data = $request->validate(...);
          YourModel::create($data); //however you want to save it
    
          $url = 'old_form_submit_URL';
    
          $options = array(
              'http' => array(
                  'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                   'method'  => 'POST',
                   'content' => http_build_query($data)
              )
          );
    
          $context  = stream_context_create($options);
          $result = file_get_contents($url, false, $context);
    
          if ($result === FALSE) { /* There was an error */ }
    
     }