我在请求表单After payment paypal的存储数据上有问题。这是我的错误
SQLSTATE[23000]:违反完整性约束:1048列"fullname_ship"不能为null(SQL:插入到
orders
(subtotal
,shipping
、fullname_ship
、updated_at
、created_at
)值(10,1,2016-05-09 15:39:40,2016-05-0915:39:40atr)
型号订单.PHP
<?php
namespace dixard;
use Illuminate'Database'Eloquent'Model;
class Order extends Model
{
protected $table = 'orders';
protected $fillable = [
'subtotal',
'shipping',
'fullname_ship',
];
}
结账页面-ORDER-DETAIL.PHP
<form class="login" method="post" action="{{url('payment')}}">
{{csrf_field()}}
<div class="checkout-wrapper">
<div class="container">
<div class="text-alert">
<p>Returning customer? <a href="#">Click here to login</a></p>
</div><!-- /.text-alert -->
<div class="row">
<div class="col-md-6">
<h2>Fatturazione</h2>
<fieldset id="billinfo">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="fullname_ship">Nome e cognome<sup>*</sup></label>
<input type="text" class="form-control dark" id="fullname_ship" placeholder="Nome" name="fullname_ship" >
</div><!-- /.form-group -->
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="address_shipping">Indirizzo <sup>*</sup></label>
<input type="text" class="form-control dark" id="address_shipping" placeholder="Via/Piazza/Viale" >
</div><!-- /.form-group -->
</div>
<div class="col-md-6">
<div class="form-group">
<label for="address2_shipping">Interno/Scala <sup>*</sup></label>
<input type="text" class="form-control dark" id="address2_shipping" placeholder="ScalaA/Interno:11" >
</div><!-- /.form-group -->
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="province_shipping">Provincia<sup>*</sup></label>
<input type="text" class="form-control dark" id="province_shipping" placeholder="Roma,Milano,ecc" >
</div><!-- /.form-group -->
</div>
<div class="col-md-6">
<div class="form-group">
<label for="country_shipping">Paese<sup>*</sup></label>
<input type="text" class="form-control dark" id="country_shipping" placeholder="Paese" value="" >
</div><!-- /.form-group -->
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="email_shipping">Email<sup>*</sup></label>
<input type="text" class="form-control dark" id="email_shipping" placeholder="Email" value="{{Auth::user()->email}}" >
</div><!-- /.form-group -->
</div>
<div class="col-md-6">
<div class="form-group">
<label for="phone_shipping">Cellulare<sup>*</sup></label>
<input type="text" class="form-control dark" id="phone_ship" placeholder="Telefono/Cellulare" name="phone_ship" >
</div><!-- /.form-group -->
</div>
</div>
</fieldset>
<form>
PAYPALCONTROLLER.PHP
<?php
namespace dixard'Http'Controllers;
use Illuminate'Http'Request;
use dixard'Http'Requests;
use dixard'Http'Controllers'Controller;
use Illuminate'Foundation'Bus'DispatchesCommands;
use Illuminate'Routing'Controller as BaseController;
use Illuminate'Foundation'Validation'ValidatesRequests;
use PayPal'Rest'ApiContext;
use PayPal'Auth'OAuthTokenCredential;
use PayPal'Api'Amount;
use PayPal'Api'Details;
use PayPal'Api'Item;
use PayPal'Api'ItemList;
use PayPal'Api'Payer;
use PayPal'Api'Payment;
use PayPal'Api'RedirectUrls;
use PayPal'Api'ExecutePayment;
use PayPal'Api'PaymentExecution;
use PayPal'Api'Transaction;
use dixard'Order;
use dixard'OrderItem;
class PaypalController extends BaseController
{
private $_api_context;
public function __construct()
{
// setup PayPal api context
$paypal_conf = 'Config::get('paypal');
$this->_api_context = new ApiContext(new OAuthTokenCredential($paypal_conf['client_id'], $paypal_conf['secret']));
$this->_api_context->setConfig($paypal_conf['settings']);
}
// postPayment
public function postPayment(Request $request)
{
$payer = new Payer();
$payer->setPaymentMethod('paypal');
$items = array();
$subtotal = 0;
$cart = 'Session::get('cart'); //ottenere tutta l'informazione dalla session cart
$currency = 'EUR';
// impostiamo tutte le informazioni
foreach($cart as $producto){
$item = new Item();
$item->setName($producto->name)
->setCurrency($currency)
->setDescription($producto->extract)
->setQuantity($producto->quantity)
->setPrice($producto->price);
$items[] = $item;
$subtotal += $producto->quantity * $producto->price;
}
$item_list = new ItemList();
$item_list->setItems($items);
$details = new Details();
$details->setSubtotal($subtotal)
->setShipping(1);
$total = $subtotal + 1;
$amount = new Amount();
$amount->setCurrency($currency)
->setTotal($total)
->setDetails($details);
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($item_list)
->setDescription('Pedido de prueba en mi Laravel App Store');
// Redirect se si completa il pagamento O si cancella
$redirect_urls = new RedirectUrls();
$redirect_urls->setReturnUrl('URL::route('payment.status'))
->setCancelUrl('URL::route('payment.status'));
$payment = new Payment();
$payment->setIntent('Sale')
->setPayer($payer)
->setRedirectUrls($redirect_urls)
->setTransactions(array($transaction));
try {
$payment->create($this->_api_context);
} catch ('PayPal'Exception'PPConnectionException $ex) {
if ('Config::get('app.debug')) {
echo "Exception: " . $ex->getMessage() . PHP_EOL;
$err_data = json_decode($ex->getData(), true);
exit;
} else {
die('Ups! Algo salió mal');
}
}
foreach($payment->getLinks() as $link) {
if($link->getRel() == 'approval_url') {
$redirect_url = $link->getHref();
break;
}
}
// add payment ID to session,
'Session::put('paypal_payment_id', $payment->getId());
if(isset($redirect_url)) {
// redirect to paypal
return 'Redirect::away($redirect_url);
}
// se ci sono errori
return 'Redirect::route('cart-show')
->with('message', 'Ups! Error .');
}
public function getPaymentStatus(Request $request)
{
// Get the payment ID before session clear
$payment_id = 'Session::get('paypal_payment_id');
// clear the session payment ID
'Session::forget('paypal_payment_id');
$payerId = 'Input::get('PayerID');
$token = 'Input::get('token');
if (empty($payerId) || empty($token)) {
return 'Redirect('products')
->with('message', 'Hubo un problema al intentar pagar con Paypal');
}
$payment = Payment::get($payment_id, $this->_api_context);
$execution = new PaymentExecution();
$execution->setPayerId('Input::get('PayerID'));
$result = $payment->execute($execution, $this->_api_context);
if ($result->getState() == 'approved') {
//$this->saveOrder();
$this->saveOrder($request);
'Session::forget('cart');
return 'Redirect('orderComplete')
->with('message', 'Compra realizada de forma correcta');
}
return 'Redirect('orderComplete')
->with('message-error', 'La compra fue cancelada');
}
protected function saveOrder(Request $request)
{
$subtotal = 0;
$cart = 'Session::get('cart');
$shipping = 1;
foreach($cart as $producto){
$subtotal += $producto->quantity * $producto->price;
}
//$cellulare =$request->get('fullname_ship');
$order = Order::create([
'subtotal' => $subtotal,
'shipping' => $shipping,
'fullname_ship' => $request->get('fullname_ship'),
//'user_id' => 'Auth::user()->id
]);
foreach($cart as $producto){
$this->saveOrderItem($producto, $order->id);
}
}
protected function saveOrderItem($producto, $order_id)
{
OrderItem::create([
'price' => $producto->price,
'quantity' => $producto->quantity,
'product_id' => $producto->id,
'order_id' => $order_id
]);
}
}
ROUTES.PHP
Route::post('payment', array(
'as' => 'payment',
'uses' => 'PaypalController@postPayment',
));
Route::get('payment', array(
'as' => 'payment',
'uses' => 'PaypalController@getPayment',
));
Route::get('payment/status', array(
'as' => 'payment.status',
'uses' => 'PaypalController@getPaymentStatus',
));
这里的fullname_ship
似乎是空的:
fullname_ship' => $request->get('fullname_ship'),
因此,您应该验证输入并告诉用户填写此字段(使用required
)。或者您可以将默认值设置为它(如果它为空,则使用dafault值)。或者您可以在DB中将此字段标记为nullable
,并且它为空,您不会收到错误。
最简单的方法是将required
添加到表单元素:
<input required="required" type="text" class="form-control dark" id="fullname_ship" placeholder="Nome" name="fullname_ship" >
$request->get('fullname_ship')
将无法与Laravel 5一起使用。
从Laravel 5.0到5.2的当前值,获得表单输入的正确方法是:
$request->input('fullname_ship') or Input::get('fullname_ship')
第二种方法只有在控制器顶部use Input;
时才有效。
如果你需要其他东西,请参考这个。
同一个Request
对象不会传递给控制器中的所有函数。
您应该读取postPayment()
函数本身内部的fullname_ship
值。
否则,您可以将$request
中的所有数据传递给其他函数
public function postPayment(Request $request)
{
...
$input = $request->all();
...
$this->getPaymentStatus($input);
...
}
public function getPaymentStatus ($input)
{
...
$fullname_ship = $input['fullname_ship'];
...
}
我解决了这个问题,我在会话推车上添加了所有值输入,所以在方法saveOrder中,我从会话和数据库中的存储中获取所有输入。保存订单后,我删除了会话购物车。谢谢大家!