Multi-Vend with Pre-Selection

With the Multi-Vend flow, your machine can dispense multiple (up to 20, as for 4.0.25.9 and above- up to 40) products in a single transaction and have differentiation for each of said product in the SDK. Customers first select all of their desired products, then present their payment card. Upon authorization, the vending machine dispenses the selected products, and the session is settled and completed with an appropriate message.

Payment Flow

The diagram below illustrates the complete sequence of events for a Multi-Vend transaction.

Here's a breakdown of the diagram:

  1. The Nayax Device sends a message to the consumer: "Please Select a Product."

  2. 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);
  3. The peripheral's SDK sends a vending 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]);
  4. The Nayax Device sends a message to the consumer: "Please Present Card."

  5. The consumer presents their payment card.

  6. The Nayax Device sends an authorization request to the Nayax Server.

  7. The Nayax Server forwards the authorization request to the Billing Provider.

  8. The Billing Provider sends an authorization response (approved) to the Nayax Server.

  9. The Nayax Server sends the authorization response (approved) back to the Nayax Device.

  10. 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))
  11. The SDK triggers "Vend Approved" events:

    vmc_vend_event_handler_cb(vm_vend_event_on_vend_approved)
    vend_callbacks()
    (via onVendApproved(session))
    vmc_vend_events()
    (via onVendApproved(session))
  12. The peripheral dispenses the product/s to the consumer.

  13. 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- in this example only 2 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 languages
    no such function in C# or Java due to the nature of the languages

  14. Message to the consumer: "Please Take Product."

  15. The Nayax Device sends a settlement request to the Nayax Server.

  16. The Nayax Server forwards the settlement request to the Billing Provider.

  17. The Billing Provider sends a settlement response (OK) to the Nayax Server.

  18. The Nayax Server returns the settlement response (OK) to the Nayax Device.

  19. The vending session ends.

  20. Message to Card Holder: "Thank you & Goodbye."

See Also