<?php namespace App\Classes\External\Payments; use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Log; use App\Classes\External\Payments; class Ezypay extends Payments { protected function connect(string $url,array $args=[]) { if ($x=$this->mustPause()) { Log::error('API Throttle, waiting .',['m'=>__METHOD__]); sleep($x); } $client = $this->getClient(config('services.ezypay.base_uri')); $result = $client->request('GET',$url.($args ? '?'.http_build_query($args) : ''),[ 'headers' => [ 'Authorization'=>'Basic '.base64_encode(config('services.ezypay.token_user').':'), 'Accept'=>'application/json', ], ]); $api_remain = Arr::get($result->getHeader('X-RateLimit-Remaining'),0); $api_reset = Arr::get($result->getHeader('X-RateLimit-Reset'),0); if ($api_remain === 0) { Log::error('API Throttle.',['m'=>__METHOD__,'api_reset'=>$api_reset]); Cache::put('api_throttle',$api_reset,now()->addSeconds($api_reset)); } return json_decode($result->getBody()->getContents()); } public function getCustomer(string $id) { return Cache::remember(__METHOD__.$id,86400,function() use ($id) { return collect($this->connect('accounts/customerid/'.$id)); }); } /** * Get a list of configured customers * * @return Collection * @todo Hard coded at 100 clients - need to make this more dynamic * * {#1079 * +"TermsAndConditions": true * +"Account": {#1082 * +"PaymentMethodId": 0 * } * +"Address1": "1 Road Street " * +"BillingStatus": "Active" * +"BusinessAccountReference": "12345" * +"CountryCode": "AU" * +"Email": "user@example.com" * +"EzypayReferenceNumber": 12345678 * +"Firstname": "Bart" * +"Id": "6219c42b-8e56-4e4e-af3a-76ddf4b0e4e1" * +"MobilePhone": "" * +"Postcode": "1234" * +"ReferenceId": "01nnnn" * +"State": "VIC" * +"Suburb": "TOWN" * +"Towncity": "" * +"Surname": "Simpson " * +"PaymentPlanId": "00000000-0000-0000-0000-000000000000" * +"DateOfBirth": "1970-01-01T00:00:00.000" * +"Gender": "M" * +"DebitType": 0 * +"RecurringAmount": 0.0 * +"Frequency": 0 * +"FrequencyType": 0 * +"StartDate": "0001-01-01T00:00:00.000" * +"RecurringDebitEndType": 0 * +"TotalAmountCollected": 0.0 * +"MinimumNumberOfPayment": 0 * +"RecurringWithDifferentFirstDebitAmount": 0.0 * +"RecurringDebitFirstDebitDate": "0001-01-01T00:00:00.000" * +"RecurringDebitAmount": 0.0 * +"RecurringDebitFrequency": 0 * +"RecurringDebitFrequencyType": 0 * +"RecurringDebitStartDate": "0001-01-01T00:00:00.000" * +"RecurringDebitDifferentFirstAmountEndType": 0 * +"RecurringDebitTotalAmountCollected": 0.0 * +"RecurringDebitMinimumNumberOfPayment": 0 * +"OnceOffAmount": 0.0 * +"OnceOffStartDate": "0001-01-01T00:00:00.000" * } */ public function getCustomers(): Collection { return Cache::remember(__METHOD__,86400,function() { return collect($this->connect('customers?pageSize=100')); }); } /** * Get Specific debits for a client. * * @param array $opt * @return Collection * * Illuminate\Support\Collection^ {#1077 * #items: array:4 [ * 0 => {#1826 * +"Amount": 99.99 * +"Id": "76666ef1-106c-458c-9162-e77fe746517c" * +"CustomerId": "6219c42b-8e56-4e4e-af3a-76ddf4b0e4e1" * +"Date": "2021-10-01T00:00:00.000" * +"Status": "Pending" * } * 1 => {#2075 * +"Amount": 99.99 * +"Id": "80ba201d-fb6f-4700-b1b7-2b13fbfa91d5" * +"CustomerId": "6219c42b-8e56-4e4e-af3a-76ddf4b0e4e1" * +"Date": "2021-09-01T00:00:00.000" * +"Status": "Pending" * } */ public function getDebits($opt=[]): Collection { return Cache::remember(__METHOD__.http_build_query($opt),86400,function() use ($opt) { return Collect($this->connect('debits'.($opt ? '?'.http_build_query($opt) : ''))); }); } public function getSettlements($opt=[]): Collection { return Cache::remember(__METHOD__.http_build_query($opt),86400,function() use ($opt) { return Collect($this->connect('settlements/'.config('services.ezypay.guid').($opt ? '?'.http_build_query($opt) : ''))); }); } }