Payments
In-app payments and webhooks with Stripe.
next-forge uses Stripe by default for payments and billing. Implementing Stripe in your project is straightforward.
In-App Purchases
You can use Stripe anywhere in your app by importing the stripe
object like so:
Webhooks
Stripe webhooks are handled in the POST /webhooks/stripe
route in the api
app. This route constructs the event and then switches on the event type to determine how to process the event.
Local Development
To test webhooks locally, we’ve configured the Stripe CLI to forward webhooks to your local server. This will start automatically when you run pnpm dev
.
Anti-Fraud
As your app grows, you will inevitably encounter credit card fraud. Stripe Radar is enabled by default if you integrate payments using their SDK as described above. This provides a set of tools to help you detect and prevent fraud.
Stripe Radar supports more advanced anti-fraud features if you embed the Stripe JS script in every page load. This is not enabled by default in next-forge, but you can add it as follows:
Edit the layout
Edit apps/app/app/layout.tsx
and add <Script src="https://js.stripe.com/v3/" />
after the opening <html>
tag and before the opening <body>
tag. You will also need to add import Script from 'next/script'
Add script to the website
Add the same script to the website in apps/web/app/layout.tsx
.
Prevent common fraud patterns with Arcjet
Prevent common fraud patterns by using Arcjet IP address analysis to block requests from VPNs and proxies. These are commonly used by fraudsters to hide their location, but have legitimate uses as well so are not blocked by default. You could simply block these users, or you could adjust the checkout process to require approval before processing their payment.
For example, in apps/app/app/(authenticated)/layout.tsx
you could add this after the call to aj.protect()
:
In this case we are providing a friendly redirect to a page that explains why the user is being blocked (which you would need to create). You could also return a more generic error message. See the Arcjet documentation for more advanced examples.