keepcloud/freshdesk-laravel
Laravel/Lumen service provider and facade for Freshdesk API v2 using keepcloud/freshdesk-php-sdk. Configure API key and domain, publish config, then access resources like tickets, contacts, agents, companies, time entries, forums, topics, and more.
composer require keepcloud/freshdesk-laravel
config/app.php:
'providers' => [
Keepcloud\Laravel\Freshdesk\FreshdeskServiceProvider::class,
],
'aliases' => [
'Freshdesk' => Keepcloud\Laravel\Freshdesk\FreshdeskFacade::class,
]
php artisan vendor:publish --provider="Keepcloud\Laravel\Freshdesk\FreshdeskServiceProvider"
Update config/freshdesk.php with your API key and domain.use Freshdesk;
$ticket = Freshdesk::ticket()->find(123);
return response()->json($ticket);
CRUD Operations:
// Create
$ticket = Freshdesk::ticket()->create(['subject' => 'Test', 'description' => 'Hello']);
// Update
Freshdesk::ticket()->update(123, ['status' => 2]);
// Delete
Freshdesk::ticket()->delete(123);
Querying with Filters:
$tickets = Freshdesk::ticket()->all(['query' => 'status:open']);
Attachments:
$attachment = Freshdesk::attachment()->create(123, 'path/to/file.pdf');
Contacts & Groups:
$contact = Freshdesk::contact()->find(456);
$group = Freshdesk::group()->find(789);
ticket.created).dispatch(new SyncTicketsJob());
Cache::remember()) to avoid hitting Freshdesk’s limits.API Key Permissions:
Tickets:Read, Tickets:Write). Test with a restricted key first.403 Forbidden errors.Domain Configuration:
domain in config/freshdesk.php must match your Freshdesk subdomain (e.g., yourcompany.freshdesk.com → yourcompany).Freshdesk::getClient()->getBaseUri() to verify the constructed URL.Pagination:
->all() with ['page' => 1, 'per_page' => 50] for large datasets.function getAllTickets() {
$tickets = [];
$page = 1;
do {
$tickets = array_merge($tickets, Freshdesk::ticket()->all(['page' => $page, 'per_page' => 50]));
$page++;
} while (count($tickets) >= $page * 50);
return $tickets;
}
Error Handling:
try-catch blocks to handle Keepcloud\Freshdesk\Exceptions\FreshdeskException:
try {
Freshdesk::ticket()->find(123);
} catch (\Exception $e) {
Log::error('Freshdesk error: ' . $e->getMessage());
return response()->json(['error' => 'Failed to fetch ticket'], 500);
}
Environment Variables:
api_key and domain in .env:
FRESHDESK_API_KEY=your_key
FRESHDESK_DOMAIN=yourdomain
config/freshdesk.php to use them:
'api_key' => env('FRESHDESK_API_KEY'),
'domain' => env('FRESHDESK_DOMAIN'),
Testing:
Mockery to stub the Freshdesk client in tests:
$mock = Mockery::mock('overload:Keepcloud\Freshdesk\Client');
$mock->shouldReceive('ticket')->andReturnSelf();
$mock->shouldReceive('find')->andReturn(['id' => 123, 'subject' => 'Test']);
Extending the SDK:
class FreshdeskService {
public function createTicketFromForm(Request $request) {
return Freshdesk::ticket()->create([
'subject' => $request->subject,
'description' => $request->description,
'priority' => $request->priority ?? 2,
]);
}
}
Webhooks:
X-Freshworks-Signature header:
$signature = request()->header('X-Freshworks-Signature');
$payload = request()->getContent();
if (!hash_equals($signature, hash_hmac('sha256', $payload, config('freshdesk.webhook_secret')))) {
abort(401);
}
How can I help you explore Laravel packages today?