165 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Modules\PaypalStandard\Http\Controllers;
 | |
| 
 | |
| use App\Events\InvoicePaid;
 | |
| 
 | |
| use Illuminate\Http\Response;
 | |
| use Illuminate\Routing\Controller;
 | |
| 
 | |
| use Monolog\Logger;
 | |
| use Monolog\Handler\StreamHandler;
 | |
| 
 | |
| use GuzzleHttp\Client;
 | |
| 
 | |
| use Illuminate\Http\Request;
 | |
| use App\Http\Requests\Customer\InvoicePayment as PaymentRequest;
 | |
| 
 | |
| use App\Models\Income\Invoice;
 | |
| 
 | |
| class PaypalStandard extends Controller
 | |
| {
 | |
|     /**
 | |
|      * Show the form for editing the specified resource.
 | |
|      * @param Invoice
 | |
|      * @param PaymentRequest
 | |
|      * @return Response
 | |
|      */
 | |
|     public function show(Invoice $invoice, PaymentRequest $request)
 | |
|     {
 | |
|         $gateway = setting('paypalstandard');
 | |
| 
 | |
|         $gateway['action'] = 'https://www.paypal.com/cgi-bin/webscr';
 | |
| 
 | |
|         if ($gateway['mode'] == 'sandbox') {
 | |
|             $gateway['action'] = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
 | |
|         }
 | |
| 
 | |
|         $customer = explode(" ", $invoice->customer_name);
 | |
| 
 | |
|         $last_name = array_pop($customer);
 | |
|         $first_name = implode(" ", $customer);
 | |
| 
 | |
|         $invoice->first_name = $first_name;
 | |
|         $invoice->last_name = $last_name;
 | |
| 
 | |
|         $gateway['language'] = \App::getLocale();
 | |
| 
 | |
|         $html = view('paypalstandard::show', compact('gateway', 'invoice'))->render();
 | |
| 
 | |
|         return response()->json([
 | |
|             'code' => 'paypalstandard',
 | |
|             'name' => $gateway['name'],
 | |
|             'description' => trans('paypalstandard::paypalstandard.description'),
 | |
|             'redirect' => false,
 | |
|             'html' => $html,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     public function result(Invoice $invoice, Request $request)
 | |
|     {
 | |
|         $success = true;
 | |
| 
 | |
|         switch ($request['payment_status']) {
 | |
|             case 'Completed':
 | |
|                 $message = trans('messages.success.added', ['type' => trans_choice('general.customers', 1)]);
 | |
|                 break;
 | |
|             case 'Canceled_Reversal':
 | |
|             case 'Denied':
 | |
|             case 'Expired':
 | |
|             case 'Failed':
 | |
|             case 'Pending':
 | |
|             case 'Processed':
 | |
|             case 'Refunded':
 | |
|             case 'Reversed':
 | |
|             case 'Voided':
 | |
|                 $message = trans('messages.error.added', ['type' => trans_choice('general.customers', 1)]);
 | |
|                 $success = false;
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         if ($success) {
 | |
|             flash($message)->success();
 | |
|         } else {
 | |
|             flash($message)->warning();
 | |
|         }
 | |
| 
 | |
|         $redirect = url('customers/invoices/' . $invoice->id);
 | |
| 
 | |
|         return redirect($redirect);
 | |
|     }
 | |
| 
 | |
|     public function callback(Invoice $invoice, Request $request)
 | |
|     {
 | |
|         $gateway = setting('paypalstandard');
 | |
| 
 | |
|         $paypal_log = new Logger('Paypal');
 | |
| 
 | |
|         $paypal_log->pushHandler(new StreamHandler(storage_path('logs/paypal.log')), Logger::INFO);
 | |
| 
 | |
|         if ($invoice) {
 | |
|             $url = 'https://ipnpb.paypal.com/cgi-bin/webscr';
 | |
| 
 | |
|             if ($gateway['mode'] == 'sandbox') {
 | |
|                 $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
 | |
|             }
 | |
| 
 | |
|             $client = new Client(['verify' => false]);
 | |
| 
 | |
|             $paypal_request['cmd'] = '_notify-validate';
 | |
| 
 | |
|             foreach ($request->toArray() as $key => $value) {
 | |
|                 $paypal_request[$key] = urlencode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));
 | |
|             }
 | |
| 
 | |
|             $result = $client->post($url, $paypal_request);
 | |
| 
 | |
|             if ($result->getStatusCode() != 200) {
 | |
|                 $paypal_log->info('PAYPAL_STANDARD :: CURL failed ', $result->getBody()->getContents());
 | |
|             } else {
 | |
|                 $result = $result->getBody()->getContents();
 | |
|             }
 | |
| 
 | |
|             if ($gateway['debug']) {
 | |
|                 $paypal_log->info('PAYPAL_STANDARD :: IPN REQUEST: ', $request->toArray());
 | |
|                 //$paypal_log->info('PAYPAL_STANDARD :: IPN RESULT: ', $result);
 | |
|             }
 | |
| 
 | |
|             if ((strcmp($result, 'VERIFIED') == 0 || strcmp($result, 'UNVERIFIED') == 0) || true) {
 | |
|                 switch ($request['payment_status']) {
 | |
|                     case 'Completed':
 | |
|                         $receiver_match = (strtolower($request['receiver_email']) == strtolower($gateway['email']));
 | |
| 
 | |
|                         $total_paid_match = ((float)$request['mc_gross'] == $invoice->amount);
 | |
| 
 | |
|                         if ($receiver_match && $total_paid_match) {
 | |
|                             event(new InvoicePaid($invoice, $request->toArray()));
 | |
|                         }
 | |
| 
 | |
|                         if (!$receiver_match) {
 | |
|                             $paypal_log->info('PAYPAL_STANDARD :: RECEIVER EMAIL MISMATCH! ' . strtolower($request['receiver_email']));
 | |
|                         }
 | |
| 
 | |
|                         if (!$total_paid_match) {
 | |
|                             $paypal_log->info('PAYPAL_STANDARD :: TOTAL PAID MISMATCH! ' . $request['mc_gross']);
 | |
|                         }
 | |
|                         break;
 | |
|                     case 'Canceled_Reversal':
 | |
|                     case 'Denied':
 | |
|                     case 'Expired':
 | |
|                     case 'Failed':
 | |
|                     case 'Pending':
 | |
|                     case 'Processed':
 | |
|                     case 'Refunded':
 | |
|                     case 'Reversed':
 | |
|                     case 'Voided':
 | |
|                         $paypal_log->info('PAYPAL_STANDARD :: NOT COMPLETED ' . $request->toArray());
 | |
|                         break;
 | |
|                 }
 | |
|             } else {
 | |
|                 $paypal_log->info('PAYPAL_STANDARD :: VERIFIED != 0 || UNVERIFIED != 0 ' . $request->toArray());
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |