Fluxo de pagamento
O hotel define no painel quais tipos de pagamento aceita em reservas online. O motor de reservas exibe essa lista e segue um caminho diferente para cada tipo. Este guia apresenta os quatro tipos de pagamento e o que fazer em cada um.
Liste os tipos de 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 | O que acontece |
|---|---|---|
1 | Pagamento no hotel | Nenhuma cobrança; a reserva é enviada diretamente. |
3 | Transferência bancária | As contas bancárias do hotel são exibidas; a reserva é enviada como “aguardando pagamento”. |
9 | Cartão de crédito (garantia) | Os dados do cartão são enviados ao HMS com a reserva, em PaymentCard; o hotel faz a cobrança no cartão. |
10 | Pagamento online (POS virtual) | O HMS inicia uma sessão de pagamento; o hóspede é levado à página de pagamento do provedor e volta para a sua returnUrl. |
Tipo 1 · Pagamento no hotel#
Não há etapa extra. Você pode chamar o endpoint para obter uma confirmação:
{
"success": true,
"message": "payment_at_the_hotel"
}Tipo 3 · Transferência bancária#
Busque as contas bancárias que o hotel habilitou para vendas online e exiba-as ao hóspede:
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 não houver conta configurada, é retornado bank_info_is_not_found; nesse caso, oculte esse tipo da lista.
Tipo 9 · Cartão de crédito#
O endpoint apenas informa que os dados do cartão precisam ser coletados:
{
"success": true,
"message": "credit_card_info_should_be_requested"
}Colete os dados do cartão no seu próprio formulário e envie-os no campo PaymentCard de cada item RoomStays no envio da reserva:
{
"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#
Inicie uma sessão de pagamento com os dados do hóspede e do carrinho. Todos os campos são obrigatórios; um campo ausente é informado com required_input_info_not_submitted e 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 é um fragmento HTML que leva ao provedor: renderize-o sem alterações na sua página de 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>"
}O code retornado é um fragmento HTML: dependendo do provedor de POS virtual do hotel, é um formulário 3D Secure com envio automático, um script de redirecionamento window.location ou um formulário de checkout incorporado (ex.: iyzico). Renderize o fragmento sem alterações na sua página de pagamento; não tente interpretá-lo. O hóspede conclui o pagamento no provedor e volta para a sua returnUrl; o resultado é indicado por parâmetros de query acrescentados a ela (sonuc=1 sucesso, sonuc=0 falha). Seu número de pedido (orderID) é gravado junto com o registro do pagamento; no retorno, associe-o ao seu próprio registro e envie a reserva somente se o pagamento tiver sido aprovado.
| Campo | Observação |
|---|---|
totalPrice | Deve ser igual ao total do carrinho; é esse valor que vai para o provedor. |
orderID | Deve ser único. Usar o ID da reserva facilita a conciliação. |
countryID | id da lista de países. |
baskets[] | Uma linha por quarto ou extra. id é o ID do tipo de quarto / pacote, piece a quantidade e price o preço unitário. |
Usar os dados do POS virtual diretamente#
Se você quiser se conectar ao provedor a partir do seu próprio servidor, em vez de usar a página de pagamento do HMS, o endpoint Dados do POS virtual retorna o ID do estabelecimento, as chaves e o código do provedor. São dados sigilosos: use-os somente no servidor e combine essa abordagem com a HMS antes.
Depois do pagamento#
- No tipo 10, envie a reserva depois que o pagamento for confirmado; não envie se o pagamento falhar.
- No tipo 3, envie a reserva imediatamente; o hotel registra a transferência no painel quando ela chegar.
- No envio da reserva,
Total.amountAfterTaxesdeve ser igual ao valor cobrado ou a cobrar.