Skip to content

Xato Kodlari Foydalanish Misollari

Payme xato kodi konstantalaridan foydalanish bo'yicha to'liq qo'llanma.

Umumiy Ko'rinish

Kutubxona barcha Payme API xatoliklari uchun keng qamrovli xato kodi konstantalarini taqdim etadi. Bu xato ishlashni o'qilishi va saqlanishi osonroq qiladi.

Xato Kodlarini Import Qilish

typescript
import {
  PAYME_ERROR_CODES,
  ERROR_MESSAGES,
  getErrorMessage,
  PaymeError
} from '@joyida/payme';

Xato Kodlaridan Foydalanish

Asosiy Xato Ishlash

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

const payme = new PaymeMerchant({
  merchantId: process.env.PAYME_MERCHANT_ID!,
  secretKey: process.env.PAYME_SECRET_KEY!
});

try {
  await payme.createTransaction(params);
} catch (error) {
  if (error instanceof PaymeError) {
    switch (error.code) {
      case PAYME_ERROR_CODES.FORBIDDEN:
        console.error('Noto\'g\'ri maxfiy ma\'lumotlar');
        break;

      case PAYME_ERROR_CODES.INVALID_AMOUNT:
        console.error('Noto\'g\'ri to\'lov summasi');
        break;

      case PAYME_ERROR_CODES.TRANSACTION_NOT_FOUND:
        console.error('Tranzaktsiya topilmadi');
        break;

      case PAYME_ERROR_CODES.ACCOUNT_NOT_FOUND:
        console.error('Buyurtma topilmadi');
        break;

      case PAYME_ERROR_CODES.ORDER_ALREADY_PAID:
        console.error('Buyurtma allaqachon to\'langan');
        break;

      case PAYME_ERROR_CODES.CANNOT_CANCEL:
        console.error('Bekor qilib bo\'lmaydi - buyurtma bajarilgan');
        break;

      default:
        console.error(`Payme xatosi: ${error.message}`);
    }
  }
}

Merchant API Xato Kodlaridan Foydalanish

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

const payme = new PaymeMerchant({
  merchantId: process.env.PAYME_MERCHANT_ID!,
  secretKey: process.env.PAYME_SECRET_KEY!
});

try {
  await payme.performTransaction({ id: paymeId });
} catch (error) {
  if (error instanceof PaymeError) {
    switch (error.code) {
      case PAYME_ERROR_CODES.TRANSACTION_NOT_FOUND:
        console.error('Tranzaktsiya topilmadi');
        break;

      case PAYME_ERROR_CODES.INVALID_STATE:
        console.error('Noto\'g\'ri tranzaktsiya holati');
        break;

      case PAYME_ERROR_CODES.CANNOT_PERFORM:
        console.error('Tranzaktsiyani bajarib bo\'lmaydi');
        break;

      case PAYME_ERROR_CODES.ALREADY_DONE:
        console.error('Tranzaktsiya allaqachon yakunlangan');
        break;

      default:
        console.error(`Xato: ${error.message}`);
    }
  }
}

Subscribe API Xato Kodlaridan Foydalanish

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

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

try {
  await subscribe.receiptsPay({
    id: receiptId,
    token: cardToken
  });
} catch (error) {
  if (error instanceof PaymeError) {
    switch (error.code) {
      case PAYME_ERROR_CODES.CARD_NOT_FOUND:
        console.error('Karta topilmadi');
        break;

      case PAYME_ERROR_CODES.CARD_EXPIRED:
        console.error('Karta muddati o\'tgan');
        break;

      case PAYME_ERROR_CODES.CARD_BLOCKED:
        console.error('Karta bloklangan');
        break;

      case PAYME_ERROR_CODES.INSUFFICIENT_FUNDS:
        console.error('Mablag\' yetarli emas');
        break;

      case PAYME_ERROR_CODES.CARD_VERIFICATION_FAILED:
        console.error('Karta tasdiqlash muvaffaqiyatsiz');
        break;

      case PAYME_ERROR_CODES.RECEIPT_NOT_FOUND:
        console.error('Chek topilmadi');
        break;

      case PAYME_ERROR_CODES.RECEIPT_ALREADY_PAID:
        console.error('Chek allaqachon to\'langan');
        break;

      default:
        console.error(`Xato: ${error.message}`);
    }
  }
}

Xato Xabarlarini Olish

ERROR_MESSAGES dan Foydalanish

typescript
import { ERROR_MESSAGES, PAYME_ERROR_CODES } from '@joyida/payme';

const errorCode = PAYME_ERROR_CODES.INVALID_AMOUNT;
const message = ERROR_MESSAGES[errorCode];

console.log(message); // "Invalid amount"

getErrorMessage Yordamchisidan Foydalanish

typescript
import { getErrorMessage, PAYME_ERROR_CODES } from '@joyida/payme';

const message1 = getErrorMessage(PAYME_ERROR_CODES.FORBIDDEN);
console.log(message1); // "Forbidden - Invalid credentials"

const message2 = getErrorMessage(PAYME_ERROR_CODES.CARD_EXPIRED);
console.log(message2); // "Card has expired"

