DEVOPS-DEPLOYMENT DOCS

STRIPE-SETUP

Install Stripe
Description: Instal library Stripe untuk Node.js.
Example:
pnpm add stripe
Output: Package terinstal
Initialize Stripe
Description: Buat instance Stripe dengan secret key dari environment.
Example:
import Stripe from 'stripe'

export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
  apiVersion: '2025-03-31',
  typescript: true,
})
Output: Stripe client siap
Stripe API Version
Description: Tentukan versi API Stripe yang digunakan (wajib).
Example:
apiVersion: '2025-03-31'
Output: Versi API dikunci
Environment Variables
Description: Simpan secret key dan webhook secret di .env.
Example:
STRIPE_SECRET_KEY=sk_live_xxx
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_xxx
STRIPE_WEBHOOK_SECRET=whsec_xxx
Output: Variable aman

STRIPE-CHECKOUT

Create Checkout Session
Description: Membuat session Stripe Checkout untuk pembayaran sekali jalan.
Example:
const session = await stripe.checkout.sessions.create({
  mode: 'payment',
  line_items: [{ price_data: { currency: 'usd', product_data: { name: 'Kaos' }, unit_amount: 2000 }, quantity: 1 }],
  success_url: `${origin}/success?session_id={CHECKOUT_SESSION_ID}`,
  cancel_url: `${origin}/cancel`,
})
Output: URL checkout Stripe
Redirect to Checkout
Description: Arahkan pengguna ke URL Stripe Checkout.
Example:
return NextResponse.redirect(session.url!, 303)
Output: Pengguna diarahkan
Checkout Session Mode
Description: Mode checkout: payment, subscription, setup.
Example:
mode: 'subscription', // untuk langganan
Output: Sesuai kebutuhan
Customer Email
Description: Otomatis mengisi email pelanggan di Stripe Checkout.
Example:
customer_email: user.email,
Output: Email terisi
Metadata Checkout
Description: Menyematkan data tambahan di sesi checkout.
Example:
metadata: { orderId: '123' },
Output: Data orderId tercatat

STRIPE-PAYMENT-INTENTS

Create PaymentIntent
Description: Membuat PaymentIntent untuk pembayaran terprogram (custom UI).
Example:
const paymentIntent = await stripe.paymentIntents.create({
  amount: 2000,
  currency: 'usd',
  payment_method_types: ['card'],
})
Output: Client secret
Client Secret
Description: Client secret digunakan di frontend untuk konfirmasi pembayaran.
Example:
const clientSecret = paymentIntent.client_secret
Output: pi_xxx_secret_xxx
Update PaymentIntent
Description: Mengubah amount atau metadata sebelum konfirmasi.
Example:
await stripe.paymentIntents.update('pi_xxx', { amount: 3000 })
Output: PaymentIntent terupdate
Confirm PaymentIntent
Description: Konfirmasi PaymentIntent (biasanya dari frontend dengan Stripe Elements).
Example:
await stripe.confirmCardPayment(clientSecret, { payment_method: { card } })
Output: Pembayaran terkonfirmasi

STRIPE-WEBHOOK

Webhook Endpoint
Description: Route handler untuk menerima event dari Stripe.
Example:
export async function POST(req: Request) { ... }
Output: /api/stripe/webhook
Verify Signature
Description: Memverifikasi bahwa request berasal dari Stripe.
Example:
const sig = req.headers.get('stripe-signature')!
const event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_WEBHOOK_SECRET!)
Output: Event terverifikasi
Handle Events
Description: Menangani event seperti checkout.session.completed, payment_intent.succeeded.
Example:
switch (event.type) {
  case 'checkout.session.completed':
    const session = event.data.object
    // fulfill order
    break
  // ...
}
Output: Aksi terpicu
Return 200 Quickly
Description: Webhook harus merespons 200 dengan cepat, pekerjaan berat bisa async.
Example:
return new Response(null, { status: 200 })
Output: Stripe terima respons

STRIPE-SUBSCRIPTION

