OsonTopshir API
Loyiha holati: Hamkor API ishga tushirilmoqda. Quyidagi shartnoma (kontrakt) yakuniy v1 ko'rinishida, lekin kalitlar hozircha faqat tanlangan hamkorlarga beriladi.

Idempotentlik

Tarmoq uzilsa, so'rov bajarilgan-bajarilmaganini bilmay qolasiz. Idempotency-Key qayta yuborishni xavfsiz qiladi: kredit ikki marta yechilmaydi va ikkita hujjat yaratilmaydi.

Qanday ishlaydi

POST /v1/orders va POST /v1/credits/purchases so'rovlariga o'zingiz yaratgan noyob kalitni yuboring:

Idempotency-Key: 1001-v1
  • Birinchi so'rov odatdagidek bajariladi.
  • Xuddi shu kalit va xuddi shu tana bilan qayta yuborsangiz, birinchi javobning o'zi qaytadi (yangi buyurtma yaratilmaydi).
  • Xuddi shu kalit, lekin boshqa tana yuborsangiz, 409 idempotency_conflict qaytadi.
  • Kalitlar 24 soat saqlanadi.

Kalit tanlash

  • UUID v4 yaxshi tanlov. Yoki o'z buyurtma raqamingiz asosida: order-1001-v1.
  • Uzunligi 255 belgigacha.
  • Foydalanuvchi buyurtmani haqiqatan yangidan bermoqchi bo'lsa, yangi kalit ishlating.
import uuid, requests

key = str(uuid.uuid4())   # buyurtma bilan birga saqlab qo'ying

def create_order(payload):
    for attempt in range(5):
        try:
            r = requests.post(
                "https://api.osontopshir.uz/partner/v1/orders",
                headers={**H, "Idempotency-Key": key},
                json=payload, timeout=30,
            )
            if r.status_code < 500 and r.status_code != 429:
                return r.json()
        except requests.RequestException:
            pass
        time.sleep(2 ** attempt)
    raise RuntimeError("Buyurtma yuborilmadi")
import { randomUUID } from "node:crypto";

const key = randomUUID(); // buyurtma bilan birga saqlab qo'ying

async function createOrder(payload) {
  for (let attempt = 0; attempt < 5; attempt++) {
    try {
      const r = await fetch("https://api.osontopshir.uz/partner/v1/orders", {
        method: "POST",
        headers: { ...H, "Idempotency-Key": key, "Content-Type": "application/json" },
        body: JSON.stringify(payload),
      });
      if (r.status < 500 && r.status !== 429) return await r.json();
    } catch (e) {}
    await new Promise((res) => setTimeout(res, 2 ** attempt * 1000));
  }
  throw new Error("Buyurtma yuborilmadi");
}