Multi-Vending with Pre-Authorization
This guide explains the Multi-Vending with Pre-Authorization flow. This method allows a customer to purchase multiple products in one session after a single initial payment approval. This streamlines the transaction by consolidating authorization into one initial step.
Payment Flow
The diagram below illustrates the complete sequence of events for a Multi-Vending with Pre-Authorization transaction.
Below is a breakdown of the diagram:
- The consumer presents the card to the Nayax Device.
- The Nayax Device sends an authorization request to the Nayax Server.
- The Nayax Server forwards the authorization request to the Billing Provider.
- The Billing Provider sends an authorization response (approved) to the Nayax Server.
- Nayax Server sends the authorization response (approved) back to the Nayax Device.
- The peripheral's SDK begins the session and triggers the "session begin" event:
vmc_vend_event_handler_cb(vm_vend_event_on_session_begin)vend_callbacks(onBeginSession(funds_avail))vmc_vend_events() (via onBeginSession(funds_avail)) - Message to the consumer: "Please Select a Product."
- The consumer selects the desired product/s from the vending machine. Said products are being added to a list called "session":
session_products[0].code = 1; session_products[0] .qty = 1; session_products[0].price = 10; session_products[0].unit = 1; session_products[1].code = 2; session_products[1].qty = 1; session_products[1].price = 20; session_products[1].unit = 1; if (config.multi_vend_support) { session->products = session_products; session->total_products = 2; }List<vmc_vend_t.vend_item_t> list = new List<vmc_vend_t.vend_item_t>(); list.Add(new vmc_vend_t.vend_item_t((ushort)1, (ushort)10, (ushort)1, (byte)1)); list.Add(new vmc_vend_t.vend_item_t((ushort)2, (ushort)20, (ushort)2, (byte)1)); list.Add(new vmc_vend_t.vend_item_t((ushort)3, (ushort)30, (ushort)3, (byte)1)); // prepare single session object session = new vmc_vend_t.vend_session_t(list);ArrayList<vmc_vend_t.vend_item_t> list = new ArrayList<vmc_vend_t.vend_item_t>(); list.add(new vmc_vend_t.vend_item_t((short) 0, (short) 100, (short) 1, (byte) 1)); list.add(new vmc_vend_t.vend_item_t((short) 1, (short) 100, (short) 1, (byte) 1)); list.add(new vmc_vend_t.vend_item_t((short) 2, (short) 200, (short) 2, (byte) 1)); list.add(new vmc_vend_t.vend_item_t((short) 3, (short) 100, (short) 1, (byte) 1)); list.add(new vmc_vend_t.vend_item_t((short) 4, (short) 200, (short) 2, (byte) 1)); // in this sample we can have up to 2 sessions (in case of multi-session) m_sessions = new vmc_vend_t.vend_session_t[1]; // prepare single session object m_sessions[0] = new vmc_vend_t.vend_session_t(3, list); - The peripheral's SDK sends a "vend request" to the Nayax Device:
vmc_vend_vend_request(vend_session_t *session)vmc_instance.vend.vend_request(session);m_vmc.vend.vend_request(m_sessions[m_active_session]); - The peripheral's SDK handles transaction data received from the Nayax Device via Transfer Data (said data includes information about the Nayax transaction ID and the consumer's card details):
vmc_vend_event_handler_cb(vm_vend_event_on_transaction_info)vend_callbacks(onTransactionInfo(data))vmc_vend_events() (via onTransactionInfo(data)) - The peripheral's SDK triggers the "vend approved" event:
vmc_vend_event_handler_cb(vm_vend_event_on_vend_approved)vend_callbacks() (via onVendApproved(session))vmc_vend_events() (via onVendApproved(session)) - The peripheral dispenses the product/ provides the service to the consumer
- The SDK reports "vend success":
vmc_vend_vend_status(&session, __true)vmc_vend_events() (via onVendApproved(session) -which would return "true")vmc_vend_events() (via onVendApproved(session) -which would return "true")
Note: in case of partial dispensing (meaning not all of the selected items were actually vended) you can create a new list with only the items which were actually vended prior to responding with "true":

Example of partial vending where only two items were vended.
And completes the vending session:
vmc_vend_vend_session_complete_lowlevel()no such function in C# or Java due to the nature of the languagesno such function in C# or Java due to the nature of the languages- Message to the consumer: "Please Take Product."
- Nayax Device sends a settlement request to the Nayax Server.
- Nayax Server forwards the settlement request to the Billing Provider.
- The billing Provider sends a settlement response (OK) to the Nayax Server.
- Nayax Server sends the settlement response (OK) back to the Nayax Device.
- The vending session ends.
- Message to Card Holder: "Thank you & Goodbye."
See Also
Updated 21 days ago