juspay/hyperswitch · critical
Failed to decrypt google pay decrypt configs
Error message
Failed to decrypt google pay decrypt configs
What it means
Panic in fetch_raw_secrets (crates/router/src/configs/secrets_transformers.rs:582): GooglePayDecryptConfig::convert_to_raw_secret() failed to decrypt the Google Pay decrypt keys via the secret management client, and the expect('Failed to decrypt google pay decrypt configs') turns that Err into a panic during application startup/secret fetching. This is a fatal bootstrap failure — the router cannot load its Google Pay payment-method configuration.
Solutions
- Verify the secret_management_client can decrypt other secrets — fix its credentials, region, and KMS key permissions first.
- Re-encrypt and re-upload the Google Pay decrypt keys so the stored ciphertext matches the current KMS key/environment.
- Confirm the Google Pay keys entry actually exists in the secrets store for this environment (present-but-stale config triggers this path via the Some branch).
- Validate the stored secret's encoding/format against what GooglePayDecryptConfig::convert_to_raw_secret expects (base64, JSON structure).
- For faster diagnosis, replace the bare expect with error context including the source error before crashing.
Example fix
// before
.expect("Failed to decrypt google pay decrypt configs"),
// after
.unwrap_or_else(|e| panic!(
"Failed to decrypt google pay decrypt configs: {e:?} \
(check KMS credentials and that google_pay keys are encrypted for this env)"
)), Defensive patterns
Strategy: validation
Validate before calling
// pre-flight: confirm the secret decrypts before startup relies on it
let decrypted = secret_management_client
.decrypt(google_pay_keys.clone())
.await;
if decrypted.is_err() {
eprintln!("google pay keys undecryptable in this env — check KMS creds/key");
} Try / catch
match GooglePayDecryptConfig::convert_to_raw_secret(google_pay_keys, secret_management_client).await {
Ok(raw) => Some(raw),
Err(e) => panic!("Failed to decrypt google pay decrypt configs: {e:?}"),
} Prevention
- Rotate KMS keys only together with re-encrypting stored secrets
- Keep per-environment secrets stores in sync with per-environment credentials
- Pre-flight decrypt checks in deploy/CI before the router boots
- Never ship config that references google pay keys absent from the active secrets store
When it happens
Trigger: Calling convert_to_raw_secret(google_pay_keys, secret_management_client) when: the encrypted GooglePay keys in the secrets store can't be decrypted (wrong KMS key, corrupted ciphertext, missing key in store), the secret_management_client has bad credentials/region, or the base64/format of the stored secret doesn't match what the decrypt routine expects.
Common situations: Rotating KMS keys without re-encrypting stored secrets; environment mismatch (staging secret read with production credentials); misconfigured secret manager (vault/KMS) env vars; Google Pay config present in file/env config but the corresponding encrypted keys absent in the secrets store.
Related errors
AI-assisted analysis of juspay/hyperswitch@afd9284352 (2026-09-18).
Data as JSON: /api/errors/e7bba8bbbca92a5f.
Report an issue: GitHub.
Appendix: source
Thrown at crates/router/src/configs/secrets_transformers.rs:582
let paze_decrypt_keys = if let Some(paze_keys) = conf.paze_decrypt_keys {
Some(
settings::PazeDecryptConfig::convert_to_raw_secret(paze_keys, secret_management_client)
.await
.expect("Failed to decrypt paze decrypt configs"),
)
} else {
None
};
#[allow(clippy::expect_used)]
let google_pay_decrypt_keys = if let Some(google_pay_keys) = conf.google_pay_decrypt_keys {
Some(
settings::GooglePayDecryptConfig::convert_to_raw_secret(
google_pay_keys,
secret_management_client,
)
.await
.expect("Failed to decrypt google pay decrypt configs"),
)
} else {
None
};
#[allow(clippy::expect_used)]
let applepay_merchant_configs = settings::ApplepayMerchantConfigs::convert_to_raw_secret(
conf.applepay_merchant_configs,
secret_management_client,
)
.await
.expect("Failed to decrypt applepay merchant configs");
#[allow(clippy::expect_used)]
let payment_method_auth = settings::PaymentMethodAuth::convert_to_raw_secret(
conf.payment_method_auth,
secret_management_client,
)View on GitHub (pinned to afd9284352)