98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import { getSquareClient, getSquareLocationId } from "@/lib/square-client"
|
|
import type { PaymentRequest } from "@/lib/square-types"
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const paymentData: PaymentRequest = await request.json()
|
|
|
|
if (!paymentData.sourceId) {
|
|
return Response.json({
|
|
success: false,
|
|
error: "Payment source ID is required"
|
|
}, { status: 400 })
|
|
}
|
|
|
|
if (!paymentData.amount || paymentData.amount <= 0) {
|
|
return Response.json({
|
|
success: false,
|
|
error: "Valid payment amount is required"
|
|
}, { status: 400 })
|
|
}
|
|
|
|
const client = await getSquareClient()
|
|
const locationId = getSquareLocationId()
|
|
const paymentsApi = client.paymentsApi
|
|
|
|
// Create payment request
|
|
const paymentRequest = {
|
|
sourceId: paymentData.sourceId,
|
|
idempotencyKey: crypto.randomUUID(),
|
|
amountMoney: {
|
|
amount: BigInt(Math.round(paymentData.amount * 100)), // Convert to cents
|
|
currency: paymentData.currency || "USD",
|
|
},
|
|
locationId: locationId,
|
|
...(paymentData.orderId && { orderId: paymentData.orderId }),
|
|
buyerEmailAddress: paymentData.customerInfo.email,
|
|
note: `Aunty Sparkles order - ${paymentData.customerInfo.name}`,
|
|
autocomplete: true,
|
|
acceptPartialAuthorization: false,
|
|
}
|
|
|
|
console.log("Processing Square payment:", {
|
|
amount: paymentData.amount,
|
|
currency: paymentData.currency,
|
|
customerEmail: paymentData.customerInfo.email,
|
|
orderId: paymentData.orderId
|
|
})
|
|
|
|
const response = await paymentsApi.createPayment(paymentRequest)
|
|
|
|
if (response.result.payment) {
|
|
const payment = response.result.payment
|
|
|
|
console.log("Payment processed successfully:", {
|
|
paymentId: payment.id,
|
|
status: payment.status,
|
|
amount: payment.amountMoney?.amount
|
|
})
|
|
|
|
return Response.json({
|
|
success: true,
|
|
payment: {
|
|
id: payment.id,
|
|
status: payment.status,
|
|
amount: paymentData.amount,
|
|
currency: paymentData.currency,
|
|
receiptUrl: payment.receiptUrl,
|
|
orderId: payment.orderId
|
|
}
|
|
})
|
|
} else {
|
|
throw new Error("Payment processing failed - no payment returned")
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error("Square payment error:", error)
|
|
|
|
// Handle specific Square API errors
|
|
let errorMessage = "Payment processing failed"
|
|
if (error instanceof Error) {
|
|
if (error.message.includes("CARD_DECLINED")) {
|
|
errorMessage = "Your card was declined. Please try a different payment method."
|
|
} else if (error.message.includes("INSUFFICIENT_FUNDS")) {
|
|
errorMessage = "Insufficient funds. Please try a different payment method."
|
|
} else if (error.message.includes("INVALID_CARD")) {
|
|
errorMessage = "Invalid card information. Please check your card details."
|
|
} else {
|
|
errorMessage = error.message
|
|
}
|
|
}
|
|
|
|
return Response.json({
|
|
success: false,
|
|
error: errorMessage
|
|
}, { status: 500 })
|
|
}
|
|
}
|