File: /home/mobilech/.trash/shop/app/Http/Controllers/PaypalPaymentController.php
<?php
namespace App\Http\Controllers;
use App\CPU\CartManager;
use App\CPU\Helpers;
use App\CPU\OrderManager;
use App\Model\BusinessSetting;
use App\Model\Currency;
use App\Model\Order;
use App\Model\Product;
use App\Model\ShippingMethod;
use App\User;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Str;
use PayPal\Api\Amount;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Common\PayPalModel;
use PayPal\Rest\ApiContext;
class PaypalPaymentController extends Controller
{
public function __construct()
{
$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']);
}
public function payWithpaypal(Request $request)
{
$currency_model = Helpers::get_business_settings('currency_model');
if ($currency_model == 'multi_currency') {
$currency_code = 'USD';
} else {
$default = BusinessSetting::where(['type' => 'system_default_currency'])->first()->value;
$currency_code = Currency::find($default)->code;
}
$discount = session()->has('coupon_discount') ? session('coupon_discount') : 0;
$value = CartManager::cart_grand_total() - $discount;
$payer = new Payer();
$payer->setPaymentMethod('paypal');
$items_array = [];
$item = new Item();
$item->setName('Products')
->setCurrency($currency_code)
->setQuantity(1)
->setPrice($value);
array_push($items_array, $item);
$item_list = new ItemList();
$item_list->setItems($items_array);
$amount = new Amount();
$amount->setCurrency($currency_code)
->setTotal($value);
$tran = OrderManager::gen_unique_id();
session()->put('transaction_ref', $tran);
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($item_list)
->setDescription($tran);
$redirect_urls = new RedirectUrls();
$redirect_urls->setReturnUrl(URL::route('paypal-status'))
->setCancelUrl(URL::route('home'));
$payment = new Payment();
$payment->setIntent('Sale')
->setPayer($payer)
->setRedirectUrls($redirect_urls)
->setTransactions(array($transaction));
try {
$payment->create($this->_api_context);
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)) {
return Redirect::away($redirect_url);
}
} catch (\Exception $ex) {
Toastr::error('Payment process is failed.');
return back();
}
Session::put('error', 'Unknown error occurred');
return back();
}
public function getPaymentStatus(Request $request)
{
$payment_id = $request['paymentId'];
if (empty($request['PayerID']) || empty($request['token'])) {
Session::put('error', 'Payment failed');
return back();
}
$payment = Payment::get($payment_id, $this->_api_context);
$execution = new PaymentExecution();
$execution->setPayerId($request['PayerID']);
/**Execute the payment **/
$result = $payment->execute($execution, $this->_api_context);
if ($result->getState() == 'approved') {
$unique_id = OrderManager::gen_unique_id();
$order_ids = [];
foreach (CartManager::get_cart_group_ids() as $group_id) {
$data = [
'payment_method' => 'paypal',
'order_status' => 'confirmed',
'payment_status' => 'paid',
'transaction_ref' => \session('transaction_ref'),
'order_group_id' => $unique_id,
'cart_group_id' => $group_id
];
$order_id = OrderManager::generate_order($data);
array_push($order_ids, $order_id);
}
CartManager::cart_clean();
if (session()->has('payment_mode') && \session('payment_mode') == 'app') {
return redirect()->route('payment-success');
}
if (auth('customer')->check()) {
Toastr::success('Payment success.');
return view(VIEW_FILE_NAMES['order_complete']);
}
}
if (session()->has('payment_mode') && \session('payment_mode') == 'app') {
return redirect()->route('payment-fail');
}
if (auth('customer')->check()) {
Toastr::error('Payment failed.');
return back();
}
}
}