Aunty-Sparkles-Website/app/api/square/payments/create/route.ts

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 })
}
}