Процес на плащане
Хотелът определя в панела кои типове плащане приема за онлайн резервации. Резервационната система показва този списък и следва различен път за всеки тип. Това ръководство описва четирите типа плащане и какво да направите при всеки от тях.
Изведете типовете плащане#
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; резултатът се съобщава чрез query параметри, добавени към него (sonuc=1 успех, sonuc=0 неуспех). Вашият номер на поръчка (orderID) се съхранява със записа за плащането; при връщането го съпоставете със собствения си запис и изпратете резервацията само ако плащането е успешно.
| Поле | Бележка |
|---|---|
totalPrice | Трябва да е равно на сбора на кошницата; тази сума се изпраща към доставчика. |
orderID | Трябва да е уникално. Използването на ID на резервацията улеснява равняването. |
countryID | id от списъка с държави. |
baskets[] | По един ред за всяка стая или допълнителна услуга. id е ID на типа стая / пакета, piece — количеството, price — единичната цена. |
Директно използване на данните за виртуалния POS#
Ако искате да се свързвате с доставчика от собствения си сървър вместо през платежната страница на HMS, крайната точка данни за виртуален POS връща ID на търговеца, ключовете и кода на доставчика. Това са тайни данни: използвайте ги само на сървъра и първо съгласувайте този подход с HMS.
След плащането#
- При тип 10 изпратете резервацията след потвърждение на плащането; не изпращайте резервация при неуспешно плащане.
- При тип 3 изпратете резервацията веднага; хотелът отбелязва превода в панела, когато бъде получен.
- При изпращането на резервацията
Total.amountAfterTaxesтрябва да е равно на събраната или предстоящата за събиране сума.