【问题标题】:Sending data of ajax by another ajax to controller in laravel通过另一个ajax将ajax的数据发送到laravel中的控制器
【发布时间】:2018-05-24 10:04:26
【问题描述】:

我想知道是否可以通过另一个 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 代码,即使我试图在 catch 部分关闭后获取它们,同样的事情发生错误

问题

  1. 如何在控制器中获取结果?

我需要使用该结果更新我的数据库。

谢谢。

【问题讨论】:

  • 我认为这里的主要问题是“为什么我的控制器在我编辑代码时会出错?”。您能否向我们展示您对try { .. 代码进行了哪些编辑以及遇到了哪些错误?另外,payment-form 正在由您的 JS 提交,它会将数据发送到哪里?
  • @user1491032 我在try $status_message ="$request-&gt;input('status_message'); dd($status_message); 中尝试过这个,这与我在on success 代码中附加的隐藏输入有关(当没有工作时,我将其删除为我的默认输入)问题),payment-form is being submitted by your JS, where does it send the data 它将数据发送到第三方网站,例如 PayPal,但本地网站。
  • ... ="$request ...中丢失"
  • 此代码看起来只是从您的服务器请求一个令牌,然后将其发送到snap.pay,如果成功则提交付款表单。你还想让它做什么?
  • " 这是我在这里输入的错误,for answering your second comment 我想在我的控制器中得到on success 的结果,这就是我想要的。 (我需要在控制器中传递它们。

标签: javascript php ajax laravel


【解决方案1】:

据我所知,您有两个选择。

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

选项 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

&lt;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 */ }

 }

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 2021-12-31
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2014-04-26
    相关资源
    最近更新 更多