Integrating Jira API with Website
Jira API is used to create tasks from website forms, display ticket status to customers, synchronize support request statuses, and build self-service portals.
Authentication (Jira Cloud)
from jira import JIRA
jira = JIRA(
server='https://your-company.atlassian.net',
basic_auth=('[email protected]', JIRA_API_TOKEN) # API token, not password
)
Creating Task from Support Form
class JiraService
{
public function createIssue(SupportRequest $data): string
{
$resp = Http::withBasicAuth(
config('services.jira.email'),
config('services.jira.token')
)->post(config('services.jira.url') . '/rest/api/3/issue', [
'fields' => [
'project' => ['key' => 'SUPPORT'],
'summary' => "[Web] {$data->subject}",
'description' => [
'type' => 'doc',
'version' => 1,
'content' => [[
'type' => 'paragraph',
'content' => [['type' => 'text', 'text' => $data->message]],
]],
],
'issuetype' => ['name' => 'Support'],
'priority' => ['name' => $data->priority ?? 'Medium'],
'labels' => ['website', 'customer-request'],
'customfield_10014' => $data->customer_email, // Custom email field
],
]);
$issueKey = $resp->json('key'); // SUPPORT-123
// Save ticket-to-issue mapping
SupportTicket::create([
'user_id' => $data->userId,
'jira_key' => $issueKey,
'subject' => $data->subject,
'status' => 'open',
]);
return $issueKey;
}
}
Displaying Ticket Status to Customer
public function getTicketStatus(string $issueKey): array
{
$resp = Http::withBasicAuth($email, $token)
->get(config('services.jira.url') . "/rest/api/3/issue/{$issueKey}");
$issue = $resp->json();
return [
'key': $issue['key'],
'summary': $issue['fields']['summary'],
'status': $issue['fields']['status']['name'],
'updated': $issue['fields']['updated'],
'comments': count($issue['fields']['comment']['comments'] ?? []),
];
}
Webhooks for Status Updates
Route::post('/webhooks/jira', function (Request $request) {
$event = $request->input('webhookEvent');
$issue = $request->input('issue');
$issueKey = $issue['key'];
if ($event === 'jira:issue_updated') {
$newStatus = $issue['fields']['status']['name'];
SupportTicket::where('jira_key', $issueKey)->update([
'status' => $this->mapJiraStatus($newStatus),
'updated_at' => now(),
]);
// Notify customer of status change
$ticket = SupportTicket::where('jira_key', $issueKey)->first();
if ($ticket) {
Mail::to($ticket->user->email)->send(new TicketStatusUpdatedMail($ticket));
}
}
return response('ok');
});
Timeline
Creating tickets from forms + displaying status: 3–4 business days. With webhooks and notifications: 5–6 days.







