Skip to content

Chek boshqaruvi

Subscribe API orqali cheklarni boshqarishni o'rganing.

Subscribe API chek usullari

1. receipts.create

Chek yaratish uchun ishlatiladi.

typescript
import { PaymeSubscribe } from '@joyida/payme';

const subscribeServer = new PaymeSubscribe({
  merchantId: 'your_merchant_id',
  password: 'your_password'
}, 'server');

const receipt = await subscribeServer.receiptsCreate({
  amount: 500000, // 5000 so'm
  account: { user_id: 'user_123' }
});

console.log('Chek ID:', receipt.receipt._id);
console.log('Yaratilgan vaqti:', receipt.receipt.create_time);
console.log('Holati:', receipt.receipt.state); // 0 = kutmoqda

Parametrlar:

  • amount: Chek summasi (tiyinda)
  • account: Hisob ma'lumotlari
  • description: Ixtiyoriy tavsif
  • detail: Ixtiyoriy batafsil ma'lumotlar

2. receipts.pay

Chekni token bilan to'lash uchun ishlatiladi.

typescript
const paid = await subscribeServer.receiptsPay({
  id: receipt.receipt._id,
  token: 'saved_card_token'
});

console.log('Chek holati:', paid.receipt.state); // 1 = to'langan

Parametrlar:

  • id: Chek ID
  • token: Karta tokeni

3. receipts.send

Chek invitisini SMS orqali yuborish uchun ishlatiladi.

typescript
const sent = await subscribeServer.receiptsSend({
  id: receipt.receipt._id,
  phone: '998901234567'
});

console.log('SMS yuborildi:', sent.success);

Parametrlar:

  • id: Chek ID
  • phone: Telefon raqami (998XXXXXXXXX formati)

4. receipts.cancel

Chekni bekor qilish uchun ishlatiladi.

typescript
const cancelled = await subscribeServer.receiptsCancel({
  id: receipt.receipt._id
});

console.log('Bekor qilingan vaqti:', cancelled.receipt.cancel_time);
console.log('Holati:', cancelled.receipt.state); // 2 = bekor qilingan

Parametrlar:

  • id: Chek ID

5. receipts.check

Chek holatini tekshirish uchun ishlatiladi.

typescript
const status = await subscribeServer.receiptsCheck({
  id: receipt.receipt._id
});

console.log('Chek holati:', status.state);

Chek holatlari:

HolatQiymatTushuntirish
Kutmoqda0To'lov kutilmoqda
To'langan1To'lov amalga oshirildi
Bekor qilingan2Chek bekor qilindi
To'lovdan keyin bekor qilingan3To'lovdan keyin bekor qilindi (qaytarildi)

6. receipts.get

Chek to'liq ma'lumotlarini olish uchun ishlatiladi.

typescript
const receiptDetails = await subscribeServer.receiptsGet({
  id: receipt.receipt._id
});

console.log('Summa:', receiptDetails.receipt.amount);
console.log('Karta:', receiptDetails.receipt.card);
console.log('Tavsif:', receiptDetails.receipt.description);
console.log('Savdogar:', receiptDetails.receipt.merchant);

7. receipts.get_all

Vaqt orqali barcha cheklarni olish uchun ishlatiladi.

typescript
const receipts = await subscribeServer.receiptsGetAll({
  from: Date.now() - 86400000, // 24 soat oldin
  to: Date.now(),                 // Hozir
  limit: 50                      // Maksimum 50 ta
});

console.log('Cheklar soni:', receipts.receipts.length);

receipts.receipts.forEach(receipt => {
  console.log('ID:', receipt._id);
  console.log('Summa:', receipt.amount);
  console.log('Holati:', receipt.state);
});

Parametrlar:

  • from: Boshlang'ich vaqt (Unix vaqt, millisekundlarda)
  • to: Tugash vaqt (Unix vaqt, millisekundlarda)
  • offset: Sahifalash ofseti (ixtiyoriy)
  • limit: Maksimal cheklar soni (ixtiyoriy)

Chek batafsil ma'lumotlari

