Fix consulting payment: call Pakasir API directly from frontend

The create-pakasir-payment edge function doesn't exist.
Instead, call Pakasir API directly from the frontend (same as Checkout page).
Uses VITE_PAKASIR_PROJECT_SLUG and VITE_PAKASIR_API_KEY env vars.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
dwindown
2025-12-23 17:21:01 +07:00
parent ecab3eb22a
commit e6b1e02e5f

View File

@@ -226,46 +226,39 @@ export default function ConsultingBooking() {
const { error: slotsError } = await supabase.from('consulting_slots').insert(slotsToInsert); const { error: slotsError } = await supabase.from('consulting_slots').insert(slotsToInsert);
if (slotsError) throw slotsError; if (slotsError) throw slotsError;
// Generate Pakasir payment URL directly (no cart needed for consulting) // Call Pakasir API directly to create QRIS payment
const pakasirOrderData = { const PAKASIR_PROJECT_SLUG = import.meta.env.VITE_PAKASIR_PROJECT_SLUG || '';
order_id: order.id, const PAKASIR_API_KEY = import.meta.env.VITE_PAKASIR_API_KEY || '';
amount: totalPrice, const PAKASIR_CALLBACK_URL = `${import.meta.env.VITE_SUPABASE_URL}/functions/v1/pakasir-webhook`;
customer_name: profile?.full_name || user.email,
customer_email: user.email,
items: [{
id: order.id,
name: `Konsultasi 1-on-1 (${totalBlocks} blok)`,
price: totalPrice,
quantity: 1
}],
success_url: `${window.location.origin}/orders/${order.id}`,
cancel_url: `${window.location.origin}/consulting`,
};
// Call your backend to create Pakasir payment try {
const paymentResponse = await fetch(`${import.meta.env.VITE_SUPABASE_URL}/functions/v1/create-pakasir-payment`, { const response = await fetch(`https://app.pakasir.com/api/transactioncreate/qris`, {
method: 'POST', method: 'POST',
headers: { headers: { 'Content-Type': 'application/json' },
'Content-Type': 'application/json', body: JSON.stringify({
'Authorization': `Bearer ${import.meta.env.VITE_SUPABASE_ANON_KEY}`, project: PAKASIR_PROJECT_SLUG,
}, order_id: order.id,
body: JSON.stringify(pakasirOrderData), amount: totalPrice,
}); api_key: PAKASIR_API_KEY,
description: `Konsultasi 1-on-1 (${totalBlocks} blok)`,
callback_url: PAKASIR_CALLBACK_URL,
}),
});
if (!paymentResponse.ok) { const result = await response.json();
throw new Error('Failed to create payment');
if (result.qr_string || result.qr) {
// QRIS available - redirect to Pakasir payment page
const pakasirPayUrl = `https://app.pakasir.com/pay/${PAKASIR_PROJECT_SLUG}/${totalPrice}?order_id=${order.id}`;
window.location.href = pakasirPayUrl;
} else {
throw new Error('Failed to create payment');
}
} catch (pakasirError) {
// Fallback: redirect directly to Pakasir
const pakasirPayUrl = `https://app.pakasir.com/pay/${PAKASIR_PROJECT_SLUG}/${totalPrice}?order_id=${order.id}`;
window.location.href = pakasirPayUrl;
} }
const paymentData = await paymentResponse.json();
// Update order with payment URL
await supabase
.from('orders')
.update({ payment_url: paymentData.payment_url })
.eq('id', order.id);
// Redirect to payment
window.location.href = paymentData.payment_url;
} catch (error: any) { } catch (error: any) {
toast({ title: 'Error', description: error.message, variant: 'destructive' }); toast({ title: 'Error', description: error.message, variant: 'destructive' });
} finally { } finally {