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#

Terminale
curl "https://test.hms.gen.tr/external/online/payment/type?hotelID=1000" \
  -H "Authorization: Bearer $HMS_TOKEN"
Risposta · 200
{
    "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
        }
    ]
}
typeIDTipoCosa succede
1Pagamento in hotelNessun incasso; la prenotazione viene inviata direttamente.
3Bonifico bancarioVengono mostrati i conti bancari dell’hotel; la prenotazione viene inviata come “in attesa di pagamento”.
9Carta di credito (garanzia)I dati della carta vengono inviati a HMS con la prenotazione in PaymentCard; l’hotel addebita l’importo sulla carta.
10Pagamento 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:

POST …/payment/type/1 → 200
{
    "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:

Terminale
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}'
Risposta · 200
{
    "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:

POST …/payment/type/9 → 200
{
    "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:

RoomStays[].PaymentCard
{
    "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[].

Richiesta
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 }
    ]
  }'
Risposta · 200
{
    "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.

CampoNota
totalPriceDeve essere uguale al totale del carrello; è l’importo inviato al provider.
orderIDDeve essere univoco. Usare l’ID della prenotazione semplifica la riconciliazione.
countryIDid 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.amountAfterTaxes deve essere uguale all’importo incassato o da incassare.
Ultimo aggiornamento: 21 settembre 2026Hai trovato un errore? Segnalacelo