Chek batafsil ma'lumotlarini detail parametri orqali qo'shishingiz mumkin.

typescript
const receipt = await subscribeServer.receiptsCreate({
  amount: 500000,
  account: { order_id: 'ORD-123' },
  detail: {
    receipt_type: 1,
    shipping: {
      title: 'Yetkazib berish',
      price: 50000
    },
    items: [
      {
        title: 'Mahsulot 1',
        price: 225000,
        count: 1,
        code: 'PROD001',
        units: 1,
        vat_percent: 12,
        package_code: 'PKG001'
      },
      {
        title: 'Mahsulot 2',
        price: 225000,
        count: 1,
        code: 'PROD002',
        units: 1,
        vat_percent: 12,
        package_code: 'PKG002'
      }
    ]
  }
});

Detail tuzilmasi:

  • receipt_type: Chek turi
  • shipping: Yetkazib berish ma'lumotlari (ixtiyoriy)
  • items: Mahsulotlar ro'yxati

Item tuzilmasi:

  • title: Mahsulot nomi
  • price: Narxi (tiyinda)
  • count: Soni
  • code: Mahsulot kodi
  • units: Birliklar (ixtiyoriy)
  • vat_percent: QQS foizi
  • package_code: Paket kodi

To'liq chek oqimi

typescript
import { PaymeSubscribe } from '@joyida/payme';

const subscribeServer = new PaymeSubscribe({
  merchantId: process.env.PAYME_MERCHANT_ID!,
  password: process.env.PAYME_PASSWORD!
}, 'server');

// 1. Chek yaratish
const receipt = await subscribeServer.receiptsCreate({
  amount: 500000,
  account: { user_id: 'user_123' },
  description: 'Buyurtma #123'
});

console.log('Chek yaratildi:', receipt.receipt._id);

// 2. Chek holatini tekshirish
const status = await subscribeServer.receiptsCheck({
  id: receipt.receipt._id
});

console.log('Chek holati:', status.state); // 0 = kutmoqda

// 3. Chekni token bilan to'lash
const paid = await subscribeServer.receiptsPay({
  id: receipt.receipt._id,
  token: 'saved_card_token'
});

console.log('To\'lov amalga oshirildi:', paid.receipt.state); // 1 = to'langan

// 4. Chek tafsilotlarini olish
const details = await subscribeServer.receiptsGet({
  id: receipt.receipt._id
});

console.log('To\'liq chek ma\'lumotlari:', details.receipt);

// 5. Chek invitisini SMS yuborish (ixtiyoriy)
const sent = await subscribeServer.receiptsSend({
  id: receipt.receipt._id,
  phone: '998901234567'
});

console.log('SMS yuborildi:', sent.success);

Umumiy xatolar

Chek topilmadi (-31400)

Bu xato chek ID bilan chek topilmaganini bildiradi.

Yechim: Chek ID ni tekshiring.

typescript
try {
  const receipt = await subscribeServer.receiptsGet({
    id: receiptId
  });
} catch (error) {
  if (error instanceof PaymeError && error.code === -31400) {
    console.log('Chek topilmadi');
    // Chek ID ni tekshiring
  }
}

Chek allaqachon to'langan (-31401)

Bu xato chek allaqachon to'langanini bildiradi.

Yechim: Chek holatini tekshiring.

typescript
const status = await subscribeServer.receiptsCheck({
  id: receipt.receipt._id
});

if (status.state === 1) {
  console.log('Chek allaqachon to\'langan');
  return;
}

Chek allaqachon bekor qilingan (-31402)

Bu xato chek allaqachon bekor qilinganini bildiradi.

Yechim: Yangi chek yarating.

typescript
try {
  const paid = await subscribeServer.receiptsPay({
    id: receipt.receipt._id,
    token: token
  });
} catch (error) {
  if (error instanceof PaymeError && error.code === -31402) {
    console.log('Chek allaqachon bekor qilingan');
    // Yangi chek yarating
  }
}

Noto'g'ri chek holati (-31403)

Bu xato chek holati berilgan amaliyot uchun yaroqsiz ekanligini bildiradi.

