You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							223 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
	
	
							223 lines
						
					
					
						
							6.8 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers;
 | 
						|
 | 
						|
use App\CentralLogics\Helpers;
 | 
						|
use App\CentralLogics\OrderLogic;
 | 
						|
use Brian2694\Toastr\Facades\Toastr;
 | 
						|
use App\Models\Order;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
 | 
						|
class PaymobController extends Controller
 | 
						|
{
 | 
						|
    protected function cURL($url, $json)
 | 
						|
    {
 | 
						|
        // Create curl resource
 | 
						|
        $ch = curl_init($url);
 | 
						|
 | 
						|
        // Request headers
 | 
						|
        $headers = array();
 | 
						|
        $headers[] = 'Content-Type: application/json';
 | 
						|
 | 
						|
        // Return the transfer as a string
 | 
						|
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 | 
						|
        curl_setopt($ch, CURLOPT_POST, 1);
 | 
						|
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($json));
 | 
						|
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 | 
						|
 | 
						|
        // $output contains the output string
 | 
						|
        $output = curl_exec($ch);
 | 
						|
 | 
						|
        // Close curl resource to free up system resources
 | 
						|
        curl_close($ch);
 | 
						|
        return json_decode($output);
 | 
						|
    }
 | 
						|
 | 
						|
    protected function GETcURL($url)
 | 
						|
    {
 | 
						|
        // Create curl resource
 | 
						|
        $ch = curl_init($url);
 | 
						|
 | 
						|
        // Request headers
 | 
						|
        $headers = array();
 | 
						|
        $headers[] = 'Content-Type: application/json';
 | 
						|
 | 
						|
        // Return the transfer as a string
 | 
						|
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 | 
						|
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 | 
						|
 | 
						|
        // $output contains the output string
 | 
						|
        $output = curl_exec($ch);
 | 
						|
 | 
						|
        // Close curl resource to free up system resources
 | 
						|
        curl_close($ch);
 | 
						|
        return json_decode($output);
 | 
						|
    }
 | 
						|
 | 
						|
    public function credit()
 | 
						|
    {
 | 
						|
        $currency_code = Helpers::currency_code();
 | 
						|
        if ($currency_code != "EGP") {
 | 
						|
            Toastr::error(translate('messages.paymob_supports_EGP_currency'));
 | 
						|
            return back();
 | 
						|
        }
 | 
						|
 | 
						|
        $config = Helpers::get_business_settings('paymob_accept');
 | 
						|
        try {
 | 
						|
            $token = $this->getToken();
 | 
						|
            $order = $this->createOrder($token);
 | 
						|
            $paymentToken = $this->getPaymentToken($order, $token);
 | 
						|
        }catch (\Exception $exception){
 | 
						|
            Toastr::error(translate('messages.country_permission_denied_or_misconfiguration'));
 | 
						|
            return back();
 | 
						|
        }
 | 
						|
        return \Redirect::away('https://portal.weaccept.co/api/acceptance/iframes/' . $config['iframe_id'] . '?payment_token=' . $paymentToken);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getToken()
 | 
						|
    {
 | 
						|
        $config = Helpers::get_business_settings('paymob_accept');
 | 
						|
        $response = $this->cURL(
 | 
						|
            'https://accept.paymobsolutions.com/api/auth/tokens',
 | 
						|
            ['api_key' => $config['api_key']]
 | 
						|
        );
 | 
						|
 | 
						|
        return $response->token;
 | 
						|
    }
 | 
						|
 | 
						|
    public function createOrder($token)
 | 
						|
    {
 | 
						|
        $order = Order::with(['details'])->where(['id' => session('order_id')])->first();
 | 
						|
 | 
						|
        $items = [];
 | 
						|
        foreach ($order->details as $detail) {
 | 
						|
            array_push($items, [
 | 
						|
                'name' => $detail->campaign?$detail->campaign->title:$detail->food['name'],
 | 
						|
                'amount_cents' => round($detail['price'],2) * 100,
 | 
						|
                'description' => $detail->campaign?$detail->campaign->title:$detail->food['name'],
 | 
						|
                'quantity' => $detail['quantity']
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
        $data = [
 | 
						|
            "auth_token" => $token,
 | 
						|
            "delivery_needed" => "false",
 | 
						|
            "amount_cents" => round($order->order_amount,2) * 100,
 | 
						|
            "currency" => "EGP",
 | 
						|
            "items" => $items,
 | 
						|
 | 
						|
        ];
 | 
						|
        $response = $this->cURL(
 | 
						|
            'https://accept.paymob.com/api/ecommerce/orders',
 | 
						|
            $data
 | 
						|
        );
 | 
						|
 | 
						|
        return $response;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getPaymentToken($order, $token)
 | 
						|
    {
 | 
						|
        $ord = Order::with(['details'])->where(['id' => session('order_id')])->first();
 | 
						|
 | 
						|
        $value = $ord->order_amount;
 | 
						|
        $config = Helpers::get_business_settings('paymob_accept');
 | 
						|
        $billingData = [
 | 
						|
            "apartment" => "not given",
 | 
						|
            "email" => "not given",
 | 
						|
            "floor" => "not given",
 | 
						|
            "first_name" => "not given",
 | 
						|
            "street" => "not given",
 | 
						|
            "building" => "not given",
 | 
						|
            "phone_number" => "not given",
 | 
						|
            "shipping_method" => "PKG",
 | 
						|
            "postal_code" => "not given",
 | 
						|
            "city" => "not given",
 | 
						|
            "country" => "not given",
 | 
						|
            "last_name" => "not given",
 | 
						|
            "state" => "not given",
 | 
						|
        ];
 | 
						|
        $data = [
 | 
						|
            "auth_token" => $token,
 | 
						|
            "amount_cents" => round($value,2) * 100,
 | 
						|
            "expiration" => 3600,
 | 
						|
            "order_id" => $order->id,
 | 
						|
            "billing_data" => $billingData,
 | 
						|
            "currency" => "EGP",
 | 
						|
            "integration_id" => $config['integration_id']
 | 
						|
        ];
 | 
						|
 | 
						|
        $response = $this->cURL(
 | 
						|
            'https://accept.paymob.com/api/acceptance/payment_keys',
 | 
						|
            $data
 | 
						|
        );
 | 
						|
 | 
						|
        return $response->token;
 | 
						|
    }
 | 
						|
 | 
						|
    public function callback(Request $request)
 | 
						|
    {
 | 
						|
        $config = Helpers::get_business_settings('paymob_accept');
 | 
						|
        $data = $request->all();
 | 
						|
        ksort($data);
 | 
						|
        $hmac = $data['hmac'];
 | 
						|
        $array = [
 | 
						|
            'amount_cents',
 | 
						|
            'created_at',
 | 
						|
            'currency',
 | 
						|
            'error_occured',
 | 
						|
            'has_parent_transaction',
 | 
						|
            'id',
 | 
						|
            'integration_id',
 | 
						|
            'is_3d_secure',
 | 
						|
            'is_auth',
 | 
						|
            'is_capture',
 | 
						|
            'is_refunded',
 | 
						|
            'is_standalone_payment',
 | 
						|
            'is_voided',
 | 
						|
            'order',
 | 
						|
            'owner',
 | 
						|
            'pending',
 | 
						|
            'source_data_pan',
 | 
						|
            'source_data_sub_type',
 | 
						|
            'source_data_type',
 | 
						|
            'success',
 | 
						|
        ];
 | 
						|
        $connectedString = '';
 | 
						|
        foreach ($data as $key => $element) {
 | 
						|
            if (in_array($key, $array)) {
 | 
						|
                $connectedString .= $element;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        $secret = $config['hmac'];
 | 
						|
        $hased = hash_hmac('sha512', $connectedString, $secret);
 | 
						|
        $order = Order::where('id', session('order_id'))->first();
 | 
						|
 | 
						|
        if ($hased == $hmac) {
 | 
						|
            $order->transaction_reference = 'tran-' . session('order_id');
 | 
						|
            $order->payment_method = 'paymob_accept';
 | 
						|
            $order->order_status = 'confirmed';
 | 
						|
            $order->confirmed = now();
 | 
						|
            $order->updated_at = now();
 | 
						|
            $order->save();
 | 
						|
            try {
 | 
						|
                Helpers::send_order_notification($order);
 | 
						|
            } catch (\Exception $e) {
 | 
						|
            }
 | 
						|
 | 
						|
            if ($order->callback != null) {
 | 
						|
                return redirect($order->callback . '&status=success');
 | 
						|
            }else{
 | 
						|
                return \redirect()->route('payment-success');
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        $order->order_status = 'failed';
 | 
						|
        $order->failed = now();
 | 
						|
        $order->save();
 | 
						|
        if ($order->callback != null) {
 | 
						|
            return redirect($order->callback . '&status=fail');
 | 
						|
        }else{
 | 
						|
            return \redirect()->route('payment-fail');
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 |