Laravel 5.3 - Omnipay Paypal Express 不返回成功消息

Posted

技术标签:

【中文标题】Laravel 5.3 - Omnipay Paypal Express 不返回成功消息【英文标题】:Laravel 5.3 - Omnipay Paypal Express not returning success message 【发布时间】:2017-07-03 22:22:33 【问题描述】:

我是 Laravel 的新手。几天来,我一直在努力在我的网站上实施 Paypal Express Checkout,以便向非营利组织捐款。感谢these explanations 我已经能够安装 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');

【问题讨论】:

嗨@mefimefi 谢谢你。我花了一整天的时间试图做一些他们说很难在我的 laravel 5.3.30 版本上安装omnipay/paypal 的事情。今天我终于成功破解了。首先在您的终端运行:composer require symfony/event-dispatcher:^2.8。之后在终端运行:composer require omnipay/paypal:"2.6.3"。当然,我的 paypal 版本是当前版本(您也可以将 composer require omnipay/paypal:*)。希望这可以帮助某人。 :) 我忘记了最后一个:composer require ignited/laravel-omnipay:"2.3.0",应该这样做。之后,您需要在 config/app.php中的 Service Provider: ` 'Ignite\LaravelOmnipay\LaravelOmnipayServiceProvider', 和 Alias: ` 'Omnipay' => 'Ignited\LaravelOmnipay\Facades\OmnipayFacade', > 【参考方案1】:

在创建网关参数时,您将 /donner 作为 returnUrl 传递,这是您的用户在完成 PayPal 快速登录和付款确认后返回的位置,因此 Laravel 会查看您不使用的 Route::get('donner'... 路由'没有,将其更改为 'returnUrl'=&gt;url('/payment_success'), 将使您的用户回到您的成功之路,并允许您提交 completePurchase 电话。

根据已编辑的问题和 cmets 编辑以获取更多详细信息:

如果成功完成 PayPal 登录和结帐屏幕,客户将返回您的returnUrl,如果出于某种原因退出该过程,他们会转到cancelUrl

在您的PaymentController@getSuccessPayment 方法中,paypal 将在查询字符串中发回tokenpayerID(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 的付款状态后将用户发送到该路由。

【讨论】:

感谢您的回答。我以为returnUrl只有在付款过程中出现问题时才使用。我的错。不过还是有一点不明白:如果returnUrl设置为固定参数,我怎么知道支付是否成功?我最初的意图是在成功的情况下重定向到一个 url (payment_success),在失败的情况下重定向到另一个 (payment_failure)。如何仅使用一个 returnUrl 来实现这一目标? @Mefimefi 检查我的问题的编辑(长话短说;一旦客户在if(isset($paypalResponse['PAYMENTINFO_0_ACK']) &amp;&amp;... 线上回复您,您就已经在检查付款是否成功)。 另一个提示; Google prefers 我们在 URL 中使用 - 而不是 _,现在值得养成这个习惯! 感谢您的详细解释 - 以及额外的提示。我终于明白了这个库是如何工作的!

以上是关于Laravel 5.3 - Omnipay Paypal Express 不返回成功消息的主要内容,如果未能解决你的问题,请参考以下文章

Omnipay - 使用 Paypal Express 结帐 Laravel

使用 laravel 5.1 安装 Omnipay/payu

Omnipay 贝宝与 laravel 4 的集成

使用 Laravel Omnipay(mollie 网关)进行支付

使用 Omnipay 将 PayPal REST API 集成到 Laravel - 需要 card 参数

使用omnipay 通过securepay 处理时出现无效指纹异常