Some bookings have problem when customer paid using Payone wallet method (paypal)

311 Views Asked by At

I have implemented the Payone payment gateway (Creditcard, Sofort, Paydirect and Paypal) successfully. After successful payment I am getting txaction response (appointed and paid) and everything is fine. But sometimes I am not getting response from Payone after customer paid using Paypal(I checked around 60 successful transactions. But in that 2 or 3 transactions are not got response and the customer's amount has been deducted from their account).

After successful transaction payone is posting data in to this route

/* Response from payone */
    Route::post('/payment/response', 'PaymentController@response')->name('payment.response');

I think laravel request is not capturing data from url. or There is something wrong to using this method Schema::hasColumn.

Any help would be appreciated thanks.

PaymentController.php

public function response(Request $request)
{
  // Here I created to store all request in to table but data is not storing.
  /* Testing purpose begin */

   $payment        = new Payment;

   foreach($_POST as $key => $value) {
     if(Schema::hasColumn($payment->getTable(), $key)){
        if(is_array($value)) {
           $payment->{$key} = $value[1];
        } else {
                $payment->{$key} = $value;
                }
      }
    }
    $payment->save();

  /* Testing purpose end */

  if ($_POST["key"] == hash("md5", env('KEY'))) {

      echo "TSOK"; // If key is valid, TSOK notification is for PAYONE

      $user  = Userlist::where('is_delete', 0)
                ->where('usrActive', '1')
                ->where('userid', $_POST["userid"])
                ->first();
      if($user && $_POST["clearingtype"] && $_POST["txaction"]) {
         $bookings            = Booking::select('_id', 'old_booking_id', 'status', 'payment_status')
                    ->where('user', new \MongoDB\BSON\ObjectID($user->_id))
                    ->whereIn('status', ['5', '8', '10', '11'])  //5=>Waiting for payment, 8=>Cart, 10=> Temporary (This status is using in edit booking section), 11=> On processing
                    ->where('is_delete', 0)
                    ->where('txid', $_POST["txid"])
                    ->where('userid', $_POST["userid"])
                    ->get();

         if($bookings) {
            if ($_POST["txaction"] == "appointed") {
               update booking status and sent email
            }
            else if ($_POST["txaction"] == "paid") {
               update paid status
            }
            else {
               update failed status
            }
         }    
      }
  }
}

laravel log

[2018-09-11 09:04:14] production.ERROR: Method [error] does not exist on [App\Http\Controllers\PaymentController]. {"userId":"5afa790212236cc4660ed509","exception":"[object] (BadMethodCallException(code: 0): Method [error] does not exist on [App\\Http\\Controllers\\PaymentController]. at /var/www/vhosts/cabin-holiday.frontend/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:68)

3

There are 3 best solutions below

0
On

The solution for this issue is to change the method it should be get method. Because we are getting response from the paypal in url. So you need to set the GET method.

/* Response from payone */
Route::get('/payment/response', 'PaymentController@response')->name('payment.response');
0
On

Finally found the issue. Reason for this issue is sometimes response data like address, city etc are not getting in correct format (Users are from Germany). So I strictly converted the response data in to UTF-8 format and stored important data in to database.

0
On

Method [error] does not exist on [App\Http\Controllers\PaymentController].

Write error method on the PaymentController. Try to find documentation on error method mentioned somewhere in your payment gateway documentation. And read when it is called and why. So that you will get idea of what to handle in error method in PaymentController. You might have to declare route or may be it is already there in your routes since it is not complaining about route but method. Hope this helps you.