/v1/webhook
Status o‘zgarishi haqida bildirishnomalar.
Buyurtma statusi yoki buyurtma bo‘yicha operatsiya statusi o‘zgarganda so‘rov yuboriladi.
Dastaklanadigan hodisalar:
ORDER_STATUS_UPDATED– buyurtma holati yangilash;OPERATION_STATUS_UPDATED– mablag‘ yechish, qaytarish yoki to‘lovni bekor qilish operatsiyasi holatni yangilash.
So‘rov formati
So‘rov application/octet-stream formatida yuboriladi va ES256 algoritmi bilan imzolangan JWT-token ko‘rinishida bo‘ladi. So‘rovni qayta ishlashdan oldin uning haqiqiyligini tekshiring. Buni qanday qilish haqida Autentifikatsiyabo‘limida o‘qing.
Tekshirilib dekod qilingan JWT-tokenning payload qismi hodisa ma’lumotlarini o‘z ichiga olgan JSON'dan iborat bo‘ladi. Hodisalar misollarini ko‘ring.
Agar token ichida so‘rov tanasi mavjud bo‘lmasa
- Do‘kon bekendi
Content-Type: application/octet-streamsarlavhasi bilan keladigan xabarlarni qabul qila olishiga ishonch hosil qiling. - Brandmauer kiruvchi so‘rovlarni bloklamayotganini va so‘rov tanasini kesib tashlamayotganini tekshiring.
Boshqa xatoliklarni Webhooklar bilan bog‘liq muammolarni hal qilishbo‘limida ko‘ring.
Operatsiyalar idempotentligi
Buyurtma bilan bog‘liq amallarni bajarishda, masalan, /v2/orders/{order_id}/refund metodi orqali mablag‘larni qaytarishda, operatsiyaning noyob identifikatori – externalOperationIdni uzating.
U yordamida siz:
- qaysi operatsiya bo‘yicha bildirishnoma kelganini aniqlashingiz;
- v1/operations/{external_operation_id} metodi orqali operatsiya holatini tekshirishingiz;
- operatsiya takrorlanishidan himoyalanishingiz mumkin.
Agar siz bir xil externalOperationId bilan so‘rovni qayta yuborsangiz, quyidagilardan birini olasiz:
- operatsiya jarayonda bo‘lsa, joriy operatsiya haqida ma’lumot;
- operatsiya yakunlangan bo‘lsa,
reasonCode: "DUPLICATE_EXTERNAL_OPERATION_ID"xatosi.
Hodisalar misollari
Buyurtma to‘lovi
{
"merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx",
"event": "ORDER_STATUS_UPDATED",
"eventTime": "2023-11-26T08:11:09.359370+00:00",
"order":{
"orderId": "700aa3f04df64b3b8712d6b51f752e8b",
"paymentStatus": "CAPTURED"
}
}
JWT-token namunasi bilan jwt.io saytida tanishishingiz mumkin.
Yandex tomonidan do‘kon bekendiga yuboriladigan so‘rov namunasi:
curl -X POST https://test.uz/some/prefix/v1/webhook \
--header 'User-Agent: YandexPay/1.0' \
--header 'Accept: \*/\*' \
--header 'Content-Type: application/octet-stream' \
--header 'X-Request-Id: ff2a54885c4e45309853d2e33af1d63b\\_3a70f3062db640fcb2f3c34de1a27bd5' \
--header 'X-Request-Timeout: 13970' \
--compressed \
-d eyJhbGciOiJFUzI1NiIsImV4cCI6MTcwMDk4NzYwMCwiaWF0IjoxNzAwOTg3MzAwLCJraWQiOiIxLW1lcmNoYW50LWFwaSIsInR5cCI6IkpXVCJ9.eyJtZXJjaGFudElkIjoieHh4eHh4eHh4LXh4eC01eHh4LXh4eHh4LXh4eHh4eHh4IiwiZXZlbnQiOiJPUkRFUl9TVEFUVVNfVVBEQVRFRCIsImV2ZW50VGltZSI6IjIwMjMtMTEtMjZUMDg6MTE6MDkuMzU5MzcwKzAwOjAwIiwib3JkZXIiOnsib3JkZXJJZCI6IjcwMGFhM2YwNGRmNjRiM2I4NzEyZDZiNTFmNzUyZThiIiwicGF5bWVudFN0YXR1cyI6IkNBUFRVUkVEIn19.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{
"merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx",
"event": "ORDER_STATUS_UPDATED",
"eventTime": "2024-04-25T07:56:29.974810+00:00",
"order":{
"orderId": "253222_1714029088",
"paymentStatus": "FAILED"
}
}
JWT-token namunasi bilan jwt.io saytida tanishishingiz mumkin.
Qaytarish
Maslahat
Avval qaytarishlar qanday ishlashini /v2/orders/{order_id}/refund bo‘limida o‘rganing.
To‘liq qaytarish
Buyurtma holati o‘zgargan-o‘zgarmaganidan qat’i nazar, 2 ta notifikatsiya yuboriladi: operatsiya bo‘yicha va buyurtma bo‘yicha.
-
OPERATION_STATUS_UPDATED– qaytarish operatsiyasi muvaffaqiyatli yakunlandi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "OPERATION_STATUS_UPDATED", "eventTime": "2024-04-19T10:27:53.323878+00:00", "operation":{ "operationId": "73dec2cd-db5c-4386-be6d-10c5b5a2ee09", "orderId": "86283", "status": "SUCCESS", "operationType": "REFUND" } } -
ORDER_STATUS_UPDATED– buyurtma yakuniyREFUNDEDholatiga o‘tdi. Endi qaytarishlarni chaqirish mumkin emas.{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2024-04-19T12:16:28.766392+00:00", "order":{ "orderId": "86283", "paymentStatus": "REFUNDED" } }JWT-token namunasi bilan jwt.io saytida tanishishingiz mumkin.
-
OPERATION_STATUS_UPDATED– qaytarish operatsiyasi muvaffaqiyatsiz yakunlandi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "OPERATION_STATUS_UPDATED", "eventTime": "2024-06-13T22:27:53.323878+00:00", "operation":{ "operationId": "73dec2cd-db5c-4386-be6d-10c5b5a2ee08", "orderId": "9c8aed6d-a8e5-4c6a-acd8-645538173f66", "status": "FAIL", "operationType": "REFUND" } }JWT-token namunasi bilan jwt.io saytida tanishishingiz mumkin.
-
ORDER_STATUS_UPDATED– buyurtma avvalgiCAPTUREDholatida qoldi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2024-06-13T22:27:54.323878+00:00", "order":{ "orderId": "9c8aed6d-a8e5-4c6a-acd8-645538173f66", "paymentStatus": "CAPTURED" } }
Qisman qaytarish
Siz buyurtmaning to‘liq summasini bir nechta qisman qaytarishlar orqali qaytarishingiz mumkin. Barcha qaytarishlar summasi buyurtmaning to‘liq qiymatiga yetganda, buyurtma yakuniy REFUNDED holatiga o‘tadi. Undan keyin qaytarishlarni amalga oshirib bo‘lmaydi.
Buyurtma holati o‘zgargan-o‘zgarmaganidan qat’i nazar, 2 ta notifikatsiya yuboriladi: operatsiya bo‘yicha va buyurtma bo‘yicha.
Misol sifatida uchta sharbatdan iborat buyurtmani ko‘rib chiqamiz.
-
Bitta sharbat uchun qisman qaytarish amalga oshirildi. Sizga 2 ta bildirishnoma keladi:
-
OPERATION_STATUS_UPDATED– qaytarish operatsiyasi muvaffaqiyatli yakunlandi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "OPERATION_STATUS_UPDATED", "eventTime": "2024-04-19T10:27:53.323878+00:00", "operation":{ "operationId": "73dec3cs-sd5t-4356-ne6d-10c79b5d2ee09", "externalOperationId": "123-partial-refund-1", "orderId": "123", "status": "SUCCESS", "operationType": "REFUND" } } -
ORDER_STATUS_UPDATED– buyurtmaPARTIALLY_REFUNDEDholatiga o‘tdi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2024-04-19T12:16:28.766392+00:00", "order":{ "orderId": "123", "paymentStatus": "PARTIALLY_REFUNDED" } }
-
-
Ikkinchi marta bir dona sharbat uchun qisman qaytarish amalga oshirildi. Sizga 2 ta bildirishnoma keladi:
-
OPERATION_STATUS_UPDATED– qaytarish operatsiyasi muvaffaqiyatli yakunlandi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "OPERATION_STATUS_UPDATED", "eventTime": "2024-04-19T13:27:53.323878+00:00", "operation":{ "operationId": "28fba9ds-kl2m-7891-qw3r-45e82c7f1bb12", "externalOperationId": "123-partial-refund-2", "orderId": "123", "status": "SUCCESS", "operationType": "REFUND" } } -
ORDER_STATUS_UPDATED– buyurtmaPARTIALLY_REFUNDEDholatida qoldi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2024-04-19T13:27:54.321878+00:00", "order":{ "orderId": "123", "paymentStatus": "PARTIALLY_REFUNDED" } }
-
-
Uchinchi qisman qaytarish amalga oshirildi. Barcha qaytarishlar summasi buyurtmaning to‘liq qiymatiga yetdi. Sizga 2 ta bildirishnoma keladi:
-
OPERATION_STATUS_UPDATED– qaytarish operatsiyasi muvaffaqiyatli yakunlandi:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "OPERATION_STATUS_UPDATED", "eventTime": "2024-04-19T13:40:51.323878+00:00", "operation":{ "operationId": "64abc2ts-rj4y-3187-mf5g-56b71e9a4dd67", "externalOperationId": "123-partial-refund-3", "orderId": "123", "status": "SUCCESS", "operationType": "REFUND" } } -
ORDER_STATUS_UPDATED– buyurtma yakuniyREFUNDEDholatiga o‘tdi. Endi qaytarishlarni chaqirish mumkin emas.{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2024-04-19T14:16:28.766392+00:00", "order":{ "orderId": "123", "paymentStatus": "REFUNDED" } }
-
Request
POST
https://example.merchant.uz/v1/webhook
Production
POST
https://sandbox.example.merchant.uz/v1/webhook
Sandbox
Body
application/json
{
"event": "TRANSACTION_STATUS_UPDATE",
"eventTime": "2025-05-26T21:00:36.08847+00:00",
"merchantId": "123e4567-e89b-12d3-a456-426614174000",
"operation": {
"externalOperationId": "example",
"operationId": "5d32f295-8723-457d-81f9-ab13f17b7bd6",
"operationType": "AUTHORIZE",
"orderId": "example",
"status": "PENDING"
},
"order": {
"cartUpdated": true,
"orderId": "example",
"paymentStatus": "PENDING"
},
"subscription": {
"customerSubscriptionId": "123e4567-e89b-12d3-a456-426614174000",
"nextWriteOff": "2025-01-01T00:00:00Z",
"status": "NEW",
"subscriptionPlanId": "123e4567-e89b-12d3-a456-426614174000"
}
}
|
Name |
Description |
|
event |
Type: string Hodisa turi:
Enum: |
|
eventTime |
Type: string<date-time> Hodisa vaqti Example: |
|
merchantId |
Type: string<uuid> Sotuvchining ID (identifikatori) raqami. Example: |
|
operation |
All of 1 type
Operatsiya haqida ma’lumot. Ma’lumot Example
|
|
order |
All of 1 type
Buyurtma haqida ma’lumot. Ma’lumot Example
|
|
subscription |
All of 1 type
Obuna holati. Example
|
OperationWebhookData
|
Name |
Description |
|
operationId |
Type: string<uuid> Operatsiya identifikatori. Example: |
|
operationType |
Type: string Operatsiya turi. Operatsiya turlari haqida batafsil ma’lumotni Operatsiya holatlari bo‘limida o‘qing. Enum: |
|
orderId |
Type: string Buyurtma yaratilganda v1/orders metodiga yuborilgan buyurtma ID raqami. Example: |
|
status |
Type: string Operatsiya holati. Operatsiya holatlari haqida batafsil ma’lumotni Operatsiya holatlari bo‘limida o‘qing. Enum: |
|
externalOperationId |
Type: string Sotuvchi tizimidagi operatsiya identifikatori. U noyob bo‘lishi kerak. Muayyan operatsiyani v1/operations/{external_operation_id} metodi orqali kuzatish uchun ushbu parametrni yuboring. Example: |
Example
{
"externalOperationId": "example",
"operationId": "5d32f295-8723-457d-81f9-ab13f17b7bd6",
"operationType": "AUTHORIZE",
"orderId": "example",
"status": "PENDING"
}
OrderWebhookData
|
Name |
Description |
|
orderId |
Type: string Buyurtma yaratilganda v1/orders metodiga yuborilgan buyurtma ID raqami. Example: |
|
paymentStatus |
Type: string Buyurtma holati. Batafsil ma’lumotni Buyurtma holati bo‘limida o‘qing. Enum: |
|
cartUpdated |
Type: boolean Savatcha yangilangan yoki yo‘qligi. Ballar orqali to‘lov amalga oshirilganda qaytariladi. Agar flag qiymati |
Example
{
"cartUpdated": true,
"orderId": "example",
"paymentStatus": "PENDING"
}
SubscriptionWebhookData
|
Name |
Description |
|
customerSubscriptionId |
Type: string<uuid> Obuna ID raqami. Obuna muvaffaqiyatli yaratilganda SDK tomonidan qaytariladi. Shuningdek, obunani u bo‘yicha kelgan birinchi bildirishnoma orqali ham saqlab qo‘yish mumkin. Ushbu obuna bo‘yicha keyingi yangilanishlar aynan shu maydon qiymati bilan yuboriladi. Example: |
|
status |
Type: string Obuna holati Enum: |
|
subscriptionPlanId |
Type: string<uuid> Shaxsiy kabinetda yoki API orqali yaratilgan obuna rejasi ID raqami. Example: |
|
nextWriteOff |
Type: string<date-time> Obuna bo‘yicha keyingi pul yechish urinishining sanasi Example: |
Example
{
"customerSubscriptionId": "123e4567-e89b-12d3-a456-426614174000",
"nextWriteOff": "2025-01-01T00:00:00Z",
"status": "NEW",
"subscriptionPlanId": "123e4567-e89b-12d3-a456-426614174000"
}
Responses
200 OK
Vebhuk muvaffaqiyatli qabul qilindi va qayta ishlangan.
Javob tanasi ixtiyoriy bo‘lishi mumkin, ammo quyidagini yuborish tavsiya etiladi: {"status": "success"}.
Agar 200 status kodi qaytarilsa, Yandex vebhuklarni qayta yuborishni to‘xtatadi.
Body
application/json
{
"status": "success"
}
|
Name |
Description |
|
status |
Type: string Default: |
400 Bad Request
Vebhukni qayta ishlashda xatolik.
Agar javob bo‘lmasa yoki 200dan boshqa status qaytarilsa, Yandex yangi JWT-token yaratadi va vebhukni qayta yuboradi:
- dastlabki 10 ta urinish har 5 ms dan keyin;
- keyin interval eksponentsial ravishda oshib boradi va 15 daqiqagacha yetadi;
- shundan so‘ng 24 soat davomida har 15 daqiqada yuboriladi. Qayta yuborishlarning umumiy davomiyligi – 24 soat. Shundan keyin vebhuk yetkazilmagan deb hisoblanadi.
Body
application/json
{
"reason": "example",
"reasonCode": "FORBIDDEN",
"status": "fail"
}
|
Name |
Description |
|
reasonCode |
Type: string Xatolik kodi:
Enum: |
|
reason |
Type: string Xatolik sababining tavsifi. Example: |
|
status |
Type: string Default: |