Payme Kisuke.uz β€” PayMe API Package

Go package: payme.kisuke.uz

Ushbu paket PayMe.uz merchant API bilan ishlash uchun yaratilgan Go dasturlash tilida yozilgan to'liq paket.

Go PayMe API Webhook Receipts

✨ Xususiyatlar

  • To'liq Receipts API β€” Barcha PayMe receipts methodlari qo'llab-quvvatlanadi
  • Webhook Handler β€” PayMe webhook so'rovlarini avtomatik qayta ishlash
  • Type Safety β€” Kuchli type system bilan xatolarni oldini olish
  • Error Handling β€” To'liq xatolarni qayta ishlash
  • Test Mode β€” Test va production muhitlari uchun alohida endpointlar
  • Documentation β€” To'liq hujjatlar va misollar

πŸ“¦ O'rnatish

go get payme.kisuke.uz

πŸš€ Tezkor Boshlash

1. Client Yaratish

package main

import (
    "context"
    "fmt"
    "payme.kisuke.uz/pkg/payme"
)

func main() {
    // PayMe client yaratish
    client := payme.NewClient(payme.ClientConfig{
        PaymeID:        "your-payme-id",
        PaymeKey:       "your-payme-key",
        IsTestMode:     true,
        RequisiteName:  "order_id", // charge_id, order_id, yoki id
        Timeout:        30,
    })

    // Receipt yaratish - RequisiteName ga qarab account map yaratish
    account := map[string]interface{}{
        client.RequisiteName: "123", // charge_id, order_id, yoki id
        "card_id":            "9999",
        "reason":             "test_payment",
    }

    // Receipt yaratish
    req := &payme.CreateReceiptRequest{
        Amount:      10000, // 100 so'm (tiyinda)
        Account:     map[string]interface{}{"charge_id": "123"},
        Description: "Test receipt",
        Detail:      map[string]interface{}{"method": "test"},
    }

    ctx := context.Background()
    resp, err := client.CreateReceipt(ctx, req)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Receipt yaratildi: %s\n", resp.Receipt.ID)
}

2. Webhook Handler

package main

import (
    "github.com/gofiber/fiber/v2"
    "payme.kisuke.uz/pkg/payme"
    "time"
)

// SimpleReceiptProvider webhook handler
type SimpleReceiptProvider struct{}

func (rp *SimpleReceiptProvider) CreateReceipt(params map[string]interface{}) (*payme.CreateReceiptResponse, error) {
    // Receipt yaratish logic
    receipt := &payme.Receipt{
        ID:          "receipt_123",
        CreateTime:  time.Now().UnixMilli(),
        State:       payme.ReceiptStateCreated,
        Amount:      10000,
        Currency:    payme.CurrencyUZS,
        Description: "Test receipt",
    }
    
    return &payme.CreateReceiptResponse{Receipt: receipt}, nil
}

// Boshqa methodlarni ham implement qilish kerak...

func main() {
    app := fiber.New()
    
    // Webhook endpoint ni sozlash
    payme.SetupWebhookWithPath(app, "your-payme-key", &SimpleReceiptProvider{}, "/webhook/payme")
    
    app.Listen(":8080")
}

βš™οΈ Sozlamalar

RequisiteName

RequisiteName field PayMe API ga yuboriladigan account object da qaysi nom ishlatilishini belgilaydi:

  • charge_id β€” PayMe merchant ID (default)
  • order_id β€” Order ID
  • id β€” Universal ID

Bu field ga qarab, account map da to'g'ri nom ishlatiladi:

// charge_id bilan
client.RequisiteName = "charge_id"
account := map[string]interface{}{
    "charge_id": "123",
    "card_id":   "9999",
    "reason":    "test_payment",
}

// order_id bilan  
client.RequisiteName = "order_id"
account := map[string]interface{}{
    "order_id": "123",
    "card_id":  "9999", 
    "reason":   "test_payment",
}

ClientConfig

FieldTypeDescriptionDefault
PaymeIDstringPayMe merchant ID-
PaymeKeystringPayMe merchant key-
IsTestModeboolTest mode (true = test endpoint, false = production)false
RequisiteNamestringRekvizit nomi (charge_id, order_id, yoki id). Bu field PayMe API ga yuboriladigan account object da qaysi nom ishlatilishini belgilaydiid
Timeouttime.DurationHTTP request timeout30s
Logger*log.LoggerLogger instancenil
HTTPClienthttp.ClientCustom HTTP clienthttp.DefaultClient
BaseURLstringCustom base URLAvtomatik (test/production)

πŸ’° Currency Codes

PayMe API qo'llab-quvvatlaydigan currency codes:

CodeCurrencySymbolDescription
860UZSсумUzbekistan Som
840USD$US Dollar
978EUR€Euro

πŸ“š API Methodlari

Receipts API

