Процес оплати
Готель сам визначає в панелі, які типи оплати він приймає для онлайн-бронювань. Модуль бронювання показує цей список і для кожного типу діє по-своєму. У цьому посібнику описано чотири типи оплати й те, що потрібно робити для кожного з них.
Отримайте список типів оплати#
curl "https://test.hms.gen.tr/external/online/payment/type?hotelID=1000" \
-H "Authorization: Bearer $HMS_TOKEN"{
"success": true,
"count": 3,
"items": [
{
"title": "Pay at Hotel",
"title_translate": "odeme.otelde_odeme",
"typeID": 1
},
{
"title": "Bank Transfer",
"title_translate": "odeme.havale",
"typeID": 3
},
{
"title": "Online Card Payment",
"title_translate": "odeme.online_odeme",
"typeID": 10
}
]
}| typeID | Тип | Що відбувається |
|---|---|---|
1 | Оплата в готелі | Кошти не списуються; бронювання передається одразу. |
3 | Банківський переказ | Гостеві показують банківські рахунки готелю; бронювання передається зі статусом «очікує оплати». |
9 | Кредитна картка (гарантія) | Дані картки надсилаються в HMS разом із бронюванням у PaymentCard; кошти з картки списує готель. |
10 | Онлайн-оплата (віртуальний POS-термінал) | HMS запускає платіжний сеанс; гість переходить на платіжну сторінку провайдера й повертається на ваш returnUrl. |
Тип 1 · Оплата в готелі#
Додаткових кроків немає. За бажанням можна викликати ендпоінт, щоб отримати підтвердження:
{
"success": true,
"message": "payment_at_the_hotel"
}Тип 3 · Банківський переказ#
Отримайте банківські рахунки, які готель увімкнув для онлайн-продажу, і покажіть їх гостеві:
curl -X POST "https://test.hms.gen.tr/external/online/payment/type/3" \
-H "Authorization: Bearer $HMS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hotelID": 1000}'{
"success": true,
"message": "payment_by_bank_transfer",
"banks": [
{
"companyName": "Ziraat Bank",
"holder": "Demo Turizm A.Ş.",
"branchName": "Denizli",
"branchNumber": "0123",
"bankAccountNumber": "12345678-5001",
"iban": "TR00 0001 0001 2345 6789 5001 01"
}
]
}Якщо жодного рахунку не налаштовано, повертається bank_info_is_not_found; у такому разі приховайте цей тип зі списку.
Тип 9 · Кредитна картка#
Ендпоінт лише повідомляє, що потрібно зібрати дані картки:
{
"success": true,
"message": "credit_card_info_should_be_requested"
}Зберіть дані картки у власній формі й передайте їх у полі PaymentCard кожного елемента RoomStays під час передавання бронювання:
{
"PaymentCard": {
"CardHolder": {
"fullname": "Ayşe Demir",
"address": "Kumsal Cad. No: 12",
"country": "Türkiye",
"city": "Antalya"
},
"cardNumber": "5571135571135575",
"expireDate": "0329",
"cardCode": "MasterCard",
"seriesCode": "000"
}
}Тип 10 · Онлайн-оплата#
Запустіть платіжний сеанс із даними гостя й кошика. Усі поля обов’язкові; про відсутнє поле повідомляють required_input_info_not_submitted і errors[].
curl -X POST "https://test.hms.gen.tr/external/online/payment/type/10" \
-H "Authorization: Bearer $HMS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"hotelID": 1000,
"totalPrice": 2330.00,
"orderID": "4811174883",
"returnUrl": "https://booking.example.com/payment/result",
"name": "Ayşe", "surname": "Demir",
"email": "[email protected]", "phone": "05551112233",
"city": "Denizli", "address": "Kumsal Cad. No: 12", "countryID": 1,
"baskets": [
{ "id": 2, "name": "Standard Room · Bed & Breakfast", "piece": 1, "price": 1930.00 },
{ "id": 12, "name": "Dinner", "piece": 1, "price": 400.00 }
]
}'const res = await fetch("https://test.hms.gen.tr/external/online/payment/type/10", {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.HMS_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({
hotelID: 1000,
totalPrice: 2330.00,
orderID: "4811174883",
returnUrl: "https://booking.example.com/payment/result",
name: "Ayşe", surname: "Demir",
email: "[email protected]", phone: "05551112233",
city: "Denizli", address: "Kumsal Cad. No: 12", countryID: 1,
baskets: [
{ id: 2, name: "Standard Room · Bed & Breakfast", piece: 1, price: 1930.00 },
{ id: 12, name: "Dinner", piece: 1, price: 400.00 }
]
})
});
const data = await res.json();
if (!data.success) throw new Error(data.message + " " + (data.errors || []).join(", "));
// data.code — HTML-фрагмент, що передає гостя провайдерові: виведіть його без змін на своїй сторінці оплати
res.send(paymentPageTemplate({ providerHtml: data.code }));{
"success": true,
"message": "payment_order_code",
"code": "<form method=\"post\" action=\"https://vpos.provider.example/3d\"><input type=\"hidden\" name=\"orderId\" value=\"4811174883\"> … </form><script>document.forms[0].submit()</script>"
}Повернений code — це HTML-фрагмент: залежно від провайдера віртуального POS-термінала готелю це форма 3D Secure з автоматичним надсиланням, скрипт переспрямування window.location або вбудована платіжна форма (наприклад, iyzico). Виведіть фрагмент без змін на своїй сторінці оплати й не намагайтеся його розбирати. Гість завершує оплату на боці провайдера й повертається на ваш returnUrl; результат передається в доданих до нього параметрах запиту (sonuc=1 — успіх, sonuc=0 — невдача). Номер вашого замовлення (orderID) зберігається разом із записом про платіж; після повернення зіставте його з власним записом і передавайте бронювання, лише якщо оплата пройшла успішно.
| Поле | Примітка |
|---|---|
totalPrice | Має дорівнювати сумі кошика; саме ця сума передається провайдерові. |
orderID | Має бути унікальним. Якщо використовувати ID бронювання, звірка буде простішою. |
countryID | id зі списку країн. |
baskets[] | Один рядок на кожен номер або додаткову послугу. id — ідентифікатор типу номера / пакета, piece — кількість, price — ціна за одиницю. |
Пряме використання даних віртуального POS-термінала#
Якщо ви хочете підключатися до провайдера з власного сервера замість платіжної сторінки HMS, ендпоінт даних віртуального POS-термінала повертає ідентифікатор мерчанта, ключі та код провайдера. Це секретні дані: використовуйте їх лише на сервері й попередньо погодьте такий підхід із HMS.
Після оплати#
- Для типу 10 передавайте бронювання після підтвердження оплати; якщо оплата не пройшла, не передавайте його.
- Для типу 3 передавайте бронювання одразу; готель позначить переказ у панелі, коли кошти надійдуть.
- Під час передавання бронювання
Total.amountAfterTaxesмає дорівнювати сумі, яку вже отримано або буде отримано.