Flux de réservation
Le flux type d’un moteur de réservation : obtenir un jeton, lister les chambres pour les dates et l’occupation recherchées par le client, appliquer le tarif choisi et un éventuel coupon, effectuer l’étape de paiement, puis enregistrer la réservation dans HMS avec BookingPushRQ. Ce guide détaille chaque étape avec de vraies requêtes et réponses.
/external/public/login/external/online/roomTypecoupon/search · stock/packagespayment/type/{type}channel/booking1. Obtenir un jeton#
Connectez-vous une fois au démarrage de votre serveur ou à l’expiration du jeton, et stockez le jeton avec l’identifiant de l’hôtel. Détails : Authentification.
2. Lister les chambres#
Demandez la liste des chambres avec les valeurs du formulaire de recherche du client. S’il y a des enfants, envoyez leur âge ; la tarification enfant est calculée en fonction de l’âge.
curl "https://test.hms.gen.tr/external/online/roomType" \
-H "Authorization: Bearer $HMS_TOKEN" \
-d "hotelID=1000" -d "startDate=2026-08-18" -d "endDate=2026-08-20" \
-d "adultCount=2" -d "childCount=1" -d "childAges[]=7" -d "language=en"Ce qu’il faut afficher pour chaque type de chambre de la réponse :
| Champ | À l’écran |
|---|---|
name, images[], detail, roomFeatures[] | Fiche de la chambre |
roomCount | Chambres restantes. 0 signifie « non disponible à la vente » — la raison figure dans roomRestrictionMessage. |
accommodationTypes[].title | Formule de pension (Petit-déjeuner inclus, Demi-pension…) |
accommodationTypes[].prices{} | Options tarifaires : standard et non remboursable |
Les clés de l’objet prices sont de la forme "<persons>-<1|0>". Le suffixe 1 désigne le tarif standard (remboursable), 0 le tarif non remboursable ; l’option non remboursable porte nonRefundable: "[NR]". En tarification par chambre (priceType: 1), la clé est 1-1 / 1-0 quelle que soit l’occupation.
{
"2-1": {
"total": 2,
"title": 2,
"nonRefundable": "",
"price": "1930.00",
"currency": "TRY",
"id": "2/2",
"prices": [
{
"price": "965.00",
"tarih": "18.08.2026"
},
{
"price": "965.00",
"tarih": "19.08.2026"
}
]
},
"2-0": {
"total": 2,
"title": 2,
"nonRefundable": "[NR]",
"price": "1737.00",
"currency": "TRY",
"id": "2-0/2",
"prices": [
{
"price": "868.50",
"tarih": "18.08.2026"
},
{
"price": "868.50",
"tarih": "19.08.2026"
}
]
}
}3. Coupons et forfaits#
Si le client saisit un coupon, validez-le et appliquez la réduction de votre côté :
curl "https://test.hms.gen.tr/external/online/coupon/search" \
-H "Authorization: Bearer $HMS_TOKEN" \
-d "hotelID=1000" -d "coupon=SUMMER2026"{
"success": true,
"cupon": {
"id": 12,
"change": 0,
"rate": "10.00"
}
}Si change vaut 0, rate est une réduction en pourcentage (10 %) ; s’il vaut 1, il s’agit d’un montant fixe (10.00 dans la devise de l’hôtel). Appliquez la réduction au montant de la chambre et envoyez les totaux remisés dans la réservation.
Pour vendre des extras, affichez la liste des forfaits. Les forfaits choisis sont ajoutés à la réservation dans extras[], avec l’id du forfait dans stockID. Les totaux après coupons et forfaits sont inscrits dans le Total de la réservation.
4. Étape de paiement#
Listez les types de paiement acceptés par l’hôtel et poursuivez selon le choix du client. Pour le type 10 (paiement en ligne), une session de paiement est ouverte et le client est redirigé vers le prestataire ; après le paiement, il revient sur votre returnUrl. Tous les types sont décrits dans le guide Flux de paiement.
5. Transmettre la réservation#
Une fois le résultat du paiement connu, enregistrez la réservation dans HMS. ID est le code unique que vous générez ; communiquez ce même code au client. Les identifiants de type de chambre et de type de pension proviennent de la liste des chambres.
curl -X POST "https://test.hms.gen.tr/external/online/channel/booking" \
-H "Authorization: Bearer $HMS_TOKEN" \
-H "Content-Type: application/json" \
-d @booking.jsonconst booking = {
hotelID: "1000",
ID: orderNo, // votre code de réservation unique
type: "Book",
createDateTime: new Date().toISOString(),
checkinDate: "2026-08-18",
checkoutDate: "2026-08-20",
RoomStays: [{
roomTypeID: "2", roomName: "Standard Room",
ratePlanID: "2", ratePlanName: "Bed & Breakfast",
type: "Book", NumberOfUnits: "1",
checkinDate: "2026-08-18", checkoutDate: "2026-08-20",
GuestCount: { adult: 2, child: 1 },
PerDayRates: { currency: "TRY", PerDayRate: [
{ stayDate: "2026-08-18", baseRate: "965.00", hotelServiceFees: "0" },
{ stayDate: "2026-08-19", baseRate: "965.00", hotelServiceFees: "0" }
]},
Total: { amountAfterTaxes: "1930.00", amountOfTaxes: "175.45", currency: "TRY" }
}],
PrimaryGuests: [{ name: "Ayşe", surname: "Demir", PhoneNumber: "+905551112233", email: "[email protected]", CountryCode: "TR" }],
ChildGuests: [{ age: 7 }],
SpecialRequest: [{ text: "Late check-in, around 23:00." }],
extras: [],
Total: { amountAfterTaxes: "1930.00", amountOfTaxes: "175.45", extraTotal: "0.00", currency: "TRY" }
};
const res = await fetch("https://test.hms.gen.tr/external/online/channel/booking", {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.HMS_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({ BookingPushRQ: { Bookings: [booking] } })
});
const { BookingPushRS } = await res.json();
if (BookingPushRS.Error) throw new Error(BookingPushRS.Error);
const hmsId = BookingPushRS.BookingConfirmNumbers[0].HMS_ID;$booking = [
'hotelID' => '1000',
'ID' => $orderNo, // votre code de réservation unique
'type' => 'Book',
'createDateTime' => date('c'),
'checkinDate' => '2026-08-18',
'checkoutDate' => '2026-08-20',
'RoomStays' => [[
'roomTypeID' => '2', 'roomName' => 'Standard Room',
'ratePlanID' => '2', 'ratePlanName' => 'Bed & Breakfast',
'type' => 'Book', 'NumberOfUnits' => '1',
'checkinDate' => '2026-08-18', 'checkoutDate' => '2026-08-20',
'GuestCount' => ['adult' => 2, 'child' => 1],
'PerDayRates' => ['currency' => 'TRY', 'PerDayRate' => [
['stayDate' => '2026-08-18', 'baseRate' => '965.00', 'hotelServiceFees' => '0'],
['stayDate' => '2026-08-19', 'baseRate' => '965.00', 'hotelServiceFees' => '0'],
]],
'Total' => ['amountAfterTaxes' => '1930.00', 'amountOfTaxes' => '175.45', 'currency' => 'TRY'],
]],
'PrimaryGuests' => [['name' => 'Ayşe', 'surname' => 'Demir', 'PhoneNumber' => '+905551112233', 'email' => '[email protected]', 'CountryCode' => 'TR']],
'ChildGuests' => [['age' => 7]],
'SpecialRequest' => [['text' => 'Late check-in, around 23:00.']],
'extras' => [],
'Total' => ['amountAfterTaxes' => '1930.00', 'amountOfTaxes' => '175.45', 'extraTotal' => '0.00', 'currency' => 'TRY'],
];
$ch = curl_init('https://test.hms.gen.tr/external/online/channel/booking');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('HMS_TOKEN'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['BookingPushRQ' => ['Bookings' => [$booking]]]),
]);
$rs = json_decode(curl_exec($ch), true)['BookingPushRS'];
if (isset($rs['Error'])) {
throw new RuntimeException($rs['Error']);
}
$hmsId = $rs['BookingConfirmNumbers'][0]['HMS_ID'];{
"BookingPushRS": {
"Success": true,
"BookingConfirmNumbers": [
{
"confirmTime": 1755500000,
"bookingID": 48213,
"bookingType": "Book",
"HMS_ID": 48213
}
]
}
}HMS_ID est l’identifiant de la réservation dans HMS ; conservez-le avec votre propre enregistrement. La réservation apparaît dans le panneau sous le canal « Online », et HMS envoie au client un e-mail de confirmation selon les paramètres de l’hôtel.
Plusieurs chambres#
Lorsque plusieurs chambres du même type de chambre et du même type de pension sont vendues, chaque chambre forme un élément RoomStays distinct ; NumberOfUnits vaut "1" pour la première, "2" pour la deuxième, et ainsi de suite. Des types de chambre différents font eux aussi l’objet d’éléments distincts. Le Total de la réservation est la somme de toutes les chambres et de tous les extras.
Modifications et annulations#
Renvoyez la réservation au même endpoint avec le même ID :
type: "Modify"— les dates, les chambres ou les informations du client ont changé. Envoyez la réservation complète dans son état actuel ; HMS remplace l’enregistrement existant par celle-ci.type: "Cancel"— la réservation a été annulée. Les chambres portent elles aussitype: "Cancel".
Erreurs fréquentes#
- Mettre la liste des chambres en cache trop longtemps. Les disponibilités et les tarifs changent en permanence ; actualisez la liste avant que le client n’accède à l’étape de paiement.
- Envoyer un
childCountdifférent de la longueur dechildAges[]: le serveur se fie à la liste des âges et modifie le nombre d’enfants sans avertissement. - Envoyer vos propres identifiants comme
roomTypeID/ratePlanIDau lieu de ceux de la liste des chambres : Could not register. est renvoyé. - Envoyer
PaymentCardpour d’autres types de paiement que le 9 : les données de carte sont transmises à HMS inutilement. - Relancer après une erreur réseau avec un
IDdifférent : cela crée une réservation en double. Relancez avec le mêmeID.