2017-02-15 92 views
1

我是Laravel新手。我一直在努力在我的网站上实施Paypal Express Checkout几天,以便为非营利组织捐款。感谢these explanations我已经能够安装Omnipay,让用户输入他想要捐赠的金额并转到Paypal。 但是,当我尝试结束交易(付款)时,我没有重定向到我的成功消息。我的沙箱帐户也没有显示任何交易,所以看起来付款没有正确完成。我猜有什么毛病我的“getSuccessPayment”的功能,但我无法弄清楚它是什么......Laravel 5.3 - Omnipay Paypal Express不回复成功消息

这里是我的控制器至今:

<?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' => '[email protected]']); 

Route::get('payment_success', '[email protected]'); 

Route::get('payment_failure', '[email protected]'); 
+0

嗨@mefimefi谢谢你。我花了整整一天的时间尝试做一些他们说在我的版本的laravel 5.3.30上安装omnipay/paypal很困难的事情。我终于设法今天破解它。首先在你的终端中运行:'composer需要symfony/event-dispatcher:^ 2.8'。之后在终端运行:'composer require omnipay/paypal:“2.6.3”'。当然,我的贝宝版本是当前版本(你也可以把作曲家需要omnipay/paypal:*)。希望这有助于某人。 :) – Matija

+0

我忘了最后一个:'作曲家需要点燃/ laravel-omnipay:“2.3.0”'那就应该这样做。之后你需要服务提供者:''Ignited \ LaravelOmnipay \ LaravelOmnipayServiceProvider','和别名:''Omnipay'=>'Ignited \ LaravelOmnipay \ Facades \ OmnipayFacade','in * config/app.php * – Matija

回答

0

当创建你传递/donner作为returnUrl你的网关参数,这是你的用户完成PayPal快速登录并确认付款后回到这样Laravel看起来Route::get('donner'...航线w ^如果您没有,将其更改为'returnUrl'=>url('/payment_success'),将使您的用户回到您的成功路线,并允许您提交completePurchase电话。基于编辑的问题和意见进行进一步的细节

编辑:

客户返回到您的returnUrl如果成功完成了贝宝和检验登录的画面,他们去cancelUrl如果出于某种原因,他们退出处理。

在你[email protected]方法,PayPal将在查询字符串返回一个tokenpayerID(www.example.com/payment_success?token=EC-12345 & PayerID = ABC123,omnipay,支付宝会自动拿起这在completePurchase呼叫时,你在哪里,有效使用PayPal确认客户正确完成结帐,而且交易成功。

为了避免混淆,我想你目前Route::get('payment_success', '[email protected]');路线重命名为类似Route::get('complete_payment', '[email protected]');并创建一个新payment_success路由在用PayPa确认付款状态后,用户才会被发送到湖

+0

感谢您的支持回答。我认为returnUrl只在付款过程中发生问题时才使用。我的错。尽管如此,还是有一些我不明白的地方:如果将returnUrl设置为固定参数,我怎么知道付款是否成功?我最初的意图是在成功(payment_success)的情况下重定向到一个url,并在失败的情况下(payment_failure)重定向到另一个url。我怎么才能实现只有一个returnUrl? – Mefimefi

+0

@Mefimefi检查我的问题的编辑(长话短说;你已经检查付款是否成功,一旦客户回到你身边的if(isset($ paypalResponse ['PAYMENTINFO_0_ACK'])&& ... ''line) – cfreear

+0

另一个提示:Google [更喜欢](https://support.google.com/webmasters/answer/76329?hl=zh-CN)我们在URL中使用''-''而不是'_'' ,现在值得养成这种习惯! – cfreear