Checkout storefront
Payment link Mayar Solo dan Pro di app marketing.
Situs marketing menjual Solo dan Pro sebagai pembelian one-time lewat payment link Mayar yang di-host. Jalur ini terpisah dari checkout membership STARTER yang terautentikasi.
Jangan memakai ulang checkout STARTER
Jangan memanggil checkout membership Hono /api/billing untuk Solo/Pro.
Pakai hanya POST /api/checkout dan @repo/payments/storefront.
Variabel lingkungan
Setel di .env root (lihat Environment):
| Key | Tujuan |
|---|---|
MAYAR_PAYMENT_LINK_SOLO | URL checkout ter-host untuk Solo |
MAYAR_PAYMENT_LINK_PRO | URL checkout ter-host untuk Pro |
MAYAR_PRODUCT_ID_SOLO | Product ID untuk filter webhook storefront |
MAYAR_PRODUCT_ID_PRO | Product ID untuk filter webhook storefront |
MAYAR_WEBHOOK_SECRET | Secret bersama untuk /api/webhooks/mayar |
Buat payment link di dashboard Mayar (sandbox: web.mayar.club).
Alur checkout
sequenceDiagram
participant User
participant Marketing
participant Checkout as POST_/api/checkout
participant Mayar
User->>Marketing: Klik Solo atau Pro
Marketing->>Checkout: plan solo atau pro
Checkout->>Checkout: getStorefrontCheckoutUrl
Checkout-->>Marketing: checkoutUrl
Marketing->>Mayar: Redirect ke payment link- UI Pricing memanggil
useCreateCheckout()(apps/marketing/src/mutations/use-create-checkout.ts). POST /api/checkoutdengan{ plan: "solo" | "pro" }(apps/marketing/src/app/api/checkout/route.ts).- Server menyelesaikan URL lewat
getStorefrontCheckoutUrldipackages/payments/src/storefront.ts. - Client mengalihkan dengan
window.location.assign(checkoutUrl). - Setelah bayar, pengguna masuk ke
/[locale]/checkout/success(halaman terima kasih).
export function getStorefrontCheckoutUrl(plan: StorefrontPlan): string | null {
const url =
plan === "solo"
? env.MAYAR_PAYMENT_LINK_SOLO
: env.MAYAR_PAYMENT_LINK_PRO;
return url || null;
}Webhook
Arahkan webhook Mayar ke:
{MARKETING_URL}/api/webhooks/mayarOtorisasi dengan x-mayar-webhook-secret atau Authorization: Bearer <MAYAR_WEBHOOK_SECRET>.
Handler memvalidasi payload dan memperlakukan product ID Solo/Pro yang dikenal sebagai event storefront. Product ID non-storefront dijawab { received: true } dan diabaikan. Route ini saat ini meng-ack event storefront; tidak menulis baris Subscription.