Base imports
const DODO_CHECKOUT_URL = "https://test.checkout.dodopayments.com/buy"; // or production URL
const WEBHOOK_SECRET = "your_webhook_secret";
const REDIRECT_URL = "your_redirect_web_url"
Type definitions:
interface CustomerInfo {
name: string;
email: string;
}
interface BillingAddress {
country: string;
state: string;
city: string;
street: string;
zipcode: string;
}
interface PaymentRequestData {
customer: CustomerInfo;
billing: BillingAddress;
}
`
Payment Link Generation
`export const createPaymentLink = async (data: PaymentRequestData): Promise<string> => {
const params = new URLSearchParams();
// Add customer info
params.append("firstName", data.customer.name.split(' ')[0]);
params.append("lastName", data.customer.name.split(' ').slice(1).join(' '));
params.append("email", data.customer.email);
// Add billing info
params.append("country", data.billing.country);
params.append("addressLine", data.billing.street);
params.append("city", data.billing.city);
params.append("state", data.billing.state);
params.append("zipCode", data.billing.zipcode);
// Disable pre-filled fields
params.append("disableFirstName", "true");
params.append("disableEmail", "true");
// ... other disable parameters
// Set return URL
params.append("redirect_url", `${window.location.origin}?status=success`);
return `${DODO_CHECKOUT_URL}/${PRODUCT_ID}?${params.toString()}`;
};
Webhook Handling
export const verifyWebhook = (signature: string, payload: string): boolean => {
// Implement signature verification using your webhook secret
// Return true if valid, false otherwise
};
Key Features:
Direct payment link generation (no CORS issues)
Pre-filled customer information
Webhook signature verification
Error handling and fallbacks
TypeScript support
Development/Production environment handling
This implementation provides several advantages:
No CORS issues since it uses direct payment links
Type safety with TypeScript
Easy to integrate with any frontend framework
Handles both simple and complex payment flows
Includes webhook verification for payment notifications
Prompt to make it private int he supabase database:
Can you help me securely protect my direct API endpoint by routing requests through a Supabase Edge Function, so that my API key and endpoint remain hidden from the client side?