金额参数是必需的 - Omnipay paypal与laravel

时间:2015-02-01 04:01:29

标签: php laravel paypal omnipay

您好我一直在尝试使用Omnipay paypal和Laravel 4将paypal与我的网站的购物车集成。到目前为止,我主要使用THIS教程。

我还处于初级阶段,但我遇到了麻烦。当我尝试结账时,我收到一条错误,上面写着“需要金额参数”。

我有点像菜鸟,所以我可能会做一些愚蠢的事情,但如果我硬编码(即:'price'=> 25.00),那么它可以正常工作。解密和货币也都从数据库中提取并发送到paypal页面。我在这里发现的问题似乎没有人动态地将数据提取到控制器,所以也许我做错了什么?

这是我的控制器的相关部分:

<?php 
use Omnipay\Omnipay; 

class PaymentController extends Controller { 

     public function postPayment() { 

        $params = array( 
            'cancelUrl' => 'http://localhost/cancel_order', 
            'returnUrl' => 'http://localhost/payment_success', 
            'name'  => Input::get('name'), 
            'description' => Input::get('description'), 
            'price' => Input::get('price'), 
            'currency' => Input::get('currency') ); 

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

            Session::save(); 

            $gateway = Omnipay::create('PayPal_Express'); 

            $gateway->setUsername('my username'); 

            $gateway->setPassword('my pass'); 

            $gateway->setSignature('my signature'); 

            $gateway->setTestMode(true); 



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

这是我的购物车结帐按钮:

          {{ Form::open([ 'url' => 'pay_via_paypal', 'method' => 'post'  ]) }}
            {{Form::hidden('product',Product::find($productID)->name)}}
            {{Form::hidden('description',Product::find($productID)->description)}}
            {{Form::hidden('amount',Product::find($productID)->price)}}  
            {{Form::hidden('currency',Product::find($productID)->currency)}}
            {{Form::submit('CHECKOUT')}}
          {{Form::close()}}

表单可能看起来有点令人困惑,但在我提交之前,表单上的值都显示正常。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

如果仔细查看教程,您会看到有index()函数负责生成表单。以及处理表单提交的postPayment()函数。

在index()函数(在教程中)

hello.blade.php中的

有一个名为price

的参数
<input type="hidden" value="{{ $price }}" name="price" />

在你的情况下

{{ Form::hidden('amount',Product::find($productID)->price) }}  

应替换为

{{ Form::hidden('price',Product::find($productID)->price) }}  

然后,当您提交表单时,它将路由到postPayment()函数,此处Route::post('pay_via_paypal', 'PaymentController@postPayment');此路由应位于您的route文件中

postPayment()函数中,

$params = array( 
        'cancelUrl' => 'http://localhost/cancel_order', 
        'returnUrl' => 'http://localhost/payment_success', 
        'name'  => Input::get('name'), 
        'description' => Input::get('description'), 
        // you dont need this price parameter ('price' => Input::get('price'),) 
        'amount' => Input::get('price'), // add amount parameter which is required in paypal.
        'currency' => Input::get('currency') ); 

仅供注意,

  

您反复使用Product::find($productID)这不是一个好习惯,如果您将该产品转换为Object变量,那么您可以使用该对象而不重复Product::find($productID)

为此,您可以将object从控制器

传递到刀片视图

$product = Product::find($productId);
return View::make('hello')->with(Array("product" => $product));
<\ n>在刀片视图中,

....

{{ Form::hidden('product',$product->name) }}
{{ Form::hidden('description',$product->description) }}

....

..等等