const message3 = getErrorMessage(-99999);
console.log(message3); // "Unknown error (code: -99999)"

To'liq Xato Ishlash Misoli

typescript
import {
  PaymeMerchant,
  PaymeError,
  PAYME_ERROR_CODES,
  getErrorMessage
} from '@joyida/payme';

const payme = new PaymeMerchant({
  merchantId: process.env.PAYME_MERCHANT_ID!,
  secretKey: process.env.PAYME_SECRET_KEY!
});

async function processPayment(orderId: string, amount: number) {
  try {
    const paymeId = generatePaymeId();

    const created = await payme.createTransaction({
      id: paymeId,
      time: Date.now(),
      amount,
      account: { order_id: orderId }
    });

    const performed = await payme.performTransaction({
      id: paymeId
    });

    return {
      success: true,
      transactionId: performed.transaction
    };

  } catch (error) {
    if (error instanceof PaymeError) {
      // Xatoni kod va xabar bilan jurnalga yozish
      console.error({
        code: error.code,
        message: error.message,
        description: getErrorMessage(error.code)
      });

      // Muayyan xatolarni ishlash
      switch (error.code) {
        case PAYME_ERROR_CODES.FORBIDDEN:
          throw new Error('To\'lov tizimi sozlamalari xatosi');

        case PAYME_ERROR_CODES.INVALID_AMOUNT:
          throw new Error('Noto\'g\'ri to\'lov summasi');

        case PAYME_ERROR_CODES.ACCOUNT_NOT_FOUND:
          throw new Error('Buyurtma topilmadi');

        case PAYME_ERROR_CODES.ORDER_ALREADY_PAID:
          throw new Error('Buyurtma allaqachon to\'langan');

        case PAYME_ERROR_CODES.ORDER_CANCELLED:
          throw new Error('Buyurtma bekor qilingan');

        case PAYME_ERROR_CODES.ORDER_EXPIRED:
          throw new Error('Buyurtma muddati o\'tgan');

        case PAYME_ERROR_CODES.TRANSACTION_NOT_FOUND:
          throw new Error('Tranzaktsiya topilmadi');

        case PAYME_ERROR_CODES.CANNOT_PERFORM:
          throw new Error('To\'lovni yakunlab bo\'lmaydi');

        case PAYME_ERROR_CODES.TRANSPORT_ERROR:
          throw new Error('To\'lov tizimi vaqtinchalik mavjud emas');

        default:
          throw new Error(`To'lov xatosi: ${error.message}`);
      }
    }
    throw error;
  }
}

Xato Kod Kategoriyalari

JSON-RPC Protokol Xatoliklari

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

// Protokol xatoliklari
PAYM E_ERROR_CODES.PARSE_ERROR          // -32700
PAYM E_ERROR_CODES.INVALID_REQUEST      // -32600
PAYM E_ERROR_CODES.METHOD_NOT_FOUND     // -32601
PAYM E_ERROR_CODES.INVALID_PARAMS       // -32602
PAYM E_ERROR_CODES.INTERNAL_ERROR       // -32603
PAYM E_ERROR_CODES.TRANSPORT_ERROR      // -32400
PAYM E_ERROR_CODES.METHOD_NOT_POST      // -32300
PAYM E_ERROR_CODES.FORBIDDEN            // -32504

Tranzaktsiya Xatoliklari

typescript
// Tranzaktsiya xatoliklari
PAYM E_ERROR_CODES.INVALID_AMOUNT           // -31001
PAYM E_ERROR_CODES.INVALID_ACCOUNT          // -31002
PAYM E_ERROR_CODES.TRANSACTION_NOT_FOUND    // -31003
PAYM E_ERROR_CODES.INVALID_STATE            // -31004
PAYM E_ERROR_CODES.TRANSACTION_CANCELLED    // -31005
PAYM E_ERROR_CODES.TRANSACTION_EXISTS       // -31006
PAYM E_ERROR_CODES.CANNOT_CANCEL            // -31007
PAYM E_ERROR_CODES.CANNOT_PERFORM           // -31008

Akkaunt Xatoliklari

typescript
// Akkaunt xatoliklari (diapazon: -31050 dan -31099 gacha)
PAYM E_ERROR_CODES.ACCOUNT_NOT_FOUND        // -31050
PAYM E_ERROR_CODES.ACCOUNT_BLOCKED          // -31051
PAYM E_ERROR_CODES.ACCOUNT_INACTIVE         // -31052
PAYM E_ERROR_CODES.INSUFFICIENT_PRIVILEGES  // -31053
PAYM E_ERROR_CODES.ACCOUNT_LIMIT_EXCEEDED   // -31054
PAYM E_ERROR_CODES.ORDER_ALREADY_PAID       // -31055
PAYM E_ERROR_CODES.ORDER_CANCELLED          // -31056
PAYM E_ERROR_CODES.ORDER_NOT_AVAILABLE      // -31057
PAYM E_ERROR_CODES.INVALID_ORDER_AMOUNT     // -31058
PAYM E_ERROR_CODES.ORDER_EXPIRED            // -31059
PAYM E_ERROR_CODES.ALREADY_DONE             // -31060
PAYM E_ERROR_CODES.PENDING_TRANSACTION      // -31099