Create Subscription
Description: Membuat langganan periodik untuk pelanggan.
Example:
const subscription = await stripe.subscriptions.create({
  customer: 'cus_xxx',
  items: [{ price: 'price_xxx' }],
  payment_behavior: 'default_incomplete',
  expand: ['latest_invoice.payment_intent'],
})
Output: Status langganan
Price Object
Description: Objek harga (price) untuk produk/langganan.
Example:
const price = await stripe.prices.create({
  unit_amount: 2000,
  currency: 'usd',
  recurring: { interval: 'month' },
  product: 'prod_xxx',
})
Output: price_xxx
Trial Period
Description: Menawarkan masa percobaan sebelum penagihan.
Example:
trial_period_days: 14
Output: 14 hari gratis
Cancel Subscription
Description: Membatalkan langganan (bisa langsung atau di akhir periode).
Example:
await stripe.subscriptions.cancel('sub_xxx')
Output: Status canceled
Customer Portal
Description: Mengarahkan pelanggan ke Stripe Customer Portal untuk kelola langganan.
Example:
const portalSession = await stripe.billingPortal.sessions.create({
  customer: 'cus_xxx',
  return_url: origin,
})
return NextResponse.redirect(portalSession.url, 303)
Output: URL portal

MIDTRANS

Install Midtrans
Description: Install library Midtrans untuk Node.js.
Example:
pnpm add midtrans-client
Output: Package terinstal
Initialize Midtrans
Description: Buat instance Midtrans Snap dan Core API.
Example:
import midtransClient from 'midtrans-client'

const snap = new midtransClient.Snap({
  isProduction: false,
  serverKey: process.env.MIDTRANS_SERVER_KEY,
  clientKey: process.env.MIDTRANS_CLIENT_KEY,
})
Output: Snap instance siap
Snap Transaction
Description: Membuat transaksi Snap untuk mendapatkan token pembayaran.
Example:
const transaction = await snap.createTransaction({
  transaction_details: { order_id: 'ORDER-123', gross_amount: 200000 },
  customer_details: { first_name: 'Ridho', email: 'ridho@mail.com' },
})
Output: Token snap
Snap Redirect URL
Description: URL pembayaran Midtrans yang bisa di-redirect atau di-embed.
Example:
const redirectUrl = transaction.redirect_url
Output: https://app.sandbox.midtrans.com/snap/...
Midtrans Webhook
Description: Terima notifikasi pembayaran dari Midtrans.
Example:
export async function POST(req: Request) {
  const body = await req.json()
  // verifikasi signature key
}
Output: Status transaksi

XENDIT

Install Xendit
Description: Install library Xendit untuk Node.js.
Example:
pnpm add xendit-node
Output: Package terinstal
Initialize Xendit
Description: Buat instance Xendit API.
Example:
import { Xendit } from 'xendit-node'

const xendit = new Xendit({ secretKey: process.env.XENDIT_SECRET_KEY })
Output: Xendit instance
Create Invoice
Description: Membuat invoice pembayaran yang bisa dibayar via berbagai metode.
Example:
const invoice = await xendit.Invoice.createInvoice({
  externalId: 'INV-123',
  amount: 200000,
  currency: 'IDR',
  customer: { givenNames: 'Ridho', email: 'ridho@mail.com' },
  successRedirectUrl: 'https://example.com/success',
})
Output: Invoice URL & ID
Invoice Webhook
Description: Menerima notifikasi status invoice.
Example:
export async function POST(req: Request) {
  const body = await req.json()
  // verifikasi callback token
}
Output: Status invoice

PAYPAL

PayPal JavaScript SDK
Description: Muat PayPal SDK di frontend untuk menampilkan tombol.
Example:
import { PayPalScriptProvider, PayPalButtons } from '@paypal/react-paypal-js'

<PayPalScriptProvider options={{ clientId: process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID, currency: 'USD' }}>
  <PayPalButtons createOrder={(data, actions) => { return actions.order.create({ purchase_units: [{ amount: { value: '10.00' } }] }) }} />
</PayPalScriptProvider>
Output: Tombol PayPal
Capture Order (Server)
Description: Tangkap pembayaran setelah disetujui di frontend.
Example:
const response = await fetch(`https://api-m.sandbox.paypal.com/v2/checkout/orders/${orderID}/capture`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${accessToken}` },
})
Output: Status completed