async function createPayment(data) {
const response = await fetch("https://api.yuvexpay.com/v1/payments", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
"X-Idempotency-Key": generateIdempotencyKey(),
},
body: JSON.stringify(data),
});
if (!response.ok) {
const { error } = await response.json();
switch (response.status) {
case 400:
// Fix the request based on error.details
console.error("Validation error:", error.details);
break;
case 401:
// Token expired - generate a new one and retry
await refreshToken();
return createPayment(data);
case 409:
// Idempotency conflict - safe to return the original response
console.warn("Duplicate request detected");
break;
case 429:
// Rate limited - wait and retry
const retryAfter = response.headers.get("X-RateLimit-Reset");
await sleep(retryAfter * 1000);
return createPayment(data);
default:
throw new Error(`API error: ${error.message}`);
}
}
return response.json();
}