Hi Ryan,
Glad you were able to trace down the issue!
There is in fact one signing key per webhook. Whether to send live or test mode is set through the Stripe dashboard on each webhook. The signing key is used only to verify that Stripe sent the event data sent to that webhook, and it's managed separately from your test & live mode test and API keys.
The most common approach here is to set up a webhook receiver for testmode events on a staging or development server, and send livemode events to a different webhook URL. Each webhook would have its own signing key, and you'd want to use a single STRIPE_WEBHOOK_SIGNING_SECRET environment variable that you configure set externally in each environment (through application worker configuration, a .env file, or similar).
Based on your code it seems like you're trying to send both live and testmode webhooks to the same URL, which is possible. There's a logic error in your conditional, however, because after unmarshaling the JSON payload['data']['object']['livemode'] will be boolean `true