MethodMaqsadDescription
receipts.createChek yaratishYangi to'lov cheki yaratish
receipts.payChekni to'lashMavjud chekni to'lash
receipts.sendChekni yuborishChekni mijozga yuborish
receipts.cancelChekni bekor qilishChekni bekor qilish
receipts.checkChek holatini tekshirishChek holatini tekshirish
receipts.getChek ma'lumotini olishChek ma'lumotlarini olish
receipts.get_allBarcha cheklarni olishBarcha cheklarni olish (vaqt oralig'i va soni bilan)
receipts.set_fiscal_dataFiscal ma'lumotlarni o'rnatishFiscal ma'lumotlarni o'rnatish

Sizning receipts.create Requestingiz

{
  "charge_id": 123,
  "method": "receipts.create",
  "params": {
    "amount": 10000,
    "account": {
      "charge_id": 108,
      "card_id": "9999",
      "reason": "1232132132132131"
    },
    "description": "DESC",
    "detail": {
      "method": "refill_driver_balance"
    }
  }
}

Response:

{
  "result": {
    "receipt": {
      "_id": "receipt_108_1755113788",
      "create_time": 1755113788877,
      "state": 0,
      "amount": 10000,
      "currency": 860,
      "description": "DESC"
    }
  }
}

GetAllReceipts Method

// Barcha receiptlarni olish
from := time.Now().AddDate(0, -1, 0).UnixMilli() // 1 oy oldin
to := time.Now().UnixMilli()                      // Hozirgi vaqt
count := 10                                       // Maksimal soni

allReceipts, err := client.GetAllReceipts(ctx, from, to, count)
if err != nil {
    log.Printf("Xatolik: %v", err)
} else {
    fmt.Printf("Jami receiptlar: %d\n", len(allReceipts.Receipts))
    
    for _, receipt := range allReceipts.Receipts {
        if receipt != nil {
            fmt.Printf("ID: %s, Summa: %s, Holat: %d\n",
                receipt.ID,
                payme.FormatAmount(receipt.Amount, receipt.Currency),
                receipt.State)
        }
    }
}

Parameters:

  • from β€” Boshlang'ich vaqt (Unix timestamp, millisecond)
  • to β€” Tugash vaqti (Unix timestamp, millisecond)
  • count β€” Maksimal qaytariladigan receipt soni

Response:

{
  "result": [
    {
      "_id": "receipt_1",
      "create_time": 1755113788877,
      "state": 1,
      "amount": 10000,
      "currency": 860
    },
    {
      "_id": "receipt_2",
      "create_time": 1755113788878,
      "state": 0,
      "amount": 20000,
      "currency": 860
    }
  ]
}

πŸ”§ Konfiguratsiya

Environment Variables

PAYME_ID=your-payme-id
PAYME_KEY=your-payme-key
PAYME_TEST_MODE=true
PAYME_TIMEOUT=30

Client Config

type ClientConfig struct {
    PaymeID    string `json:"payme_id"`     // PayMe merchant ID
    PaymeKey   string `json:"payme_key"`    // PayMe secret key
    IsTestMode bool   `json:"is_test_mode"` // Test mode (true/false)
    Timeout    int    `json:"timeout"`      // Request timeout (seconds)
}

🌐 Endpointlar

  • Test: https://checkout.test.paycom.uz/api
  • Production: https://checkout.paycom.uz/api

πŸ“Š Receipt States

StateDescription
0Yaratildi (Created)
1To'langan (Paid)
-1Bekor qilingan (Canceled)
-2Muddat o'tgan (Expired)

πŸ’° Currency Codes (Qoβ€˜shimcha)

CodeCurrency
860O'zbek so'mi (UZS)
840AQSH dollari (USD)
978Yevro (EUR)
810Rossiya rubli (RUB)

🚨 Error Codes

CodeDescription
-31611Noto'g'ri summa
-32602Noto'g'ri parametrlar
-31400Karta topilmadi
-32504Ruxsat berilmagan
-32700Parse xatosi
-32601Method topilmadi

πŸ“ Fayl Strukturasi

payment-kisuke-uz/
β”œβ”€β”€ pkg/
β”‚   └── payme/
β”‚       β”œβ”€β”€ constants/     # Konstantalar
β”‚       β”œβ”€β”€ types/         # Data turlari
β”‚       β”œβ”€β”€ client/        # HTTP client
β”‚       β”œβ”€β”€ handlers/      # Webhook handler
β”‚       └── payme.go       # Asosiy paket
β”œβ”€β”€ example/               # Misollar
β”œβ”€β”€ go.mod                 # Go moduli
└── README.md              # Hujjat

πŸ§ͺ Test Qilish

cd payment-kisuke-uz
go mod tidy
go run example/main.go

πŸ”’ Xavfsizlik

  • API Key β€” Har doim xavfsiz saqlang
  • HTTPS β€” Faqat HTTPS orqali ishlatish
  • Validation β€” Barcha inputlarni tekshirish
  • Rate Limiting β€” So'rovlar sonini cheklash

🀝 Hissa Qo'shish

  1. Repository ni fork qiling
  2. Yangi branch yarating
  3. O'zgarishlarni qo'shing
  4. Pull request yuboring

πŸ“„ License

MIT License β€” LICENSE faylini ko'ring

πŸ“ž Aloqa

πŸ™ Minnatdorchilik

  • PayMe.uz β€” To'lov tizimi
  • Go β€” Dasturlash tili

Made with ❀️ by Kisuke.uz