Flusso di pagamento
L’hotel decide nel pannello quali tipi di pagamento accetta per le prenotazioni online. Il motore di prenotazione mostra questo elenco e segue un percorso diverso per ciascun tipo. Questa guida descrive i quattro tipi di pagamento e cosa fare per ciascuno.
Elenca i tipi di pagamento#
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 | Tipo | Cosa succede |
|---|---|---|
1 | Pagamento in hotel | Nessun incasso; la prenotazione viene inviata direttamente. |
3 | Bonifico bancario | Vengono mostrati i conti bancari dell’hotel; la prenotazione viene inviata come “in attesa di pagamento”. |
9 | Carta di credito (garanzia) | I dati della carta vengono inviati a HMS con la prenotazione in PaymentCard; l’hotel addebita l’importo sulla carta. |
10 | Pagamento online (POS virtuale) | HMS avvia una sessione di pagamento; l’ospite viene reindirizzato alla pagina di pagamento del provider e poi torna al tuo returnUrl. |
Tipo 1 · Pagamento in hotel#
Nessun passaggio aggiuntivo. Puoi chiamare l’endpoint per ricevere una conferma:
{
"success": true,
"message": "payment_at_the_hotel"
}Tipo 3 · Bonifico bancario#
Recupera i conti bancari che l’hotel ha abilitato per la vendita online e mostrali all’ospite:
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"
}
]
}Se non è configurato alcun conto, viene restituito bank_info_is_not_found: nascondi questo tipo dall’elenco.
Tipo 9 · Carta di credito#
L’endpoint si limita a indicare che occorre raccogliere i dati della carta:
{
"success": true,
"message": "credit_card_info_should_be_requested"
}Raccogli i dati della carta nel tuo form e inviali nel campo PaymentCard di ogni elemento RoomStays nell’invio della prenotazione:
{
"PaymentCard": {
"CardHolder": {
"fullname": "Ayşe Demir",
"address": "Kumsal Cad. No: 12",
"country": "Türkiye",
"city": "Antalya"
},
"cardNumber": "5571135571135575",
"expireDate": "0329",
"cardCode": "MasterCard",
"seriesCode": "000"
}
}Tipo 10 · Pagamento online#
Avvia una sessione di pagamento con i dati dell’ospite e del carrello. Tutti i campi sono obbligatori; un campo mancante viene segnalato con required_input_info_not_submitted ed 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 è un frammento HTML che passa il controllo al provider: inseriscilo così com’è nella tua pagina di pagamento
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>"
}Il code restituito è un frammento HTML: a seconda del provider del POS virtuale dell’hotel, si tratta di un form 3D Secure con invio automatico, di uno script di reindirizzamento window.location o di un form di checkout incorporato (ad es. iyzico). Inserisci il frammento così com’è nella tua pagina di pagamento, senza tentare di analizzarlo. L’ospite completa il pagamento presso il provider e torna al tuo returnUrl; l’esito viene segnalato dai parametri di query aggiunti all’URL (sonuc=1 successo, sonuc=0 errore). Il tuo numero d’ordine (orderID) viene salvato con il record del pagamento: al ritorno associalo al tuo record e invia la prenotazione solo se il pagamento è andato a buon fine.
| Campo | Nota |
|---|---|
totalPrice | Deve essere uguale al totale del carrello; è l’importo inviato al provider. |
orderID | Deve essere univoco. Usare l’ID della prenotazione semplifica la riconciliazione. |
countryID | id dall’elenco dei paesi. |
baskets[] | Una riga per ogni camera o extra. id è l’ID della tipologia di camera o del pacchetto, piece la quantità, price il prezzo unitario. |
Usare direttamente i dati del POS virtuale#
Se vuoi collegarti al provider dal tuo server invece di usare la pagina di pagamento di HMS, l’endpoint Dati del POS virtuale restituisce l’ID esercente, le chiavi e il codice del provider. Sono dati riservati: usali solo lato server e concorda prima questo approccio con HMS.
Dopo il pagamento#
- Per il tipo 10, invia la prenotazione dopo la conferma del pagamento; non inviarla se il pagamento non è riuscito.
- Per il tipo 3, invia subito la prenotazione; l’hotel registra il bonifico nel pannello quando arriva.
- Nell’invio della prenotazione,
Total.amountAfterTaxesdeve essere uguale all’importo incassato o da incassare.