Yechim: Chek holatini tekshiring va to'g'ri amaliyotni bajaring.

typescript
const status = await subscribeServer.receiptsCheck({
  id: receipt.receipt._id
});

console.log('Hozirgi holat:', status.state);

if (status.state === 0) {
  // Chekni to'lash mumkin
  await subscribeServer.receiptsPay({ id, token });
} else if (status.state === 2) {
  // Chek bekor qilingan, yangi yarating
  console.log('Chek bekor qilingan');
}

Chek muddati o'tgan (-31404)

Bu xato chek muddati o'tganini bildiradi.

Yechim: Yangi chek yarating.

Chekni bekor qilish

Chekni bekor qilish uchun:

typescript
async function cancelReceipt(receiptId: string) {
  try {
    const cancelled = await subscribeServer.receiptsCancel({
      id: receiptId
    });

    console.log('Chek bekor qilindi');
    console.log('Bekor qilingan vaqti:', cancelled.receipt.cancel_time);

    // Mahsulot zaxirasini tiklang
    await restoreInventory(receiptId);

  } catch (error) {
    if (error instanceof PaymeError) {
      switch (error.code) {
        case -31400:
          console.log('Chek topilmadi');
          break;
        case -31402:
          console.log('Chek allaqachon bekor qilingan');
          break;
        default:
          console.log('Xato:', error.message);
      }
    }
  }
}

Cheklar hisoboti

Vaqt orqali cheklar hisobotini olish:

typescript
async function getReceiptsReport(
  startDate: Date,
  endDate: Date
) {
  const receipts = await subscribeServer.receiptsGetAll({
    from: startDate.getTime(),
    to: endDate.getTime(),
    limit: 100
  });

  const totalAmount = receipts.receipts.reduce((sum, receipt) => {
    return sum + receipt.amount;
  }, 0);

  console.log('Cheklar soni:', receipts.receipts.length);
  console.log('Umumiy summa:', totalAmount / 100, 'so\'m');

  return receipts;
}

// Ishlatish
const report = await getReceiptsReport(
  new Date('2024-01-01'),
  new Date('2024-01-31')
);

To'liq misol

typescript
import { PaymeSubscribe, PaymeError } from '@joyida/payme';

const subscribeServer = new PaymeSubscribe({
  merchantId: process.env.PAYME_MERCHANT_ID!,
  password: process.env.PAYME_PASSWORD!
}, 'server');

// Chek yaratish va to'lash
async function createAndPayReceipt(
  userId: string,
  amount: number,
  description: string
) {
  try {
    // 1. Chek yaratish
    const receipt = await subscribeServer.receiptsCreate({
      amount: amount,
      account: { user_id: userId },
      description: description
    });

    console.log('Chek yaratildi:', receipt.receipt._id);

    // 2. Mijozning saqlangan kartasini olish
    const savedToken = await getUserToken(userId);

    if (!savedToken) {
      throw new Error('Mijozda saqlangan karta yo\'q');
    }

    // 3. Chekni to'lash
    const paid = await subscribeServer.receiptsPay({
      id: receipt.receipt._id,
      token: savedToken
    });

    console.log('To\'lov muvaffaqiyatli:', paid.receipt.state);

    // 4. Chek invitisini SMS yuborish
    const sent = await subscribeServer.receiptsSend({
      id: receipt.receipt._id,
      phone: await getUserPhone(userId)
    });

    console.log('SMS yuborildi:', sent.success);

    return paid.receipt;

  } catch (error) {
    if (error instanceof PaymeError) {
      switch (error.code) {
        case -31400:
          console.log('Chek topilmadi');
          break;
        case -31401:
          console.log('Chek allaqachon to\'langan');
          break;
        case -31402:
          console.log('Chek allaqachon bekor qilingan');
          break;
        case -31404:
          console.log('Chek muddati o\'tgan');
          break;
        default:
          console.log('Xato:', error.message);
      }
    }
    throw error;
  }
}

// Ishlatish
const receipt = await createAndPayReceipt(
  'user_123',
  500000,
  'Buyurtma #123'
);

MIT Lizenziyasi ostida chiqarilgan.