Create Pakasir payment edge function to fix CORS issue

- Create create-pakasir-payment edge function to handle payment creation server-side
- Update ConsultingBooking.tsx to use edge function instead of direct API call
- Update Checkout.tsx to use edge function instead of direct API call
- Add config.toml entry for create-pakasir-payment function
- Removes CORS errors when calling Pakasir API from frontend

🤖 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 21:20:40 +07:00
parent 94403bd634
commit a9f7c9b07a
4 changed files with 147 additions and 64 deletions

View File

@@ -226,38 +226,25 @@ export default function ConsultingBooking() {
const { error: slotsError } = await supabase.from('consulting_slots').insert(slotsToInsert);
if (slotsError) throw slotsError;
// Call Pakasir API directly to create QRIS payment
const PAKASIR_PROJECT_SLUG = import.meta.env.VITE_PAKASIR_PROJECT_SLUG || '';
const PAKASIR_API_KEY = import.meta.env.VITE_PAKASIR_API_KEY || '';
const PAKASIR_CALLBACK_URL = `${import.meta.env.VITE_SUPABASE_URL}/functions/v1/pakasir-webhook`;
// Call edge function to create Pakasir payment (avoids CORS)
const { data: paymentData, error: paymentError } = await supabase.functions.invoke('create-pakasir-payment', {
body: {
order_id: order.id,
amount: totalPrice,
description: `Konsultasi 1-on-1 (${totalBlocks} blok)`,
},
});
try {
const response = await fetch(`https://app.pakasir.com/api/transactioncreate/qris`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
project: PAKASIR_PROJECT_SLUG,
order_id: order.id,
amount: totalPrice,
api_key: PAKASIR_API_KEY,
description: `Konsultasi 1-on-1 (${totalBlocks} blok)`,
callback_url: PAKASIR_CALLBACK_URL,
}),
});
if (paymentError) {
console.error('Payment creation error:', paymentError);
throw new Error(paymentError.message || 'Gagal membuat pembayaran');
}
const result = await response.json();
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;
if (paymentData?.success && paymentData?.data?.payment_url) {
// Redirect to Pakasir payment page
window.location.href = paymentData.data.payment_url;
} else {
throw new Error('Gagal membuat URL pembayaran');
}
} catch (error: any) {
toast({ title: 'Error', description: error.message, variant: 'destructive' });