从控制器提交 POST 数据

Submit POST data from controller

我正在尝试实施 Payhere 支付网关(位于斯里兰卡的本地网关)。根据他们的文档,我们可以提交如下数据。

<html>
<body>
<form method="post" action="https://sandbox.payhere.lk/pay/checkout">   
    <input type="hidden" name="merchant_id" value="121XXXX">    <!-- Replace your Merchant ID -->
    <input type="hidden" name="return_url" value="http://sample.com/return">
    <input type="hidden" name="cancel_url" value="http://sample.com/cancel">
    <input type="hidden" name="notify_url" value="http://sample.com/notify">  
    <br><br>Item Details<br>
    <input type="text" name="order_id" value="ItemNo12345">
    <input type="text" name="items" value="Door bell wireless"><br>
    <input type="text" name="currency" value="LKR">
    <input type="text" name="amount" value="1000">  
    <br><br>Customer Details<br>
    <input type="text" name="first_name" value="Saman">
    <input type="text" name="last_name" value="Perera"><br>
    <input type="text" name="email" value="samanp@gmail.com">
    <input type="text" name="phone" value="0771234567"><br>
    <input type="text" name="address" value="No.1, Galle Road">
    <input type="text" name="city" value="Colombo">
    <input type="hidden" name="country" value="Sri Lanka"><br><br> 
    <input type="submit" value="Buy Now">   
</form> 
</body>
</html>

这将重定向到 url“https://sandbox.payhere.lk/pay/checkout”并打开一个提交卡详细信息的窗口。

但我想要做的是,从没有视图的控制器发送相关的 POST 数据(与上面的功能相同,但在数据库插入完成后通过控制器发送)

关于如何执行此操作的任何建议。我试过使用 HTTP 客户端,但由于上面的网关重定向到外部 url 并弹出一个正在收集数据的 window。


    $client = new GuzzleHttp\Client();
    $response = $client->request('POST', 'https://sandbox.payhere.lk/pay/checkout', [
        'form_params' => [
            "merchant_id" => '1218XXX',
            "return_url" => route('admin.dashboard'),
            "cancel_url" => 'key-app.test',
            "notify_url" => route('notify'),
            "order_id" => '1',
            "items" => 'Test',
            "currency" => 'LKR',
            "amount" => '50.00',
            "first_name" => 'Arafath',
            "last_name" => 'a',
            "email" => 'mhmaarafath@gmail.com',
            "phone" => '0765245237',
            "address" => 'Mount Lavinia',
            "city" => 'Colombo',
            "country" => 'Sri Lanka',

        ]
    ]);
    return redirect('https://sandbox.payhere.lk/pay/checkout');

首先,您不能在此处发出 Guzzle 请求,因为您需要在此处打开一个新的 window。 (您可以使用 HTTP client 代替 Guzzle)

你可以做如下的事情来完成你的要求

  1. 从控制器内部的数据库中获取所有相关数据,然后 return 包含该数据的视图,其中该视图具有 payhere 表单,您可以使用 css 隐藏该表单。 payhereCheckout ()

  2. 现在通过 JQuery 或 JS 提交表格。您只需通过 JS 或 JQuery 单击表单提交按钮即可。 只需放置一个小型加载器或其他可以向用户显示服务器正在处理请求的东西

我将提供一些实现此目的所需的代码。我没有在 PayHere 中使用过这个过程,但是 SL 中的所有支付网关都使用表单提交。所以这个过程应该 same.Here 是示例代码。

控制器

  class PayHereChekoutControler extends Controller
  {
   public function payhereCheckout () {

      $userData = UserDataModel::find(Auth::id());

      $email = $userData->email;
      $firstName = $userData->first_name;
      //Other required paramas here or just pass the collection to view and get the required feilds there.

      return view('payhere_hidden_checkout', compact(
        'first_name',
        'email',
      ));
   }

 }

web.php

Route::get('payhere-payment,'[PayHereChekoutControler::class, 'payhereCheckout']);

payhere_hidden_checkout.blade.php

<form id="payhere" style="display:none" method="post" action="https://sandbox.payhere.lk/pay/checkout">   
   
    <input type="text" name="first_name" value="{{$first_name}}">
    <input type="text" name="email" value="{{$email}}">
    <input type="submit" value="Buy Now">  

</form> 

<script>
    $(document).ready(function () { // Now the DOM is ready
        //Start loader or something here. You don't need to hide the loader because once form submitted it will redirect to payhere
        setTimeout(() => {
            $('form#payhere').submit();
        }, 500)
    });
</script>

I have not used this for Payhere but I have implemented this to WEBXPAY. Both the gateways use same process.

希望这会成为您要求的场景。