Migrate FCM from legacy v1 API to HTTP v2 with service account auth
All checks were successful
Create Release / build (push) Successful in 3s
All checks were successful
Create Release / build (push) Successful in 3s
Replace deprecated FCM server key authentication with Google service
account OAuth2 flow. The class now creates a signed JWT from the
service account credentials, exchanges it for a short-lived access
token (cached via WordPress transients), and sends messages to the
FCM v2 endpoint (projects/{id}/messages:send).
Settings page updated: FCM Server Key field replaced with Firebase
Project ID + Service Account JSON textarea with validation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -36,7 +36,19 @@ if (isset($_POST['twp_test_notification']) && check_admin_referer('twp_mobile_se
|
||||
|
||||
// Save settings
|
||||
if (isset($_POST['twp_save_mobile_settings']) && check_admin_referer('twp_mobile_settings')) {
|
||||
update_option('twp_fcm_server_key', sanitize_text_field($_POST['twp_fcm_server_key']));
|
||||
update_option('twp_fcm_project_id', sanitize_text_field($_POST['twp_fcm_project_id']));
|
||||
// Service account JSON — validate it parses as JSON before saving
|
||||
$sa_json_raw = isset($_POST['twp_fcm_service_account_json']) ? wp_unslash($_POST['twp_fcm_service_account_json']) : '';
|
||||
if (!empty($sa_json_raw)) {
|
||||
$sa_parsed = json_decode($sa_json_raw, true);
|
||||
if ($sa_parsed && isset($sa_parsed['client_email'], $sa_parsed['private_key'])) {
|
||||
update_option('twp_fcm_service_account_json', $sa_json_raw);
|
||||
} else {
|
||||
$sa_json_error = 'Invalid service account JSON — must contain client_email and private_key fields.';
|
||||
}
|
||||
} else {
|
||||
update_option('twp_fcm_service_account_json', '');
|
||||
}
|
||||
update_option('twp_auto_update_enabled', isset($_POST['twp_auto_update_enabled']) ? '1' : '0');
|
||||
update_option('twp_gitea_repo', sanitize_text_field($_POST['twp_gitea_repo']));
|
||||
update_option('twp_gitea_token', sanitize_text_field($_POST['twp_gitea_token']));
|
||||
@@ -48,7 +60,9 @@ if (isset($_POST['twp_save_mobile_settings']) && check_admin_referer('twp_mobile
|
||||
}
|
||||
|
||||
// Get current settings
|
||||
$fcm_server_key = get_option('twp_fcm_server_key', '');
|
||||
$fcm_project_id = get_option('twp_fcm_project_id', '');
|
||||
$fcm_service_account_json = get_option('twp_fcm_service_account_json', '');
|
||||
$fcm_sa_configured = !empty($fcm_service_account_json) && !empty($fcm_project_id);
|
||||
$auto_update_enabled = get_option('twp_auto_update_enabled', '1') === '1';
|
||||
$gitea_repo = get_option('twp_gitea_repo', 'wp-plugins/twilio-wp-plugin');
|
||||
$gitea_token = get_option('twp_gitea_token', '');
|
||||
@@ -90,6 +104,12 @@ $total_sessions = $wpdb->get_var("SELECT COUNT(*) FROM $sessions_table");
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (isset($sa_json_error)): ?>
|
||||
<div class="notice notice-error is-dismissible">
|
||||
<p><strong><?php echo esc_html($sa_json_error); ?></strong></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="twp-mobile-settings">
|
||||
<!-- Mobile App Overview -->
|
||||
<div class="card" style="max-width: 100%; margin-bottom: 20px;">
|
||||
@@ -118,26 +138,45 @@ $total_sessions = $wpdb->get_var("SELECT COUNT(*) FROM $sessions_table");
|
||||
|
||||
<!-- FCM Configuration -->
|
||||
<div class="card" style="max-width: 100%; margin-bottom: 20px;">
|
||||
<h2>Firebase Cloud Messaging (FCM)</h2>
|
||||
<p>Configure FCM to enable push notifications for the mobile app.</p>
|
||||
<h2>Firebase Cloud Messaging (FCM) — HTTP v2 API</h2>
|
||||
<p>Configure FCM using a service account for push notifications. The legacy server key API has been retired by Google.</p>
|
||||
|
||||
<table class="form-table">
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="twp_fcm_server_key">FCM Server Key</label>
|
||||
<label for="twp_fcm_project_id">Firebase Project ID</label>
|
||||
</th>
|
||||
<td>
|
||||
<input type="text"
|
||||
id="twp_fcm_server_key"
|
||||
name="twp_fcm_server_key"
|
||||
value="<?php echo esc_attr($fcm_server_key); ?>"
|
||||
id="twp_fcm_project_id"
|
||||
name="twp_fcm_project_id"
|
||||
value="<?php echo esc_attr($fcm_project_id); ?>"
|
||||
class="regular-text"
|
||||
placeholder="AAAA...">
|
||||
placeholder="my-project-12345">
|
||||
<p class="description">
|
||||
Get your server key from Firebase Console > Project Settings > Cloud Messaging > Server Key
|
||||
Found in Firebase Console > Project Settings > General > Project ID
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="twp_fcm_service_account_json">Service Account JSON</label>
|
||||
</th>
|
||||
<td>
|
||||
<textarea id="twp_fcm_service_account_json"
|
||||
name="twp_fcm_service_account_json"
|
||||
rows="6"
|
||||
class="large-text code"
|
||||
placeholder='Paste the entire contents of your service account JSON file...'><?php echo esc_textarea($fcm_service_account_json); ?></textarea>
|
||||
<p class="description">
|
||||
Generate in Firebase Console > Project Settings > Service Accounts > Generate New Private Key.
|
||||
Paste the entire JSON file contents here. Must contain <code>client_email</code> and <code>private_key</code> fields.
|
||||
</p>
|
||||
<?php if ($fcm_sa_configured): ?>
|
||||
<p style="color: #00a32a; margin-top: 5px;">✓ Service account configured</p>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="twp_twilio_api_key_sid">Twilio API Key SID</label>
|
||||
@@ -181,13 +220,13 @@ $total_sessions = $wpdb->get_var("SELECT COUNT(*) FROM $sessions_table");
|
||||
class="regular-text"
|
||||
placeholder="CR...">
|
||||
<p class="description">
|
||||
Twilio Push Credential SID. Create in Twilio Console > Messaging > Push Credentials using your FCM server key. Required for incoming call push notifications.
|
||||
Twilio Push Credential SID. Create in Twilio Console > Messaging > Push Credentials using your FCM service account JSON. Required for incoming call push notifications.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<?php if (!empty($fcm_server_key)): ?>
|
||||
<?php if ($fcm_sa_configured): ?>
|
||||
<p>
|
||||
<button type="submit" name="twp_test_notification" class="button">
|
||||
Send Test Notification
|
||||
|
||||
Reference in New Issue
Block a user