Здравствуйте, я пытался интегрировать PayPal с корзиной покупок для моего сайта, используя Omnipay PayPal с Laravel 4. Я в основном использовал ЭТОТ учебник до сих пор.
Я все еще на начальных этапах, но я столкнулся с проблемой. Когда я пытаюсь оформить заказ, я получаю сообщение об ошибке «Требуется параметр количества».
Я немного новичок, поэтому я могу делать что-то глупое, но если я жестко закодирую сумму (то есть: ‘цена’ => 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()}}
Форма может показаться немного запутанной, но все значения хорошо отображаются в форме перед отправкой.
Спасибо за любую помощь.
Если вы внимательно изучите учебник, то увидите, что 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));
в виде лезвия,
....
{{ Form::hidden('product',$product->name) }}
{{ Form::hidden('description',$product->description) }}
....
.. скоро
Других решений пока нет …