Karta Xatoliklari

typescript
// Karta xatoliklari (diapazon: -31300 dan -31310 gacha)
PAYM E_ERROR_CODES.CARD_NOT_FOUND           // -31300
PAYM E_ERROR_CODES.CARD_EXPIRED             // -31301
PAYM E_ERROR_CODES.CARD_BLOCKED             // -31302
PAYM E_ERROR_CODES.INSUFFICIENT_FUNDS       // -31303
PAYM E_ERROR_CODES.CARD_VERIFICATION_FAILED // -31304
PAYM E_ERROR_CODES.INVALID_CARD_NUMBER      // -31305
PAYM E_ERROR_CODES.INVALID_CARD_EXPIRY      // -31306
PAYM E_ERROR_CODES.CARD_NOT_SUPPORTED       // -31307
PAYM E_ERROR_CODES.CARD_LIMIT_EXCEEDED      // -31308
PAYM E_ERROR_CODES.TOO_MANY_ATTEMPTS        // -31309
PAYM E_ERROR_CODES.CARD_ALREADY_EXISTS      // -31310

Chek Xatoliklari

typescript
// Chek xatoliklari (diapazon: -31400 dan -31405 gacha)
PAYM E_ERROR_CODES.RECEIPT_NOT_FOUND        // -31400
PAYM E_ERROR_CODES.RECEIPT_ALREADY_PAID     // -31401
PAYM E_ERROR_CODES.RECEIPT_CANCELLED        // -31402
PAYM E_ERROR_CODES.INVALID_RECEIPT_STATE    // -31403
PAYM E_ERROR_CODES.RECEIPT_EXPIRED          // -31404
PAYM E_ERROR_CODES.INVALID_RECEIPT_AMOUNT   // -31405

Fiskal Xatoliklari

typescript
// Fiskal xatoliklari
PAYM E_ERROR_CODES.FISCAL_CHECK_NOT_FOUND   // -32001
PAYM E_ERROR_CODES.FISCAL_MODULE_ERROR      // -32002
PAYM E_ERROR_CODES.FISCAL_DATA_INVALID      // -32003

Xato Jurnalini Yuritish

Structured Xato Jurnali

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

function logPaymeError(error: PaymeError, context: Record<string, unknown>) {
  const logEntry = {
    timestamp: new Date().toISOString(),
    errorCode: error.code,
    errorMessage: error.message,
    errorDescription: getErrorMessage(error.code),
    context,
    isRetryable: isRetryableError(error.code)
  };

  console.error(JSON.stringify(logEntry));
}

function isRetryableError(code: number): boolean {
  // Tarmoq va vaqtinchalik xatoliklar qayta urinish mumkin
  return [
    PAYME_ERROR_CODES.TRANSPORT_ERROR,
    PAYME_ERROR_CODES.INTERNAL_ERROR
  ].includes(code);
}

// Foydalanish
try {
  await payme.createTransaction(params);
} catch (error) {
  if (error instanceof PaymeError) {
    logPaymeError(error, {
      operation: 'createTransaction',
      orderId: params.account.order_id,
      amount: params.amount
    });
  }
}

Eng Yaxshi Amaliyotlar

✅ Kerakli ishlar

  1. Sehrli raqamlar o'rniga konstantalardan foydalaning

    typescript
    // ✅ YAXSHI
    if (error.code === PAYME_ERROR_CODES.FORBIDDEN) {
      console.error('Noto\'g\'ri maxfiy ma\'lumotlar');
    }
    
    // ❌ YOMON
    if (error.code === -32504) {
      console.error('Noto\'g\'ri maxfiy ma\'lumotlar');
    }
  2. Foydalanuvchiga qulay xabarlar uchun getErrorMessage dan foydalaning

    typescript
    // ✅ YAXSHI
    const message = getErrorMessage(error.code);
    showErrorToUser(message);
  3. Muayyan xatolarni ishlang

    typescript
    // ✅ YAXSHI
    switch (error.code) {
      case PAYME_ERROR_CODES.CARD_EXPIRED:
        return 'Iltimos, kartangizni yangilang';
      case PAYME_ERROR_CODES.INSUFFICIENT_FUNDS:
        return 'Mablag\' yetarli emas';
    }
  4. Debugging uchun xato kodlarini jurnalga yozing

    typescript
    // ✅ YAXSHI
    console.error({
      code: error.code,
      message: getErrorMessage(error.code),
      context: { orderId, amount }
    });

❌ Kerakli emaslar

  1. Sehrli raqamlardan foydalanmang
  2. Xato kodlarini e'tiborsiz qoldirmang
  3. Foydalanuvchilarga texnik xatolarni ko'rsatmang
  4. Qayta urinib bo'ladigan xatolarda qayta urinmang

Keyingi Qadamlar

MIT Lizenziyasi ostida chiqarilgan.