Laravel 5.3 - Omnipay Paypal Express не возвращает сообщение об успехе

Я новичок в Ларавеле. Несколько дней я пытался внедрить Paypal Express Checkout на своем веб-сайте, чтобы сделать пожертвования некоммерческой организации. Благодаря этим объяснениям я установить Omnipay, позволить пользователю ввести сумму (суммы), которую он хочет пожертвовать, и перейти в Paypal. Но когда я пытаюсь завершить транзакцию (оплатить), я не перенаправляюсь на сообщение об успешном завершении. В моем аккаунте в песочнице также не отображаются транзакции, поэтому кажется, что платеж не был завершен правильно. Я предполагаю, что что-то не так с моей функцией "getSuccessPayment", но я не могу понять, что это такое...

Вот мой контроллер:

<?php namespace App\Http\Controllers;
use Omnipay\Omnipay;
use Session;
use App\Http\Requests\PaymentRequest;

class PaymentController extends Controller {

    public function postPayment(PaymentRequest $request)
    {
        $price = $request->get('price');

        $items[] = array('name' => 'Don', 'quantity' => 1, 'price' => $price);

        $params = array(
            'cancelUrl'=>url('/donner'),
            'returnUrl'=>url('/payment_success'),
            'amount' =>  $price,
            'currency' => 'EUR'
        );

        Session::put('params', $params);
        Session::save();

        $gateway = Omnipay::create('PayPal_Express');
        $gateway->setUsername('my sandbox email'); 
        $gateway->setPassword('my sandbox password');  
        $gateway->setSignature('my sandbox signature');
        $gateway->setTestMode(true);

       $response = $gateway->purchase($params)->setItems($items)->send();

        if ($response->isSuccessful()) {
            print_r($response);
        } elseif ($response->isRedirect()) {
            $response->redirect();
        } else {
            echo $response->getMessage();
        }
    }

     public function getSuccessPayment()
    {

        $gateway = Omnipay::create('PayPal_Express');
        $gateway->setUsername('my sandbox email'); 
        $gateway->setPassword('my sandbox password');  
        $gateway->setSignature('my sandbox signature');
        $gateway->setTestMode(true);

        $params = Session::get('params');
        $response = $gateway->completePurchase($params)->send();
        $paypalResponse = $response->getData(); 

        if(isset($paypalResponse['PAYMENTINFO_0_ACK']) && $paypalResponse['PAYMENTINFO_0_ACK'] === 'Success') {
            return redirect('/payment_success');

        } else {
            //payment fails
        return redirect('/payment_failure');

        }
    }
}
?>

И мои маршруты:

Route::post('donner',
    ['as' => 'payment', 'uses' => 'PaymentController@postPayment']);

Route::get('payment_success', 'PaymentController@getSuccessPayment');

Route::get('payment_failure', 'PaymentController@getSuccessPayment');

person Mefimefi    schedule 15.02.2017    source источник
comment
Привет, @mefimefi, спасибо за это. Я провел целый день, пытаясь сделать то, что, по их словам, было сложно установить omnipay/paypal на мою версию laravel 5.3.30. Сегодня мне наконец удалось взломать его. Сначала в вашем терминале запустите: composer require symfony/event-dispatcher:^2.8. после этого запустите в терминале: composer require omnipay/paypal:"2.6.3". Конечно, моя версия PayPal является текущей (вы также можете указать composer require omnipay/paypal:*). Надеюсь, это поможет кому-то. :)   -  person Matija    schedule 14.03.2017
comment
Я забыл последнее: composer require ignited/laravel-omnipay:"2.3.0" и это должно сработать. После этого вам нужно указать поставщика услуг: ` 'Ignited\LaravelOmnipay\LaravelOmnipayServiceProvider',` и псевдоним: ` 'Omnipay' =› 'Ignited\LaravelOmnipay\Facades\OmnipayFacade',` в config/app.php   -  person Matija    schedule 14.03.2017


Ответы (1)


При создании параметров шлюза вы передаете /donner как returnUrl, именно сюда ваши пользователи возвращаются после завершения экспресс-логина PayPal и подтверждения оплаты, поэтому Laravel будет выглядеть Route::get('donner'... маршрутом, которого у вас нет, изменение этого параметра на 'returnUrl'=>url('/payment_success'), приведет к ваши пользователи вернутся к вашему маршруту успеха и позволят вам отправить вызов completePurchase.

Изменить для получения дополнительной информации на основе отредактированного вопроса и комментариев:

Клиенты возвращаются в ваш returnUrl, если они успешно завершают экраны входа в PayPal и оформления заказа, они переходят в cancelUrl, если по какой-либо причине они прекращают процесс.

В вашем методе PaymentController@getSuccessPayment PayPal отправит обратно token и payerID в строке запроса (www.example.com/payment_success?token=EC-12345&PayerID=ABC123, omnipay-paypal автоматически уловит это в вызове completePurchase, где вы являются эффективным подтверждением для PayPal того, что покупатель правильно завершил оформление заказа и что транзакция прошла успешно.

Чтобы избежать путаницы, я бы переименовал ваш текущий маршрут Route::get('payment_success', 'PaymentController@getSuccessPayment'); во что-то вроде Route::get('complete_payment', 'PaymentController@getCompletePayment'); и создал новый маршрут payment_success, на который перенаправляется пользователь после того, как вы подтвердите статус платежа в PayPal.

person cfreear    schedule 16.02.2017
comment
Спасибо за Ваш ответ. Я думал, что returnUrl используется только тогда, когда возникают проблемы во время оплаты. Моя ошибка. Однако я все еще кое-что не понимаю: если returnUrl задан как фиксированный параметр, как я могу узнать, прошел ли платеж успешно? Моим первоначальным намерением было перенаправить на один URL-адрес в случае успеха (payment_success) и на другой в случае неудачи (payment_failure). Как я могу добиться этого только с одним returnUrl? - person Mefimefi; 16.02.2017
comment
@Mefimefi проверьте редактирование моего вопроса (короче говоря, вы уже проверяете, прошел ли платеж успешно, когда клиент возвращается к вам в строке if(isset($paypalResponse['PAYMENTINFO_0_ACK']) &&...). - person cfreear; 18.02.2017
comment
Еще один совет; Google предпочитает использовать - вместо _ в URL-адресах. теперь в привычке! - person cfreear; 18.02.2017
comment
Спасибо за подробное объяснение и дополнительный совет. Наконец-то я понял, как работает эта библиотека! - person Mefimefi; 20.02.2017