Testing payments
This is my setup for testing Paddle payments locally, since Paddle needs a public HTTPS URL to deliver webhooks and Kirby needs a public URL in its host allowlist.
Get Pinggy.io
Create a free account at pinggy.io and start a tunnel pointing at your local container (port 80). Pinggy gives you a public URL like https://xxxxxxxx.a.pinggy.link that forwards to your local site.
Add the Pinggy URL to config
Add the pinggy URL to the url array in site/config/config.php, alongside the other allowed hosts. Kirby rejects any request whose host isn’t in that list.
Set up Paddle sandbox
Create (or switch to) a Paddle Sandbox account. Sandbox credentials are separate from live ones, not just a toggle on the same account. From the sandbox account, set:
return [
'nymarktype.fountain' => [
'paddle' => [
'vendorId' => 1234,
'apiKey' => 'a3b…e68',
'apiUrl' => 'https://sandbox-api.paddle.com',
'notificationKey' => [
'completed' => 'pdl_ntfset_01h…RCY',
],
],
'csp' => [
'paddleEnvironment' => 'sandbox',
],
]
];
Set up notifications with the pinggy
Same two webhook destinations, same events, same webhook/paddle/transaction and webhook/paddle/adjustment paths — just built on the pinggy URL instead of the live domain (e.g. https://xxxxxxxx.a.pinggy.link/webhook/paddle/transaction). Save each destination's signing secret into nymarktype.fountain.paddle.notificationKey.transaction and .adjustment as before.
Note: free pinggy URLs rotate every time the tunnel restarts. When that happens, both the
urlentry inconfig.phpand the webhook destination URLs in the Paddle sandbox dashboard need updating to the new URL, or webhooks will fail to deliver.