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.
		
		
		
		
		
			
		
			
				
					
					
						
							210 lines
						
					
					
						
							8.1 KiB
						
					
					
				
			
		
		
	
	
							210 lines
						
					
					
						
							8.1 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers;
 | 
						|
 | 
						|
ini_set('memory_limit', '-1');
 | 
						|
 | 
						|
use App\Models\Order;
 | 
						|
use Illuminate\Support\Str;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use App\CentralLogics\Helpers;
 | 
						|
use App\CentralLogics\OrderLogic;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
use Brian2694\Toastr\Facades\Toastr;
 | 
						|
use App\Library\SslCommerz\SslCommerzNotification;
 | 
						|
 | 
						|
class SslCommerzPaymentController extends Controller
 | 
						|
{
 | 
						|
    public function index(Request $request)
 | 
						|
    {
 | 
						|
 | 
						|
        $order = Order::with(['details'])->where(['id' => $request->order_id])->first();
 | 
						|
        $tr_ref = Str::random(6) . '-' . rand(1, 1000);
 | 
						|
 | 
						|
        $post_data = array();
 | 
						|
        $post_data['total_amount'] = $order->order_amount;
 | 
						|
        $post_data['currency'] = Helpers::currency_code();
 | 
						|
        $post_data['tran_id'] = $tr_ref;
 | 
						|
 | 
						|
        # CUSTOMER INFORMATION
 | 
						|
        $post_data['cus_name'] = $order->customer['f_name'];
 | 
						|
        $post_data['cus_email'] = $order->customer['email'] == null ? "example@example.com" : $order->customer['email'];
 | 
						|
        $post_data['cus_add1'] = 'Customer Address';
 | 
						|
        $post_data['cus_add2'] = "";
 | 
						|
        $post_data['cus_city'] = "";
 | 
						|
        $post_data['cus_state'] = "";
 | 
						|
        $post_data['cus_postcode'] = "";
 | 
						|
        $post_data['cus_country'] = "Bangladesh";
 | 
						|
        $post_data['cus_phone'] = $order->customer['phone'] == null ? '0000000000' : $order->customer['phone'];
 | 
						|
        $post_data['cus_fax'] = "";
 | 
						|
 | 
						|
        # SHIPMENT INFORMATION
 | 
						|
        $post_data['ship_name'] = "Shipping";
 | 
						|
        $post_data['ship_add1'] = "address 1";
 | 
						|
        $post_data['ship_add2'] = "address 2";
 | 
						|
        $post_data['ship_city'] = "City";
 | 
						|
        $post_data['ship_state'] = "State";
 | 
						|
        $post_data['ship_postcode'] = "ZIP";
 | 
						|
        $post_data['ship_phone'] = "";
 | 
						|
        $post_data['ship_country'] = "Country";
 | 
						|
 | 
						|
        $post_data['shipping_method'] = "NO";
 | 
						|
        $post_data['product_name'] = "Computer";
 | 
						|
        $post_data['product_category'] = "Goods";
 | 
						|
        $post_data['product_profile'] = "physical-goods";
 | 
						|
 | 
						|
        # OPTIONAL PARAMETERS
 | 
						|
        $post_data['value_a'] = "ref001";
 | 
						|
        $post_data['value_b'] = "ref002";
 | 
						|
        $post_data['value_c'] = "ref003";
 | 
						|
        $post_data['value_d'] = "ref004";
 | 
						|
 | 
						|
        DB::table('orders')
 | 
						|
            ->where('id', $order['id'])
 | 
						|
            ->update([
 | 
						|
                'transaction_reference' => $tr_ref,
 | 
						|
                'payment_method' => 'ssl_commerz_payment',
 | 
						|
                'order_status' => 'failed',
 | 
						|
                'failed' => now(),
 | 
						|
                'updated_at' => now(),
 | 
						|
            ]);
 | 
						|
 | 
						|
        try {
 | 
						|
            $sslc = new SslCommerzNotification();
 | 
						|
            $payment_options = $sslc->makePayment($post_data, 'hosted');
 | 
						|
            if (!is_array($payment_options)) {
 | 
						|
                Toastr::error(translate('messages.your_currency_is_not_supported',['method'=>translate('messages.sslcommerz')]));
 | 
						|
                return back();
 | 
						|
            }
 | 
						|
        } catch (\Exception $exception) {
 | 
						|
            Toastr::error(translate('messages.misconfiguration_or_data_missing'));
 | 
						|
            return back();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function success(Request $request)
 | 
						|
    {
 | 
						|
        $tran_id = $request->input('tran_id');
 | 
						|
        $amount = $request->input('amount');
 | 
						|
        $currency = $request->input('currency');
 | 
						|
        $sslc = new SslCommerzNotification();
 | 
						|
 | 
						|
        $order = Order::where('transaction_reference', $tran_id)->first();
 | 
						|
 | 
						|
        $validation = $sslc->orderValidate($tran_id, $amount, $currency, $request->all());
 | 
						|
        if ($validation == TRUE) {
 | 
						|
            $order->order_status='confirmed';
 | 
						|
            $order->payment_method='ssl_commerz_payment';
 | 
						|
            $order->transaction_reference=$tran_id;
 | 
						|
            $order->payment_status='paid';
 | 
						|
            $order->confirmed=now();
 | 
						|
            $order->save();
 | 
						|
            try {
 | 
						|
                Helpers::send_order_notification($order);
 | 
						|
            } catch (\Exception $e) {
 | 
						|
            }
 | 
						|
 | 
						|
            if ($order->callback != null) {
 | 
						|
                return redirect($order->callback . '&status=success');
 | 
						|
            }
 | 
						|
 | 
						|
            return \redirect()->route('payment-success');
 | 
						|
 | 
						|
        } else {
 | 
						|
            DB::table('orders')
 | 
						|
                ->where('transaction_reference', $tran_id)
 | 
						|
                ->update(['order_status' => 'failed', 'payment_status' => 'unpaid', 'failed'=>now()]);
 | 
						|
            if ($order->callback != null) {
 | 
						|
                return redirect($order->callback . '&status=fail');
 | 
						|
            }
 | 
						|
            return \redirect()->route('payment-fail');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function fail(Request $request)
 | 
						|
    {
 | 
						|
        $tran_id = $request->input('tran_id');
 | 
						|
        DB::table('orders')
 | 
						|
            ->where('transaction_reference', $tran_id)
 | 
						|
            ->update(['order_status' => 'failed', 'payment_status' => 'unpaid', 'failed'=>now()]);
 | 
						|
 | 
						|
        $order_detials = DB::table('orders')
 | 
						|
            ->where('transaction_reference', $tran_id)
 | 
						|
            ->select('id', 'transaction_reference', 'order_status', 'order_amount', 'callback')->first();
 | 
						|
 | 
						|
        if ($order_detials->callback != null) {
 | 
						|
            return redirect($order_detials->callback . '&status=fail');
 | 
						|
        }
 | 
						|
        return \redirect()->route('payment-fail');
 | 
						|
    }
 | 
						|
 | 
						|
    public function cancel(Request $request)
 | 
						|
    {
 | 
						|
        $tran_id = $request->input('tran_id');
 | 
						|
        DB::table('orders')
 | 
						|
            ->where('transaction_reference', $tran_id)
 | 
						|
            ->update(['order_status' => 'canceled', 'payment_status' => 'unpaid']);
 | 
						|
 | 
						|
        $order_detials = DB::table('orders')
 | 
						|
            ->where('transaction_reference', $tran_id)
 | 
						|
            ->select('id', 'transaction_reference', 'order_status', 'order_amount', 'callback')->first();
 | 
						|
 | 
						|
        if ($order_detials->callback != null) {
 | 
						|
            return redirect($order_detials->callback . '&status=cancel');
 | 
						|
        }
 | 
						|
        return \redirect()->route('payment-fail');
 | 
						|
    }
 | 
						|
 | 
						|
    public function ipn(Request $request)
 | 
						|
    {
 | 
						|
        #Received all the payement information from the gateway
 | 
						|
        if ($request->input('tran_id')) #Check transation id is posted or not.
 | 
						|
        {
 | 
						|
            $tran_id = $request->input('tran_id');
 | 
						|
            #Check order status in order tabel against the transaction id or order id.
 | 
						|
            $order_details = DB::table('orders')
 | 
						|
                ->where('transaction_reference', $tran_id)
 | 
						|
                ->select('transaction_reference', 'order_status', 'order_amount')->first();
 | 
						|
 | 
						|
            if ($order_details->order_status == 'pending') {
 | 
						|
                $sslc = new SslCommerzNotification();
 | 
						|
                $validation = $sslc->orderValidate($tran_id, $order_details->order_amount, 'BDT', $request->all());
 | 
						|
                if ($validation == TRUE) {
 | 
						|
                    /*
 | 
						|
                    That means IPN worked. Here you need to update order status
 | 
						|
                    in order table as confirmed or Complete.
 | 
						|
                    Here you can also sent sms or email for successful transaction to customer
 | 
						|
                    */
 | 
						|
                    $update_product = DB::table('orders')
 | 
						|
                        ->where('transaction_reference', $tran_id)
 | 
						|
                        ->update(['order_status' => 'confirmed', 'payment_status' => 'paid']);
 | 
						|
 | 
						|
                    echo "Transaction is successfully completed";
 | 
						|
                } else {
 | 
						|
                    /*
 | 
						|
                    That means IPN worked, but Transation validation failed.
 | 
						|
                    Here you need to update order status as Failed in order table.
 | 
						|
                    */
 | 
						|
                    $update_product = DB::table('orders')
 | 
						|
                        ->where('transaction_reference', $tran_id)
 | 
						|
                        ->update(['order_status' => 'confirmed', 'payment_status' => 'unpaid']);
 | 
						|
 | 
						|
                    echo "validation Fail";
 | 
						|
                }
 | 
						|
 | 
						|
            } else if ($order_details->order_status == 'confirmed' || $order_details->order_status == 'complete') {
 | 
						|
 | 
						|
                #That means Order status already updated. No need to udate database.
 | 
						|
 | 
						|
                echo "Transaction is already successfully completed";
 | 
						|
            } else {
 | 
						|
                #That means something wrong happened. You can redirect customer to your product page.
 | 
						|
 | 
						|
                echo "Invalid Transaction";
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            echo "Invalid Data";
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 |