mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 03:47:32 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			145 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Invoice Ninja (https://invoiceninja.com).
 | |
|  *
 | |
|  * @link https://github.com/invoiceninja/invoiceninja source repository
 | |
|  *
 | |
|  * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 | |
|  *
 | |
|  * @license https://www.elastic.co/licensing/elastic-license
 | |
|  */
 | |
| 
 | |
| namespace App\PaymentDrivers\PayFast;
 | |
| 
 | |
| use App\Exceptions\PaymentFailed;
 | |
| use App\Jobs\Util\SystemLogger;
 | |
| use App\Models\ClientGatewayToken;
 | |
| use App\Models\GatewayType;
 | |
| use App\Models\Payment;
 | |
| use App\Models\PaymentHash;
 | |
| use App\Models\PaymentType;
 | |
| use App\Models\SystemLog;
 | |
| use App\PaymentDrivers\PayFastPaymentDriver;
 | |
| use Illuminate\Http\Request;
 | |
| use Illuminate\Support\Facades\Cache;
 | |
| use Illuminate\Support\Str;
 | |
| use GuzzleHttp\RequestOptions;
 | |
| 
 | |
| class Token
 | |
| {
 | |
| 
 | |
|     public $payfast;
 | |
| 
 | |
|     public function __construct(PayFastPaymentDriver $payfast)
 | |
|     {
 | |
|         $this->payfast = $payfast;
 | |
|     }
 | |
| 
 | |
|     public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash)
 | |
|     {
 | |
| 
 | |
|         $amount = array_sum(array_column($payment_hash->invoices(), 'amount')) + $payment_hash->fee_total;
 | |
| 		$amount = round(($amount * pow(10, $this->payfast->client->currency()->precision)),0);
 | |
| 
 | |
| 		$header =[
 | |
|             'merchant-id' => $this->payfast->company_gateway->getConfigField('merchantId'),
 | |
|             'version' => 'v1',
 | |
|             'timestamp' => now()->format('c'),
 | |
| 		];
 | |
| 
 | |
|         $body = [
 | |
|             'amount' => $amount,
 | |
|             'item_name' => 'purchase',
 | |
|             'item_description' => ctrans('texts.invoices') . ': ' . collect($payment_hash->invoices())->pluck('invoice_number'),
 | |
|             'm_payment_id' => $payment_hash->hash,
 | |
|         ];        
 | |
|         
 | |
|         $header['signature'] = $this->payfast->generateTokenSignature(array_merge($body, $header));
 | |
| 
 | |
|         nlog($header['signature']);
 | |
| 
 | |
|         $result = $this->send($header, $body, $cgt->token);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     protected function generate_parameter_string( $api_data, $sort_data_before_merge = true, $skip_empty_values = true ) {
 | |
| 
 | |
|         // if sorting is required the passphrase should be added in before sort.
 | |
|         if ( ! empty( $this->payfast->company_gateway->getConfigField('passphrase') ) && $sort_data_before_merge ) 
 | |
|             $api_data['passphrase'] = $this->payfast->company_gateway->getConfigField('passphrase');
 | |
| 
 | |
|         if ( $sort_data_before_merge ) {
 | |
|             ksort( $api_data );
 | |
|         }
 | |
| 
 | |
|         // concatenate the array key value pairs.
 | |
|         $parameter_string = '';
 | |
|         foreach ( $api_data as $key => $val ) {
 | |
| 
 | |
|             if ( $skip_empty_values && empty( $val ) ) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             if ( 'signature' !== $key ) {
 | |
|                 $val = urlencode( $val );
 | |
|                 $parameter_string .= "$key=$val&";
 | |
|             }
 | |
|         }
 | |
|         // when not sorting passphrase should be added to the end before md5
 | |
|         if ( $sort_data_before_merge ) {
 | |
|             $parameter_string = rtrim( $parameter_string, '&' );
 | |
|         } elseif ( ! empty( $this->pass_phrase ) ) {
 | |
|             $parameter_string .= 'passphrase=' . urlencode( $this->payfast->company_gateway->getConfigField('passphrase') );
 | |
|         } else {
 | |
|             $parameter_string = rtrim( $parameter_string, '&' );
 | |
|         }
 | |
| 
 | |
|         nlog($parameter_string);
 | |
| 
 | |
|         return $parameter_string;
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private function genSig($data)
 | |
|     {
 | |
|     	$fields = [];
 | |
| 
 | |
|     	ksort($data);
 | |
| 
 | |
|         foreach($data as $key => $value)
 | |
|         {
 | |
|         	if (!empty($data[$key])) {
 | |
|                 $fields[$key] = $data[$key];
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         nlog(http_build_query($fields));
 | |
| 
 | |
|         return md5(http_build_query($fields));
 | |
|     }
 | |
| 
 | |
|     private function send($headers, $body, $token)
 | |
|     {
 | |
|     	$client =  new \GuzzleHttp\Client(
 | |
|         [
 | |
|             'headers' => $headers,
 | |
|         ]);
 | |
| 
 | |
|         try {
 | |
|             $response = $client->post("https://api.payfast.co.za/subscriptions/{$token}/adhoc?testing=true",[
 | |
|                 RequestOptions::JSON => ['body' => $body], RequestOptions::ALLOW_REDIRECTS => false
 | |
|             ]);
 | |
| 
 | |
|             return json_decode($response->getBody(),true);
 | |
|         }
 | |
|         catch(\Exception $e)
 | |
|         {
 | |
| 
 | |
|         	nlog($e->getMessage());
 | |
| 
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 |