mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 01:17:30 -05:00 
			
		
		
		
	Merge branch 'upgrade_square_implementation' into v5-develop
This commit is contained in:
		
						commit
						dfb19f9d4a
					
				@ -51,7 +51,7 @@ class NinjaMailerJob implements ShouldQueue
 | 
			
		||||
 | 
			
		||||
    public $override;
 | 
			
		||||
 | 
			
		||||
    /** @var \App\Models\Company $company | null **/
 | 
			
		||||
    /** @var null|\App\Models\Company $company  **/
 | 
			
		||||
    public ?Company $company;
 | 
			
		||||
 | 
			
		||||
    private $mailer;
 | 
			
		||||
@ -143,8 +143,6 @@ class NinjaMailerJob implements ShouldQueue
 | 
			
		||||
            LightLogs::create(new EmailSuccess($this->nmo->company->company_key))
 | 
			
		||||
                     ->send();
 | 
			
		||||
 | 
			
		||||
            $this->nmo = null;
 | 
			
		||||
            $this->company = null;
 | 
			
		||||
        } catch(\Symfony\Component\Mime\Exception\RfcComplianceException $e) {
 | 
			
		||||
            nlog("Mailer failed with a Logic Exception {$e->getMessage()}");
 | 
			
		||||
            $this->fail();
 | 
			
		||||
@ -195,6 +193,9 @@ class NinjaMailerJob implements ShouldQueue
 | 
			
		||||
            $this->release($this->backoff()[$this->attempts()-1]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->nmo = null;
 | 
			
		||||
        $this->company = null;
 | 
			
		||||
 | 
			
		||||
        /*Clean up mailers*/
 | 
			
		||||
        $this->cleanUpMailers();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -222,6 +222,22 @@ class CompanyGateway extends BaseModel
 | 
			
		||||
        $this->config = encrypt(json_encode($config));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * setConfigField
 | 
			
		||||
     *
 | 
			
		||||
     * @param  mixed $field
 | 
			
		||||
     * @param  mixed $value
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function setConfigField($field, $value): void
 | 
			
		||||
    {
 | 
			
		||||
        $config = $this->getConfig();
 | 
			
		||||
        $config->{$field} = $value;
 | 
			
		||||
 | 
			
		||||
        $this->setConfig($config);
 | 
			
		||||
        $this->save();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return mixed
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
@ -171,7 +171,7 @@ class Gateway extends StaticModel
 | 
			
		||||
                ];
 | 
			
		||||
            case 57:
 | 
			
		||||
                return [
 | 
			
		||||
                    GatewayType::CREDIT_CARD => ['refund' => false, 'token_billing' => true], //Square
 | 
			
		||||
                    GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true], //Square
 | 
			
		||||
                ];
 | 
			
		||||
            case 52:
 | 
			
		||||
                return [
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ use Illuminate\Database\Eloquent\Model;
 | 
			
		||||
 * App\Models\PaymentHash
 | 
			
		||||
 *
 | 
			
		||||
 * @property int $id
 | 
			
		||||
 * @property string $hash
 | 
			
		||||
 * @property string $hash 32 char length AlphaNum
 | 
			
		||||
 * @property float $fee_total
 | 
			
		||||
 * @property int|null $fee_invoice_id
 | 
			
		||||
 * @property \stdClass $data
 | 
			
		||||
@ -41,6 +41,7 @@ class PaymentHash extends Model
 | 
			
		||||
        /**
 | 
			
		||||
        * @class \App\Models\PaymentHash $this
 | 
			
		||||
        * @property \App\Models\PaymentHash $data
 | 
			
		||||
        * @property \App\Modes\PaymentHash $hash 32 char length AlphaNum
 | 
			
		||||
        * @class \stdClass $data
 | 
			
		||||
        * @property string $raw_value
 | 
			
		||||
        */
 | 
			
		||||
 | 
			
		||||
@ -263,6 +263,8 @@ class BaseDriver extends AbstractPaymentDriver
 | 
			
		||||
    public function setClient(Client $client)
 | 
			
		||||
    {
 | 
			
		||||
        $this->client = $client;
 | 
			
		||||
        
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
    /************************** Helper methods *************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@
 | 
			
		||||
 | 
			
		||||
namespace App\PaymentDrivers\Square;
 | 
			
		||||
 | 
			
		||||
use App\Models\Invoice;
 | 
			
		||||
use App\Models\Payment;
 | 
			
		||||
use App\Models\SystemLog;
 | 
			
		||||
use Illuminate\View\View;
 | 
			
		||||
@ -33,11 +34,8 @@ class CreditCard implements MethodInterface
 | 
			
		||||
{
 | 
			
		||||
    use MakesHash;
 | 
			
		||||
 | 
			
		||||
    public $square_driver;
 | 
			
		||||
 | 
			
		||||
    public function __construct(SquarePaymentDriver $square_driver)
 | 
			
		||||
    public function __construct(public SquarePaymentDriver $square_driver)
 | 
			
		||||
    {
 | 
			
		||||
        $this->square_driver = $square_driver;
 | 
			
		||||
        $this->square_driver->init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -102,20 +100,28 @@ class CreditCard implements MethodInterface
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if ($request->shouldUseToken()) {
 | 
			
		||||
            /** @var \App\Models\ClientGatewayToken $cgt **/
 | 
			
		||||
            $cgt = ClientGatewayToken::where('token', $request->token)->first();
 | 
			
		||||
            $cgt = ClientGatewayToken::query()->where('token', $request->token)->first();
 | 
			
		||||
            $token = $cgt->token;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $invoice = Invoice::query()->whereIn('id', $this->transformKeys(array_column($this->square_driver->payment_hash->invoices(), 'invoice_id')))->withTrashed()->first();
 | 
			
		||||
 | 
			
		||||
        if ($invoice) {
 | 
			
		||||
            $description = "Invoice {$invoice->number} for {$amount} for client {$this->square_driver->client->present()->name()}";
 | 
			
		||||
        } else {
 | 
			
		||||
            $description = "Payment with no invoice for amount {$amount} for client {$this->square_driver->client->present()->name()}";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $amount_money = new \Square\Models\Money();
 | 
			
		||||
        $amount_money->setAmount($amount);
 | 
			
		||||
        $amount_money->setCurrency($this->square_driver->client->currency()->code);
 | 
			
		||||
 | 
			
		||||
        $body = new \Square\Models\CreatePaymentRequest($token, $request->idempotencyKey, $amount_money);
 | 
			
		||||
 | 
			
		||||
        $body = new \Square\Models\CreatePaymentRequest($token, $request->idempotencyKey);
 | 
			
		||||
        $body->setAmountMoney($amount_money);
 | 
			
		||||
        $body->setAutocomplete(true);
 | 
			
		||||
        $body->setLocationId($this->square_driver->company_gateway->getConfigField('locationId'));
 | 
			
		||||
        $body->setReferenceId(Str::random(16));
 | 
			
		||||
        $body->setReferenceId($this->square_driver->payment_hash->hash);
 | 
			
		||||
        $body->setNote($description);
 | 
			
		||||
        
 | 
			
		||||
        if ($request->shouldUseToken()) {
 | 
			
		||||
            $body->setCustomerId($cgt->gateway_customer_reference);
 | 
			
		||||
@ -123,7 +129,6 @@ class CreditCard implements MethodInterface
 | 
			
		||||
            $body->setVerificationToken($request->input('verificationToken'));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /** @var ApiResponse */
 | 
			
		||||
        $response = $this->square_driver->square->getPaymentsApi()->createPayment($body);
 | 
			
		||||
 | 
			
		||||
        if ($response->isSuccess()) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										280
									
								
								app/PaymentDrivers/Square/SquareWebhook.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										280
									
								
								app/PaymentDrivers/Square/SquareWebhook.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,280 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Invoice Ninja (https://invoiceninja.com).
 | 
			
		||||
 *
 | 
			
		||||
 * @link https://github.com/invoiceninja/invoiceninja source repository
 | 
			
		||||
 *
 | 
			
		||||
 * @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
 | 
			
		||||
 *
 | 
			
		||||
 * @license https://www.elastic.co/licensing/elastic-license
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace App\PaymentDrivers\Square;
 | 
			
		||||
 | 
			
		||||
use App\Models\Payment;
 | 
			
		||||
use App\Models\SystemLog;
 | 
			
		||||
use App\Libraries\MultiDB;
 | 
			
		||||
use App\Models\GatewayType;
 | 
			
		||||
use App\Models\PaymentHash;
 | 
			
		||||
use App\Models\PaymentType;
 | 
			
		||||
use Illuminate\Bus\Queueable;
 | 
			
		||||
use App\Models\CompanyGateway;
 | 
			
		||||
use App\Jobs\Util\SystemLogger;
 | 
			
		||||
use App\Jobs\Mail\PaymentFailedMailer;
 | 
			
		||||
use Illuminate\Queue\SerializesModels;
 | 
			
		||||
use App\PaymentDrivers\Stripe\Utilities;
 | 
			
		||||
use Illuminate\Queue\InteractsWithQueue;
 | 
			
		||||
use App\PaymentDrivers\SquarePaymentDriver;
 | 
			
		||||
use Illuminate\Contracts\Queue\ShouldQueue;
 | 
			
		||||
use Illuminate\Foundation\Bus\Dispatchable;
 | 
			
		||||
 | 
			
		||||
class SquareWebhook implements ShouldQueue
 | 
			
		||||
{
 | 
			
		||||
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Utilities;
 | 
			
		||||
 | 
			
		||||
    public $tries = 1;
 | 
			
		||||
 | 
			
		||||
    public $deleteWhenMissingModels = true;
 | 
			
		||||
 | 
			
		||||
    public CompanyGateway $company_gateway;
 | 
			
		||||
 | 
			
		||||
    public SquarePaymentDriver $driver;
 | 
			
		||||
 | 
			
		||||
    public \Square\SquareClient $square;
 | 
			
		||||
 | 
			
		||||
    private array $source_type = [
 | 
			
		||||
        'CARD' => PaymentType::CREDIT_CARD_OTHER, 
 | 
			
		||||
        'BANK_ACCOUNT' => PaymentType::ACH, 
 | 
			
		||||
        'WALLET' => PaymentType::CREDIT_CARD_OTHER, 
 | 
			
		||||
        'BUY_NOW_PAY_LATER' => PaymentType::CREDIT_CARD_OTHER, 
 | 
			
		||||
        'SQUARE_ACCOUNT' => PaymentType::CREDIT_CARD_OTHER, 
 | 
			
		||||
        'CASH' => PaymentType::CASH, 
 | 
			
		||||
        'EXTERNAL' =>PaymentType::CREDIT_CARD_OTHER 
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    public function __construct(public array $webhook_array, public string $company_key, public int $company_gateway_id)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * {
 | 
			
		||||
  * "merchant_id": "6SSW7HV8K2ST5",
 | 
			
		||||
  * "type": "payment.created",
 | 
			
		||||
  * "event_id": "13b867cf-db3d-4b1c-90b6-2f32a9d78124",
 | 
			
		||||
  * "created_at": "2020-02-06T21:27:30.792Z",
 | 
			
		||||
  * "data": {
 | 
			
		||||
    * "type": "payment",
 | 
			
		||||
    * "id": "KkAkhdMsgzn59SM8A89WgKwekxLZY",
 | 
			
		||||
    * "object": {
 | 
			
		||||
      * "payment": {
 | 
			
		||||
        * "id": "hYy9pRFVxpDsO1FB05SunFWUe9JZY",
 | 
			
		||||
        * "created_at": "2020-11-22T21:16:51.086Z",
 | 
			
		||||
        * "updated_at": "2020-11-22T21:16:51.198Z",
 | 
			
		||||
        * "amount_money": {
 | 
			
		||||
          * "amount": 100,
 | 
			
		||||
          * "currency": "USD"
 | 
			
		||||
        * },
 | 
			
		||||
        * "status": "APPROVED",
 | 
			
		||||
        * "delay_duration": "PT168H",
 | 
			
		||||
        * "source_type": "CARD",
 | 
			
		||||
        * "card_details": {
 | 
			
		||||
          * "status": "AUTHORIZED",
 | 
			
		||||
          * "card": {
 | 
			
		||||
            * "card_brand": "MASTERCARD",
 | 
			
		||||
            * "last_4": "9029",
 | 
			
		||||
            * "exp_month": 11,
 | 
			
		||||
            * "exp_year": 2022,
 | 
			
		||||
            * "fingerprint": "sq-1-Tvruf3vPQxlvI6n0IcKYfBukrcv6IqWr8UyBdViWXU2yzGn5VMJvrsHMKpINMhPmVg",
 | 
			
		||||
            * "card_type": "CREDIT",
 | 
			
		||||
            * "prepaid_type": "NOT_PREPAID",
 | 
			
		||||
            * "bin": "540988"
 | 
			
		||||
          * },
 | 
			
		||||
          * "entry_method": "KEYED",
 | 
			
		||||
          * "cvv_status": "CVV_ACCEPTED",
 | 
			
		||||
          * "avs_status": "AVS_ACCEPTED",
 | 
			
		||||
          * "statement_description": "SQ *DEFAULT TEST ACCOUNT",
 | 
			
		||||
          * "card_payment_timeline": {
 | 
			
		||||
          * "authorized_at": "2020-11-22T21:16:51.198Z"
 | 
			
		||||
          *     
 | 
			
		||||
        */
 | 
			
		||||
    public function handle()
 | 
			
		||||
    {
 | 
			
		||||
        nlog("Square Webhook");
 | 
			
		||||
 | 
			
		||||
        MultiDB::findAndSetDbByCompanyKey($this->company_key);
 | 
			
		||||
 | 
			
		||||
        $this->company_gateway = CompanyGateway::query()->withTrashed()->find($this->company_gateway_id);
 | 
			
		||||
        $this->driver = $this->company_gateway->driver()->init();
 | 
			
		||||
        $this->square = $this->driver->square;
 | 
			
		||||
 | 
			
		||||
        $status = $this->webhook_array['data']['object']['payment']['status'] ?? false;
 | 
			
		||||
        $payment_id = $this->webhook_array['data']['object']['payment']['id'] ?? null;
 | 
			
		||||
 | 
			
		||||
        $payment_status = false;
 | 
			
		||||
 | 
			
		||||
        match($status){
 | 
			
		||||
            'APPROVED' => $payment_status = false,
 | 
			
		||||
            'COMPLETED' => $payment_status = Payment::STATUS_COMPLETED,
 | 
			
		||||
            'PENDING' => $payment_status = Payment::STATUS_PENDING,
 | 
			
		||||
            'CANCELED' => $payment_status = Payment::STATUS_CANCELLED,
 | 
			
		||||
            'FAILED' => $payment_status = Payment::STATUS_FAILED,
 | 
			
		||||
            default => $payment_status = false,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if(!$payment_status){
 | 
			
		||||
            nlog("Square Webhook - Payment Status Not Found or not worthy of processing");
 | 
			
		||||
            nlog($this->webhook_array);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $payment = $this->retrieveOrCreatePayment($payment_id, $payment_status);
 | 
			
		||||
 | 
			
		||||
        /** If the status was pending and now is reporting as Failed / Cancelled - process failure path */
 | 
			
		||||
        if($payment->status_id == Payment::STATUS_PENDING && in_array($payment_status, [Payment::STATUS_CANCELLED, Payment::STATUS_FAILED])){
 | 
			
		||||
            $payment->service()->deletePayment();
 | 
			
		||||
 | 
			
		||||
            if ($this->driver->payment_hash) {
 | 
			
		||||
                $error = ctrans('texts.client_payment_failure_body', [
 | 
			
		||||
                    'invoice' => implode(',', $payment->invoices->pluck('number')->toArray()),
 | 
			
		||||
                    'amount' => array_sum(array_column($this->driver->payment_hash->invoices(), 'amount')) + $this->driver->payment_hash->fee_total, 
 | 
			
		||||
                ]);
 | 
			
		||||
            } else {
 | 
			
		||||
                $error = 'Payment for '.$payment->client->present()->name()." for {$payment->amount} failed";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            PaymentFailedMailer::dispatch(
 | 
			
		||||
                $this->driver->payment_hash,
 | 
			
		||||
                $this->driver->client->company,
 | 
			
		||||
                $this->driver->client,
 | 
			
		||||
                $error
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        elseif($payment->status_id == Payment::STATUS_PENDING && in_array($payment_status, [Payment::STATUS_COMPLETED, Payment::STATUS_COMPLETED])){
 | 
			
		||||
            $payment->status_id = Payment::STATUS_COMPLETED;
 | 
			
		||||
            $payment->save();
 | 
			
		||||
        }
 | 
			
		||||
            
 | 
			
		||||
        //toggle pending to completed.
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function retrieveOrCreatePayment(?string $payment_reference, int $payment_status): ?\App\Models\Payment
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        $payment = Payment::withTrashed()->where('transaction_reference', $payment_reference)->first();
 | 
			
		||||
 | 
			
		||||
        if($payment)
 | 
			
		||||
            return $payment;
 | 
			
		||||
 | 
			
		||||
        /** Handles the edge case where for some reason the payment has not yet been recorded in Invoice Ninja */
 | 
			
		||||
        $apiResponse = $this->square->getPaymentsApi()->getPayment($payment_reference);
 | 
			
		||||
 | 
			
		||||
// {
 | 
			
		||||
//   "payment": {
 | 
			
		||||
//     "id": "bP9mAsEMYPUGjjGNaNO5ZDVyLhSZY",
 | 
			
		||||
//     "created_at": "2021-10-13T19:34:33.524Z",
 | 
			
		||||
//     "updated_at": "2021-10-13T19:34:34.339Z",
 | 
			
		||||
//     "amount_money": {
 | 
			
		||||
//       "amount": 555,
 | 
			
		||||
//       "currency": "USD"
 | 
			
		||||
//     },
 | 
			
		||||
//     "status": "COMPLETED",
 | 
			
		||||
//     "delay_duration": "PT168H",
 | 
			
		||||
//     "source_type": "CARD",
 | 
			
		||||
//     "card_details": {
 | 
			
		||||
//       "status": "CAPTURED",
 | 
			
		||||
//       "card": {
 | 
			
		||||
//         "card_brand": "VISA",
 | 
			
		||||
//         "last_4": "1111",
 | 
			
		||||
//         "exp_month": 11,
 | 
			
		||||
//         "exp_year": 2022,
 | 
			
		||||
//         "fingerprint": "sq-1-Hxim77tbdcbGejOejnoAklBVJed2YFLTmirfl8Q5XZzObTc8qY_U8RkwzoNL8dCEcQ",
 | 
			
		||||
//         "card_type": "DEBIT",
 | 
			
		||||
//         "prepaid_type": "NOT_PREPAID",
 | 
			
		||||
//         "bin": "411111"
 | 
			
		||||
//       },
 | 
			
		||||
//       "entry_method": "KEYED",
 | 
			
		||||
//       "cvv_status": "CVV_ACCEPTED",
 | 
			
		||||
//       "avs_status": "AVS_ACCEPTED",
 | 
			
		||||
//       "auth_result_code": "2Nkw7q",
 | 
			
		||||
//       "statement_description": "SQ *EXAMPLE TEST GOSQ.C",
 | 
			
		||||
//       "card_payment_timeline": {
 | 
			
		||||
//         "authorized_at": "2021-10-13T19:34:33.680Z",
 | 
			
		||||
//         "captured_at": "2021-10-13T19:34:34.340Z"
 | 
			
		||||
//       }
 | 
			
		||||
//     },
 | 
			
		||||
//     "location_id": "L88917AVBK2S5",
 | 
			
		||||
//     "order_id": "d7eKah653Z579f3gVtjlxpSlmUcZY",
 | 
			
		||||
//     "processing_fee": [
 | 
			
		||||
//       {
 | 
			
		||||
//         "effective_at": "2021-10-13T21:34:35.000Z",
 | 
			
		||||
//         "type": "INITIAL",
 | 
			
		||||
//         "amount_money": {
 | 
			
		||||
//           "amount": 34,
 | 
			
		||||
//           "currency": "USD"
 | 
			
		||||
//         }
 | 
			
		||||
//       }
 | 
			
		||||
//     ],
 | 
			
		||||
//     "note": "Test Note",
 | 
			
		||||
//     "total_money": {
 | 
			
		||||
//       "amount": 555,
 | 
			
		||||
//       "currency": "USD"
 | 
			
		||||
//     },
 | 
			
		||||
//     "approved_money": {
 | 
			
		||||
//       "amount": 555,
 | 
			
		||||
//       "currency": "USD"
 | 
			
		||||
//     },
 | 
			
		||||
//     "employee_id": "TMoK_ogh6rH1o4dV",
 | 
			
		||||
//     "receipt_number": "bP9m",
 | 
			
		||||
//     "receipt_url": "https://squareup.com/receipt/preview/bP9mAsEMYPUGjjGNaNO5ZDVyLhSZY",
 | 
			
		||||
//     "delay_action": "CANCEL",
 | 
			
		||||
//     "delayed_until": "2021-10-20T19:34:33.524Z",
 | 
			
		||||
//     "team_member_id": "TMoK_ogh6rH1o4dV",
 | 
			
		||||
//     "application_details": {
 | 
			
		||||
//       "square_product": "VIRTUAL_TERMINAL",
 | 
			
		||||
//       "application_id": "sq0ids-Pw67AZAlLVB7hsRmwlJPuA"
 | 
			
		||||
//     },
 | 
			
		||||
//     "version_token": "56pRkL3slrzet2iQrTp9n0bdJVYTB9YEWdTNjQfZOPV6o"
 | 
			
		||||
//   }
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
        if($apiResponse->isSuccess()){
 | 
			
		||||
 | 
			
		||||
            $payment_hash_id = $apiResponse->getPayment()->getReferenceId() ?? false;
 | 
			
		||||
            $square_payment = $apiResponse->getPayment()->jsonSerialize();
 | 
			
		||||
            $payment_hash = PaymentHash::where('hash', $payment_hash_id)->firstOrFail();
 | 
			
		||||
 | 
			
		||||
            $payment_hash->data = array_merge((array) $payment_hash->data, (array)$square_payment);
 | 
			
		||||
            $payment_hash->save();
 | 
			
		||||
 | 
			
		||||
            $this->driver->setPaymentHash($payment_hash);
 | 
			
		||||
            $this->driver->setClient($payment_hash->fee_invoice->client);
 | 
			
		||||
 | 
			
		||||
            $data = [
 | 
			
		||||
                'payment_type' => $this->source_type[$square_payment->source_type],
 | 
			
		||||
                'amount' => $payment_hash->amount_with_fee,
 | 
			
		||||
                'transaction_reference' => $square_payment->id,
 | 
			
		||||
                'gateway_type_id' => GatewayType::BANK_TRANSFER,
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
            $payment = $this->driver->createPayment($data, $payment_status);
 | 
			
		||||
 | 
			
		||||
            SystemLogger::dispatch(
 | 
			
		||||
                ['response' => $this->webhook_array, 'data' => $square_payment],
 | 
			
		||||
                SystemLog::CATEGORY_GATEWAY_RESPONSE,
 | 
			
		||||
                SystemLog::EVENT_GATEWAY_SUCCESS,
 | 
			
		||||
                SystemLog::TYPE_SQUARE,
 | 
			
		||||
                $this->driver->client,
 | 
			
		||||
                $this->driver->client->company,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            return $payment;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            nlog("Square Webhook - Payment not found: $payment_reference");
 | 
			
		||||
            nlog($apiResponse->getErrors());
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -11,18 +11,22 @@
 | 
			
		||||
 | 
			
		||||
namespace App\PaymentDrivers;
 | 
			
		||||
 | 
			
		||||
use App\Http\Requests\Payments\PaymentWebhookRequest;
 | 
			
		||||
use App\Jobs\Util\SystemLogger;
 | 
			
		||||
use App\Models\ClientGatewayToken;
 | 
			
		||||
use App\Models\GatewayType;
 | 
			
		||||
use App\Models\Invoice;
 | 
			
		||||
use App\Models\Payment;
 | 
			
		||||
use App\Models\SystemLog;
 | 
			
		||||
use App\Models\GatewayType;
 | 
			
		||||
use App\Models\PaymentHash;
 | 
			
		||||
use App\Models\PaymentType;
 | 
			
		||||
use App\Models\SystemLog;
 | 
			
		||||
use App\PaymentDrivers\Square\CreditCard;
 | 
			
		||||
use App\Jobs\Util\SystemLogger;
 | 
			
		||||
use App\Utils\Traits\MakesHash;
 | 
			
		||||
use Square\Http\ApiResponse;
 | 
			
		||||
use Square\Utils\WebhooksHelper;
 | 
			
		||||
use App\Models\ClientGatewayToken;
 | 
			
		||||
use Square\Models\WebhookSubscription;
 | 
			
		||||
use App\PaymentDrivers\Square\CreditCard;
 | 
			
		||||
use App\PaymentDrivers\Square\SquareWebhook;
 | 
			
		||||
use Square\Models\CreateWebhookSubscriptionRequest;
 | 
			
		||||
use App\Http\Requests\Payments\PaymentWebhookRequest;
 | 
			
		||||
use Square\Models\Builders\RefundPaymentRequestBuilder;
 | 
			
		||||
 | 
			
		||||
class SquarePaymentDriver extends BaseDriver
 | 
			
		||||
{
 | 
			
		||||
@ -96,15 +100,115 @@ class SquarePaymentDriver extends BaseDriver
 | 
			
		||||
    public function refund(Payment $payment, $amount, $return_client_response = false)
 | 
			
		||||
    {
 | 
			
		||||
        $this->init();
 | 
			
		||||
        $this->client = $payment->client;
 | 
			
		||||
 | 
			
		||||
        $amount_money = new \Square\Models\Money();
 | 
			
		||||
        $amount_money->setAmount($this->convertAmount($amount));
 | 
			
		||||
        $amount_money->setCurrency($this->client->currency()->code);
 | 
			
		||||
 | 
			
		||||
        $body = new \Square\Models\RefundPaymentRequest(\Illuminate\Support\Str::random(32), $amount_money, $payment->transaction_reference);
 | 
			
		||||
        $body = RefundPaymentRequestBuilder::init(\Illuminate\Support\Str::random(32), $amount_money)
 | 
			
		||||
                ->paymentId($payment->transaction_reference)
 | 
			
		||||
                ->reason('Refund Request')
 | 
			
		||||
                ->build();
 | 
			
		||||
 | 
			
		||||
        $apiResponse = $this->square->getRefundsApi()->refundPayment($body);
 | 
			
		||||
 | 
			
		||||
        if ($apiResponse->isSuccess()) {
 | 
			
		||||
 | 
			
		||||
            $refundPaymentResponse = $apiResponse->getResult();
 | 
			
		||||
 | 
			
		||||
            nlog($refundPaymentResponse);
 | 
			
		||||
 | 
			
		||||
            /**
 | 
			
		||||
            * - `PENDING` - Awaiting approval.
 | 
			
		||||
            * - `COMPLETED` - Successfully completed.
 | 
			
		||||
            * - `REJECTED` - The refund was rejected.
 | 
			
		||||
            * - `FAILED` - An error occurred.
 | 
			
		||||
            */
 | 
			
		||||
 | 
			
		||||
            $status = $refundPaymentResponse->getRefund()->getStatus();
 | 
			
		||||
 | 
			
		||||
            if(in_array($status, ['COMPLETED', 'PENDING'])){
 | 
			
		||||
 | 
			
		||||
                $transaction_reference = $refundPaymentResponse->getRefund()->getId();
 | 
			
		||||
 | 
			
		||||
                $data = [
 | 
			
		||||
                    'transaction_reference' => $transaction_reference,
 | 
			
		||||
                    'transaction_response' => json_encode($refundPaymentResponse->getRefund()->jsonSerialize()),
 | 
			
		||||
                    'success' => true,
 | 
			
		||||
                    'description' => $refundPaymentResponse->getRefund()->getReason(),
 | 
			
		||||
                    'code' => $refundPaymentResponse->getRefund()->getReason(),
 | 
			
		||||
                ];
 | 
			
		||||
 | 
			
		||||
                SystemLogger::dispatch(
 | 
			
		||||
                    [
 | 
			
		||||
                        'server_response' => $data,
 | 
			
		||||
                        'data' => request()->all()
 | 
			
		||||
                    ],
 | 
			
		||||
                    SystemLog::CATEGORY_GATEWAY_RESPONSE,
 | 
			
		||||
                    SystemLog::EVENT_GATEWAY_SUCCESS,
 | 
			
		||||
                    SystemLog::TYPE_SQUARE,
 | 
			
		||||
                    $this->client,
 | 
			
		||||
                    $this->client->company
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                return $data;
 | 
			
		||||
            }
 | 
			
		||||
            elseif(in_array($status, ['REJECTED', 'FAILED'])) {
 | 
			
		||||
 | 
			
		||||
                $transaction_reference = $refundPaymentResponse->getRefund()->getId();
 | 
			
		||||
 | 
			
		||||
                $data = [
 | 
			
		||||
                    'transaction_reference' => $transaction_reference,
 | 
			
		||||
                    'transaction_response' => json_encode($refundPaymentResponse->getRefund()->jsonSerialize()),
 | 
			
		||||
                    'success' => false,
 | 
			
		||||
                    'description' => $refundPaymentResponse->getRefund()->getReason(),
 | 
			
		||||
                    'code' => $refundPaymentResponse->getRefund()->getReason(),
 | 
			
		||||
                ];
 | 
			
		||||
 | 
			
		||||
                SystemLogger::dispatch(
 | 
			
		||||
                    [
 | 
			
		||||
                        'server_response' => $data,
 | 
			
		||||
                        'data' => request()->all()
 | 
			
		||||
                    ],
 | 
			
		||||
                    SystemLog::CATEGORY_GATEWAY_RESPONSE,
 | 
			
		||||
                    SystemLog::EVENT_GATEWAY_FAILURE,
 | 
			
		||||
                    SystemLog::TYPE_SQUARE,
 | 
			
		||||
                    $this->client,
 | 
			
		||||
                    $this->client->company
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                return $data;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
            
 | 
			
		||||
            /** @var \Square\Models\Error $error */
 | 
			
		||||
            $error = end($apiResponse->getErrors());
 | 
			
		||||
 | 
			
		||||
            $data = [
 | 
			
		||||
                    'transaction_reference' => $payment->transaction_reference,
 | 
			
		||||
                    'transaction_response' => $error->jsonSerialize(),
 | 
			
		||||
                    'success' => false,
 | 
			
		||||
                    'description' => $error->getDetail(),
 | 
			
		||||
                    'code' => $error->getCode(),
 | 
			
		||||
                ];
 | 
			
		||||
 | 
			
		||||
                SystemLogger::dispatch(
 | 
			
		||||
                    [
 | 
			
		||||
                        'server_response' => $data,
 | 
			
		||||
                        'data' => request()->all()
 | 
			
		||||
                    ],
 | 
			
		||||
                    SystemLog::CATEGORY_GATEWAY_RESPONSE,
 | 
			
		||||
                    SystemLog::EVENT_GATEWAY_FAILURE,
 | 
			
		||||
                    SystemLog::TYPE_SQUARE,
 | 
			
		||||
                    $this->client,
 | 
			
		||||
                    $this->client->company
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
            return $data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /** @var ApiResponse */
 | 
			
		||||
        $response = $this->square->getRefundsApi()->refund($body);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash)
 | 
			
		||||
@ -126,10 +230,12 @@ class SquarePaymentDriver extends BaseDriver
 | 
			
		||||
        $amount_money->setAmount($amount);
 | 
			
		||||
        $amount_money->setCurrency($this->client->currency()->code);
 | 
			
		||||
 | 
			
		||||
        $body = new \Square\Models\CreatePaymentRequest($cgt->token, \Illuminate\Support\Str::random(32), $amount_money);
 | 
			
		||||
        $body = new \Square\Models\CreatePaymentRequest($cgt->token, \Illuminate\Support\Str::random(32));
 | 
			
		||||
        $body->setCustomerId($cgt->gateway_customer_reference);
 | 
			
		||||
        $body->setAmountMoney($amount_money);
 | 
			
		||||
        $body->setReferenceId($payment_hash->hash);
 | 
			
		||||
        $body->setNote(substr($description,0,500));
 | 
			
		||||
 | 
			
		||||
        /** @var ApiResponse */
 | 
			
		||||
        $response = $this->square->getPaymentsApi()->createPayment($body);
 | 
			
		||||
        $body = json_decode($response->getBody());
 | 
			
		||||
 | 
			
		||||
@ -177,8 +283,107 @@ class SquarePaymentDriver extends BaseDriver
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null)
 | 
			
		||||
    public function checkWebhooks(): bool
 | 
			
		||||
    {
 | 
			
		||||
        $this->init();
 | 
			
		||||
        
 | 
			
		||||
        $api_response = $this->square->getWebhookSubscriptionsApi()->listWebhookSubscriptions();
 | 
			
		||||
 | 
			
		||||
        if ($api_response->isSuccess()) {
 | 
			
		||||
            
 | 
			
		||||
            //array of WebhookSubscription objects
 | 
			
		||||
            foreach($api_response->getResult()->getSubscriptions() as $subscription)
 | 
			
		||||
            {
 | 
			
		||||
                if($subscription->getName() == 'Invoice_Ninja_Webhook_Subscription')
 | 
			
		||||
                    return true;  
 | 
			
		||||
            }
 | 
			
		||||
                       
 | 
			
		||||
        } else {
 | 
			
		||||
            $errors = $api_response->getErrors();
 | 
			
		||||
            nlog($errors);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // {
 | 
			
		||||
    //   "subscription": {
 | 
			
		||||
    //     "id": "wbhk_b35f6b3145074cf9ad513610786c19d5",
 | 
			
		||||
    //     "name": "Example Webhook Subscription",
 | 
			
		||||
    //     "enabled": true,
 | 
			
		||||
    //     "event_types": [
 | 
			
		||||
    //         "payment.created",
 | 
			
		||||
    //         "order.updated",
 | 
			
		||||
    //         "invoice.created"
 | 
			
		||||
    //     ],
 | 
			
		||||
    //     "notification_url": "https://example-webhook-url.com",
 | 
			
		||||
    //     "api_version": "2021-12-15",
 | 
			
		||||
    //     "signature_key": "1k9bIJKCeTmSQwyagtNRLg",
 | 
			
		||||
    //     "created_at": "2022-08-17 23:29:48 +0000 UTC",
 | 
			
		||||
    //     "updated_at": "2022-08-17 23:29:48 +0000 UTC"
 | 
			
		||||
    //   }
 | 
			
		||||
    // }
 | 
			
		||||
    public function createWebhooks(): void
 | 
			
		||||
    {
 | 
			
		||||
        
 | 
			
		||||
        if($this->checkWebhooks())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        $this->init();
 | 
			
		||||
 | 
			
		||||
        $event_types = ['payment.created', 'payment.updated'];
 | 
			
		||||
        $subscription = new WebhookSubscription();
 | 
			
		||||
        $subscription->setName('Invoice_Ninja_Webhook_Subscription');
 | 
			
		||||
        $subscription->setEventTypes($event_types);
 | 
			
		||||
 | 
			
		||||
        // $subscription->setNotificationUrl('https://invoicing.co');
 | 
			
		||||
 | 
			
		||||
        $subscription->setNotificationUrl($this->company_gateway->webhookUrl());
 | 
			
		||||
        // $subscription->setApiVersion('2021-12-15');
 | 
			
		||||
 | 
			
		||||
        $body = new CreateWebhookSubscriptionRequest($subscription);
 | 
			
		||||
        $body->setIdempotencyKey(\Illuminate\Support\Str::uuid());
 | 
			
		||||
 | 
			
		||||
        $api_response = $this->square->getWebhookSubscriptionsApi()->createWebhookSubscription($body);
 | 
			
		||||
 | 
			
		||||
        if ($api_response->isSuccess()) {
 | 
			
		||||
            $subscription = $api_response->getResult()->getSubscription();
 | 
			
		||||
            $signatureKey = $subscription->getSignatureKey();
 | 
			
		||||
 | 
			
		||||
            $this->company_gateway->setConfigField('signatureKey', $signatureKey);
 | 
			
		||||
            
 | 
			
		||||
        } else {
 | 
			
		||||
            $errors = $api_response->getErrors();
 | 
			
		||||
            nlog($errors);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function processWebhookRequest(PaymentWebhookRequest $request)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        $signature_key = $this->company_gateway->getConfigField('signatureKey');
 | 
			
		||||
        $notification_url = $this->company_gateway->webhookUrl();
 | 
			
		||||
        
 | 
			
		||||
        // header('Content-Type: text/plain');
 | 
			
		||||
        // $webhook_payload = file_get_contents('php://input');
 | 
			
		||||
 | 
			
		||||
        $body = '';   
 | 
			
		||||
        $handle = fopen('php://input', 'r');
 | 
			
		||||
        while(!feof($handle)) {
 | 
			
		||||
            $body .= fread($handle, 1024);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (WebhooksHelper::isValidWebhookEventSignature($body, $request->header('x-square-hmacsha256-signature'), $signature_key, $notification_url)) {
 | 
			
		||||
            SquareWebhook::dispatch($request->all(), $request->company_key, $this->company_gateway->id)->delay(5);
 | 
			
		||||
        } else {
 | 
			
		||||
            nlog("Square Hash Mismatch");
 | 
			
		||||
            nlog($request->all());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return response()->json(['success' => true]);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function convertAmount($amount)
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,7 @@
 | 
			
		||||
        "socialiteproviders/microsoft": "^4.1",
 | 
			
		||||
        "spatie/laravel-data": "^3.5",
 | 
			
		||||
        "sprain/swiss-qr-bill": "^3.2",
 | 
			
		||||
        "square/square": "13.0.0.20210721",
 | 
			
		||||
        "square/square": "30.0.0.*",
 | 
			
		||||
        "stripe/stripe-php": "^7.50",
 | 
			
		||||
        "symfony/http-client": "^6.0",
 | 
			
		||||
        "symfony/mailgun-mailer": "^6.1",
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										265
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										265
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							@ -4,7 +4,7 @@
 | 
			
		||||
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
			
		||||
        "This file is @generated automatically"
 | 
			
		||||
    ],
 | 
			
		||||
    "content-hash": "9d7348352c913eb82fcca2e67670e1f8",
 | 
			
		||||
    "content-hash": "673ca66ddfdb05c3ea29012594a196d3",
 | 
			
		||||
    "packages": [
 | 
			
		||||
        {
 | 
			
		||||
            "name": "adrienrn/php-mimetyper",
 | 
			
		||||
@ -99,21 +99,121 @@
 | 
			
		||||
            "time": "2023-05-02T15:11:17+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "apimatic/jsonmapper",
 | 
			
		||||
            "version": "v2.0.3",
 | 
			
		||||
            "name": "apimatic/core",
 | 
			
		||||
            "version": "0.3.2",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/apimatic/jsonmapper.git",
 | 
			
		||||
                "reference": "f7588f1ab692c402a9118e65cb9fd42b74e5e0db"
 | 
			
		||||
                "url": "https://github.com/apimatic/core-lib-php.git",
 | 
			
		||||
                "reference": "32238fb83ce9a3ebef38c726b497c0f218d6e6c9"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/apimatic/jsonmapper/zipball/f7588f1ab692c402a9118e65cb9fd42b74e5e0db",
 | 
			
		||||
                "reference": "f7588f1ab692c402a9118e65cb9fd42b74e5e0db",
 | 
			
		||||
                "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/32238fb83ce9a3ebef38c726b497c0f218d6e6c9",
 | 
			
		||||
                "reference": "32238fb83ce9a3ebef38c726b497c0f218d6e6c9",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "apimatic/core-interfaces": "~0.1.0",
 | 
			
		||||
                "apimatic/jsonmapper": "^3.1.1",
 | 
			
		||||
                "ext-curl": "*",
 | 
			
		||||
                "ext-dom": "*",
 | 
			
		||||
                "ext-json": "*",
 | 
			
		||||
                "ext-libxml": "*",
 | 
			
		||||
                "php": "^7.2 || ^8.0",
 | 
			
		||||
                "php-jsonpointer/php-jsonpointer": "^3.0.2"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "phpunit/phpunit": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
 | 
			
		||||
                "phan/phan": "5.4.2",
 | 
			
		||||
                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
 | 
			
		||||
                "squizlabs/php_codesniffer": "^3.5"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "psr-4": {
 | 
			
		||||
                    "Core\\": "src/"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packagist.org/downloads/",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "MIT"
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Core logic and the utilities for the Apimatic's PHP SDK",
 | 
			
		||||
            "homepage": "https://github.com/apimatic/core-lib-php",
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "apimatic",
 | 
			
		||||
                "core",
 | 
			
		||||
                "corelib",
 | 
			
		||||
                "php"
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "issues": "https://github.com/apimatic/core-lib-php/issues",
 | 
			
		||||
                "source": "https://github.com/apimatic/core-lib-php/tree/0.3.2"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2023-07-11T09:30:32+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "apimatic/core-interfaces",
 | 
			
		||||
            "version": "0.1.2",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/apimatic/core-interfaces-php.git",
 | 
			
		||||
                "reference": "183214195a79784c382a446795c46ca8c1f43cc1"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/apimatic/core-interfaces-php/zipball/183214195a79784c382a446795c46ca8c1f43cc1",
 | 
			
		||||
                "reference": "183214195a79784c382a446795c46ca8c1f43cc1",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "php": "^7.2 || ^8.0"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "psr-4": {
 | 
			
		||||
                    "CoreInterfaces\\": "src/"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packagist.org/downloads/",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "MIT"
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Definition of the behavior of apimatic/core, apimatic/unirest-php and Apimatic's PHP SDK",
 | 
			
		||||
            "homepage": "https://github.com/apimatic/core-interfaces-php",
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "apimatic",
 | 
			
		||||
                "core",
 | 
			
		||||
                "corelib",
 | 
			
		||||
                "interface",
 | 
			
		||||
                "php",
 | 
			
		||||
                "unirest"
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "issues": "https://github.com/apimatic/core-interfaces-php/issues",
 | 
			
		||||
                "source": "https://github.com/apimatic/core-interfaces-php/tree/0.1.2"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2023-04-04T06:40:52+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "apimatic/jsonmapper",
 | 
			
		||||
            "version": "3.1.2",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/apimatic/jsonmapper.git",
 | 
			
		||||
                "reference": "6673a946c21f2ceeec0cb60d17541c11a22bc79d"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/apimatic/jsonmapper/zipball/6673a946c21f2ceeec0cb60d17541c11a22bc79d",
 | 
			
		||||
                "reference": "6673a946c21f2ceeec0cb60d17541c11a22bc79d",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "ext-json": "*",
 | 
			
		||||
                "php": "^5.6 || ^7.0 || ^8.0"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "phpunit/phpunit": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
 | 
			
		||||
                "squizlabs/php_codesniffer": "^3.0.0"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
@ -144,37 +244,38 @@
 | 
			
		||||
            "support": {
 | 
			
		||||
                "email": "mehdi.jaffery@apimatic.io",
 | 
			
		||||
                "issues": "https://github.com/apimatic/jsonmapper/issues",
 | 
			
		||||
                "source": "https://github.com/apimatic/jsonmapper/tree/v2.0.3"
 | 
			
		||||
                "source": "https://github.com/apimatic/jsonmapper/tree/3.1.2"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2021-07-16T09:02:23+00:00"
 | 
			
		||||
            "time": "2023-06-08T04:27:10+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "apimatic/unirest-php",
 | 
			
		||||
            "version": "2.3.0",
 | 
			
		||||
            "version": "4.0.5",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/apimatic/unirest-php.git",
 | 
			
		||||
                "reference": "52e226fb3b7081dc9ef64aee876142a240a5f0f9"
 | 
			
		||||
                "reference": "e16754010c16be5473289470f129d87a0f41b55e"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/apimatic/unirest-php/zipball/52e226fb3b7081dc9ef64aee876142a240a5f0f9",
 | 
			
		||||
                "reference": "52e226fb3b7081dc9ef64aee876142a240a5f0f9",
 | 
			
		||||
                "url": "https://api.github.com/repos/apimatic/unirest-php/zipball/e16754010c16be5473289470f129d87a0f41b55e",
 | 
			
		||||
                "reference": "e16754010c16be5473289470f129d87a0f41b55e",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "apimatic/core-interfaces": "^0.1.0",
 | 
			
		||||
                "ext-curl": "*",
 | 
			
		||||
                "php": ">=5.6.0"
 | 
			
		||||
                "ext-json": "*",
 | 
			
		||||
                "php": "^7.2 || ^8.0"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "phpunit/phpunit": "^5 || ^6 || ^7 || ^8 || ^9"
 | 
			
		||||
            },
 | 
			
		||||
            "suggest": {
 | 
			
		||||
                "ext-json": "Allows using JSON Bodies for sending and parsing requests"
 | 
			
		||||
                "phan/phan": "5.4.2",
 | 
			
		||||
                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
 | 
			
		||||
                "squizlabs/php_codesniffer": "^3.5"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "psr-0": {
 | 
			
		||||
                "psr-4": {
 | 
			
		||||
                    "Unirest\\": "src/"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
@ -208,9 +309,9 @@
 | 
			
		||||
            "support": {
 | 
			
		||||
                "email": "opensource@apimatic.io",
 | 
			
		||||
                "issues": "https://github.com/apimatic/unirest-php/issues",
 | 
			
		||||
                "source": "https://github.com/apimatic/unirest-php/tree/2.3.0"
 | 
			
		||||
                "source": "https://github.com/apimatic/unirest-php/tree/4.0.5"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2022-06-15T08:29:49+00:00"
 | 
			
		||||
            "time": "2023-04-25T14:19:45+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "asm/php-ansible",
 | 
			
		||||
@ -424,16 +525,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "aws/aws-sdk-php",
 | 
			
		||||
            "version": "3.279.0",
 | 
			
		||||
            "version": "3.279.2",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/aws/aws-sdk-php.git",
 | 
			
		||||
                "reference": "7b3d38cfccd393add0ea0ce281de91846967c61e"
 | 
			
		||||
                "reference": "ebd5e47c5be0425bb5cf4f80737850ed74767107"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7b3d38cfccd393add0ea0ce281de91846967c61e",
 | 
			
		||||
                "reference": "7b3d38cfccd393add0ea0ce281de91846967c61e",
 | 
			
		||||
                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/ebd5e47c5be0425bb5cf4f80737850ed74767107",
 | 
			
		||||
                "reference": "ebd5e47c5be0425bb5cf4f80737850ed74767107",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -513,9 +614,9 @@
 | 
			
		||||
            "support": {
 | 
			
		||||
                "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
 | 
			
		||||
                "issues": "https://github.com/aws/aws-sdk-php/issues",
 | 
			
		||||
                "source": "https://github.com/aws/aws-sdk-php/tree/3.279.0"
 | 
			
		||||
                "source": "https://github.com/aws/aws-sdk-php/tree/3.279.2"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2023-08-16T18:18:34+00:00"
 | 
			
		||||
            "time": "2023-08-18T18:13:09+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "bacon/bacon-qr-code",
 | 
			
		||||
@ -1351,16 +1452,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "doctrine/dbal",
 | 
			
		||||
            "version": "3.6.5",
 | 
			
		||||
            "version": "3.6.6",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/doctrine/dbal.git",
 | 
			
		||||
                "reference": "96d5a70fd91efdcec81fc46316efc5bf3da17ddf"
 | 
			
		||||
                "reference": "63646ffd71d1676d2f747f871be31b7e921c7864"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/doctrine/dbal/zipball/96d5a70fd91efdcec81fc46316efc5bf3da17ddf",
 | 
			
		||||
                "reference": "96d5a70fd91efdcec81fc46316efc5bf3da17ddf",
 | 
			
		||||
                "url": "https://api.github.com/repos/doctrine/dbal/zipball/63646ffd71d1676d2f747f871be31b7e921c7864",
 | 
			
		||||
                "reference": "63646ffd71d1676d2f747f871be31b7e921c7864",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -1376,10 +1477,11 @@
 | 
			
		||||
                "doctrine/coding-standard": "12.0.0",
 | 
			
		||||
                "fig/log-test": "^1",
 | 
			
		||||
                "jetbrains/phpstorm-stubs": "2023.1",
 | 
			
		||||
                "phpstan/phpstan": "1.10.21",
 | 
			
		||||
                "phpstan/phpstan": "1.10.29",
 | 
			
		||||
                "phpstan/phpstan-strict-rules": "^1.5",
 | 
			
		||||
                "phpunit/phpunit": "9.6.9",
 | 
			
		||||
                "psalm/plugin-phpunit": "0.18.4",
 | 
			
		||||
                "slevomat/coding-standard": "8.13.1",
 | 
			
		||||
                "squizlabs/php_codesniffer": "3.7.2",
 | 
			
		||||
                "symfony/cache": "^5.4|^6.0",
 | 
			
		||||
                "symfony/console": "^4.4|^5.4|^6.0",
 | 
			
		||||
@ -1443,7 +1545,7 @@
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "issues": "https://github.com/doctrine/dbal/issues",
 | 
			
		||||
                "source": "https://github.com/doctrine/dbal/tree/3.6.5"
 | 
			
		||||
                "source": "https://github.com/doctrine/dbal/tree/3.6.6"
 | 
			
		||||
            },
 | 
			
		||||
            "funding": [
 | 
			
		||||
                {
 | 
			
		||||
@ -1459,7 +1561,7 @@
 | 
			
		||||
                    "type": "tidelift"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2023-07-17T09:15:50+00:00"
 | 
			
		||||
            "time": "2023-08-17T05:38:17+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "doctrine/deprecations",
 | 
			
		||||
@ -3348,16 +3450,16 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "horstoeko/zugferd",
 | 
			
		||||
            "version": "v1.0.23",
 | 
			
		||||
            "version": "v1.0.26",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/horstoeko/zugferd.git",
 | 
			
		||||
                "reference": "bb55417be4c4de8deb0113e832feeaf7b4d3984e"
 | 
			
		||||
                "reference": "2a7541a35f00499c206391273f30159dc2c7072a"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/bb55417be4c4de8deb0113e832feeaf7b4d3984e",
 | 
			
		||||
                "reference": "bb55417be4c4de8deb0113e832feeaf7b4d3984e",
 | 
			
		||||
                "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/2a7541a35f00499c206391273f30159dc2c7072a",
 | 
			
		||||
                "reference": "2a7541a35f00499c206391273f30159dc2c7072a",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
@ -3415,9 +3517,9 @@
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "issues": "https://github.com/horstoeko/zugferd/issues",
 | 
			
		||||
                "source": "https://github.com/horstoeko/zugferd/tree/v1.0.23"
 | 
			
		||||
                "source": "https://github.com/horstoeko/zugferd/tree/v1.0.26"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2023-08-16T17:39:36+00:00"
 | 
			
		||||
            "time": "2023-08-18T03:05:43+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "http-interop/http-factory-guzzle",
 | 
			
		||||
@ -7664,6 +7766,62 @@
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2020-07-07T09:29:14+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "php-jsonpointer/php-jsonpointer",
 | 
			
		||||
            "version": "v3.0.2",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/raphaelstolt/php-jsonpointer.git",
 | 
			
		||||
                "reference": "4428f86c6f23846e9faa5a420c4ef14e485b3afb"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/raphaelstolt/php-jsonpointer/zipball/4428f86c6f23846e9faa5a420c4ef14e485b3afb",
 | 
			
		||||
                "reference": "4428f86c6f23846e9faa5a420c4ef14e485b3afb",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "php": ">=5.4"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "friendsofphp/php-cs-fixer": "^1.11",
 | 
			
		||||
                "phpunit/phpunit": "4.6.*"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "extra": {
 | 
			
		||||
                "branch-alias": {
 | 
			
		||||
                    "dev-master": "2.0.x-dev"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "psr-0": {
 | 
			
		||||
                    "Rs\\Json": "src/"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packagist.org/downloads/",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "MIT"
 | 
			
		||||
            ],
 | 
			
		||||
            "authors": [
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Raphael Stolt",
 | 
			
		||||
                    "email": "raphael.stolt@gmail.com",
 | 
			
		||||
                    "homepage": "http://raphaelstolt.blogspot.com/"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Implementation of JSON Pointer (http://tools.ietf.org/html/rfc6901)",
 | 
			
		||||
            "homepage": "https://github.com/raphaelstolt/php-jsonpointer",
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "json",
 | 
			
		||||
                "json pointer",
 | 
			
		||||
                "json traversal"
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "issues": "https://github.com/raphaelstolt/php-jsonpointer/issues",
 | 
			
		||||
                "source": "https://github.com/raphaelstolt/php-jsonpointer/tree/master"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2016-08-29T08:51:01+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "phpdocumentor/reflection-common",
 | 
			
		||||
            "version": "2.2.0",
 | 
			
		||||
@ -10037,29 +10195,28 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "square/square",
 | 
			
		||||
            "version": "13.0.0.20210721",
 | 
			
		||||
            "version": "30.0.0.20230816",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/square/square-php-sdk.git",
 | 
			
		||||
                "reference": "03d90445854cd3b500f75061a9c63956799b8ecf"
 | 
			
		||||
                "reference": "fedfea8b6c6f16b6a90ef0d629743ae9ae25e13d"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/square/square-php-sdk/zipball/03d90445854cd3b500f75061a9c63956799b8ecf",
 | 
			
		||||
                "reference": "03d90445854cd3b500f75061a9c63956799b8ecf",
 | 
			
		||||
                "url": "https://api.github.com/repos/square/square-php-sdk/zipball/fedfea8b6c6f16b6a90ef0d629743ae9ae25e13d",
 | 
			
		||||
                "reference": "fedfea8b6c6f16b6a90ef0d629743ae9ae25e13d",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "apimatic/jsonmapper": "^2.0.2",
 | 
			
		||||
                "apimatic/unirest-php": "^2.0",
 | 
			
		||||
                "ext-curl": "*",
 | 
			
		||||
                "apimatic/core": "~0.3.0",
 | 
			
		||||
                "apimatic/core-interfaces": "~0.1.0",
 | 
			
		||||
                "apimatic/unirest-php": "^4.0.0",
 | 
			
		||||
                "ext-json": "*",
 | 
			
		||||
                "ext-mbstring": "*",
 | 
			
		||||
                "php": ">=7.2"
 | 
			
		||||
                "php": "^7.2 || ^8.0"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "phan/phan": "^3.0",
 | 
			
		||||
                "phpunit/phpunit": "^7.5 || ^8.5",
 | 
			
		||||
                "phan/phan": "5.4.2",
 | 
			
		||||
                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
 | 
			
		||||
                "squizlabs/php_codesniffer": "^3.5"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
@ -10088,9 +10245,9 @@
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "issues": "https://github.com/square/square-php-sdk/issues",
 | 
			
		||||
                "source": "https://github.com/square/square-php-sdk/tree/13.0.0.20210721"
 | 
			
		||||
                "source": "https://github.com/square/square-php-sdk/tree/30.0.0.20230816"
 | 
			
		||||
            },
 | 
			
		||||
            "time": "2021-07-21T06:43:15+00:00"
 | 
			
		||||
            "time": "2023-08-15T21:45:55+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "stripe/stripe-php",
 | 
			
		||||
 | 
			
		||||
@ -80,7 +80,7 @@ class PaymentLibrariesSeeder extends Seeder
 | 
			
		||||
            ['id' => 53, 'name' => 'PagSeguro', 'provider' => 'PagSeguro', 'key' => 'ef498756b54db63c143af0ec433da803', 'fields' => '{"email":"","token":"","sandbox":false}'],
 | 
			
		||||
            ['id' => 54, 'name' => 'PAYMILL', 'provider' => 'Paymill', 'key' => 'ca52f618a39367a4c944098ebf977e1c', 'fields' => '{"apiKey":""}'],
 | 
			
		||||
            ['id' => 55, 'name' => 'Custom', 'provider' => 'Custom', 'is_offsite' => true, 'sort_order' => 21, 'key' => '54faab2ab6e3223dbe848b1686490baa', 'fields' => '{"name":"","text":""}'],
 | 
			
		||||
            ['id' => 57, 'name' => 'Square', 'provider' => 'Square', 'is_offsite' => false, 'sort_order' => 21, 'key' => '65faab2ab6e3223dbe848b1686490baz', 'fields' => '{"accessToken":"","applicationId":"","locationId":"","testMode":false}'],
 | 
			
		||||
            ['id' => 57, 'name' => 'Square', 'provider' => 'Square', 'is_offsite' => false, 'sort_order' => 21, 'key' => '65faab2ab6e3223dbe848b1686490baz', 'fields' => '{"accessToken":"","applicationId":"","locationId":"","signatureKey":"","testMode":false}'],
 | 
			
		||||
            ['id' => 58, 'name' => 'Razorpay', 'provider' => 'Razorpay', 'is_offsite' => false, 'sort_order' => 21, 'key' => 'hxd6gwg3ekb9tb3v9lptgx1mqyg69zu9', 'fields' => '{"apiKey":"","apiSecret":""}'],
 | 
			
		||||
            ['id' => 59, 'name' => 'Forte', 'provider' => 'Forte', 'is_offsite' => false, 'sort_order' => 21, 'key' => 'kivcvjexxvdiyqtj3mju5d6yhpeht2xs', 'fields' => '{"testMode":false,"apiLoginId":"","apiAccessId":"","secureKey":"","authOrganizationId":"","organizationId":"","locationId":""}'],
 | 
			
		||||
            ['id' => 60, 'name' => 'PayPal REST', 'provider' => 'PayPal_Rest', 'key' => '80af24a6a691230bbec33e930ab40665', 'fields' => '{"clientId":"","secret":"","signature":"","testMode":false}'],
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,22 @@ class CompanyGatewayTest extends TestCase
 | 
			
		||||
        $this->assertNotNull($company_gateway);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testSetConfigFields()
 | 
			
		||||
    {
 | 
			
		||||
        $company_gateway = CompanyGateway::first();
 | 
			
		||||
        
 | 
			
		||||
        $this->assertNotNull($company_gateway->getConfig());
 | 
			
		||||
 | 
			
		||||
        $company_gateway->setConfigField('test', 'test');
 | 
			
		||||
 | 
			
		||||
        $this->assertEquals('test', $company_gateway->getConfigField('test'));
 | 
			
		||||
 | 
			
		||||
        $company_gateway->setConfigField('signatureKey', 'hero');
 | 
			
		||||
 | 
			
		||||
        $this->assertEquals('hero', $company_gateway->getConfigField('signatureKey'));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testFeesAndLimitsExists()
 | 
			
		||||
    {
 | 
			
		||||
        $data = [];
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user