Installation
composer require mpclarkson/freshdesk-laravel
Publish the config file:
php artisan vendor:publish --provider="Freshdesk\FreshdeskServiceProvider"
Configuration
Edit .env with Freshdesk credentials:
FRESHDESK_DOMAIN=yourdomain.freshdesk.com
FRESHDESK_API_KEY=your_api_key_here
FRESHDESK_API_VERSION=v2
First Use Case: Fetching a Ticket
use Freshdesk\Ticket;
$ticket = Ticket::find(123);
dd($ticket->subject); // Outputs ticket subject
Service Provider
Ensure the package is registered in config/app.php under providers:
Freshdesk\FreshdeskServiceProvider::class,
Create a Ticket
$ticket = Ticket::create([
'subject' => 'New Issue',
'description' => 'Problem details...',
'priority' => 2,
'requester_id' => 12345,
]);
Update a Ticket
$ticket = Ticket::find(123);
$ticket->update(['status' => 2, 'description' => 'Updated details...']);
Reply to a Ticket
$ticket = Ticket::find(123);
$ticket->reply('This is my response.');
Fetch a Contact
$contact = Contact::find(67890);
dd($contact->name);
Create a Contact
$contact = Contact::create([
'name' => 'John Doe',
'email' => 'john@example.com',
]);
$tickets = Ticket::where('subject', 'like', '%urgent%')
->where('status', 1)
->get();
// In routes/web.php or routes/api.php
Route::post('/freshdesk/webhook', 'WebhookController@handle');
// In WebhookController.php
public function handle(Request $request) {
$payload = $request->all();
// Validate and process payload (e.g., update local DB)
}
$ticket = Ticket::find(123);
$ticket->attachments()->create([
'file_name' => 'screenshot.png',
'file_size' => 1024,
'file_content' => file_get_contents('path/to/screenshot.png'),
]);
Ticket, Contact, etc.) alongside Laravel’s Eloquent for seamless ORM operations.$ticket = Ticket::with('attachments', 'contact')->find(123);
$ticket = Cache::remember("ticket_{$id}", now()->addMinutes(5), function() use ($id) {
return Ticket::find($id);
});
try {
$ticket = Ticket::find(123);
} catch (\Freshdesk\Exceptions\ApiException $e) {
Log::error('Freshdesk API Error: ' . $e->getMessage());
return response()->json(['error' => 'Failed to fetch ticket'], 500);
}
public function test_ticket_creation() {
$this->fake();
$this->post('/api/tickets', ['subject' => 'Test']);
$this->assertDatabaseHas('tickets', ['subject' => 'Test']);
}
v2 of the Freshdesk API. If you’re using v1, update the config:
FRESHDESK_API_VERSION=v1
Tip: Check Freshdesk’s API docs for breaking changes between versions.401 Unauthorized, verify:
FRESHDESK_API_KEY is correct.FRESHDESK_DOMAIN) matches the Freshdesk subdomain (e.g., yourdomain.freshdesk.com).429 Too Many Requests.
Fix: Implement exponential backoff or use caching.custom_fields). Ensure your code handles null or missing keys:
$priority = $ticket->priority ?? 'N/A';
X-Freshdesk-Signature header. Always verify it to avoid spoofing:
use Freshdesk\Webhook;
public function handle(Request $request) {
if (!Webhook::verify($request->header('X-Freshdesk-Signature'), $request->getContent())) {
abort(403, 'Invalid webhook signature');
}
// Process payload
}
FRESHDESK_DEBUG=true in .env to log raw API responses:
FRESHDESK_DEBUG=true
Check logs in storage/logs/laravel.log.// In AppServiceProvider boot()
$this->app['http']->macro('logRequest', function ($request) {
\Log::debug('Freshdesk Request:', [
'url' => $request->url(),
'method' => $request->method(),
'data' => $request->toArray(),
]);
});
curl -X GET \
-H "Authorization: Basic YOUR_API_KEY" \
"https://yourdomain.freshdesk.com/api/v2/tickets/123"
use Freshdesk\Client;
$client = new Client();
$response = $client->get('/api/v2/search/tickets', [
'query' => 'subject:"urgent"'
]);
// app/Observers/TicketObserver.php
class TicketObserver {
public function saved(Ticket $ticket) {
// Send Slack notification on ticket creation
}
}
Register in AppServiceProvider:
Ticket::observe(TicketObserver::class);
Ticket::dispatchSyncOnConnection('freshdesk')->create([...]);
Configure the queue in config/queue.php.Client:
$this->app->bind(\Freshdesk\Client::class, function () {
return Mockery::mock(\Freshdesk\Client::class)->makePartial();
});
How can I help you explore Laravel packages today?