{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-qr/qr.sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Message Flows","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"message-flows"},"children":["Message Flows"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sections below describe successful transaction and error scenarios."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview"},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The QR payment process has the following steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Request and display a QR code (initiation)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Send a payment authorisation request using this QR code (authorisation)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Finalise or reverse the payment (confirmation or reversal)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"scan-notifications"},"children":["Scan Notifications"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"successful-qr-code-request"},"children":["Successful QR Code Request"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Initiate the request to generate a QR code using the getQRCode operation."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The QR server responds by returning a QR code containing a unique transaction ID tranId."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Display the QR code to the customer, enabling them to start the payment journey by scanning it with their mobile device."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/qr-initiation-flow-r.218d6930878b670157460f1c6cfa183d10e95380fbdc8d050b138748143c8ea5.87aef9fa.png","alt":""},"children":[]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once the customer scans the QR request, the authorisation and confirmation phase takes place."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"authorisation-and-confirmation"},"children":["Authorisation and Confirmation"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"request-payment"},"children":["Request Payment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After a successful initiation, the system uses a dual message flow consisting of two messages:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A payment authorisation request ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]}," asks the payment provider to reserve funds for the transaction. This request includes the unique ID encoded in the QR code, which will match the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]}," to the QR scan."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The system sends one of the following two advice messages ‘offline,’ via store-and-forward queue:"]}]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ConfirmationAdvice"]}," informs the payment provider that the  was successful, and the funds should be withdrawn."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A reversal ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentReversal"]}," indicates that the tender was not completed, and the reserved funds should be released."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/request-payment-flow-r.8d22de884cf400f578704aa06b89b52cf7efd95163f127b5982504ad59dc040d.87aef9fa.png","alt":""},"children":[]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Always send the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]},"upstream before displaying the QR code to the customer for scanning. This prevents the customer from scanning the QR code before the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequestis"]}," sent. If the customer scans the QR code first, it becomes impossible to match the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]}," to the QR scan, resulting in a failure of the tender."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"error-scenarios"},"children":["Error Scenarios"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"early-notification-from-payment-provider"},"children":["Early Notification from Payment Provider"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Below is a flow illustrating a scenario where a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]}," arrives after the QR code has been scanned:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/early-paymentrequest-flow-r.659ea9c951897a96577a9f330d6c8586ef31cbd63caea8c4d8e81cf91119a28f.87aef9fa.png","alt":""},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"tender-voids-and-timeout-reversals"},"children":["Tender Voids and Timeout Reversals"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A payment authorisation (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]},"), can be reversed or revoked through a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentReversal"]},". You will initiate a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentReversal"]}," in one of the following scenarios:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you need to cancel a successfully processed payment authorisation. This may occur if the customer decides not to proceed with the transaction, if the POS malfunctions, or if the cashier cancels the basket."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you do not receive a response for a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentRequest"]}," and the status of the transaction remains uncertain. In this case, you should send a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentReversal"]}," as a ‘timeout reversal’ to ensure it is safe to assume the transaction did not go through. Remember, the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentReversal"]}," will be subject to the store-and-forward (SAF), queue, which guarantees that this transaction will eventually be reversed."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/tender-voids-timeout-rev-r.f822d6e7deece00ff06642fd7abd9f8c56be10731d06e9bcb4439dfb70ee7c3a.87aef9fa.png","alt":""},"children":[]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Important"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use reversals only to address system issues or revoked transactions, not as a general refund mechanism. Customer refunds and returns of goods are outside the scope of this document."]}]}]},"headings":[{"value":"Message Flows","id":"message-flows","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Scan Notifications","id":"scan-notifications","depth":2},{"value":"Successful QR Code Request","id":"successful-qr-code-request","depth":3},{"value":"Authorisation and Confirmation","id":"authorisation-and-confirmation","depth":2},{"value":"Request Payment","id":"request-payment","depth":3},{"value":"Error Scenarios","id":"error-scenarios","depth":2},{"value":"Early Notification from Payment Provider","id":"early-notification-from-payment-provider","depth":3},{"value":"Tender Voids and Timeout Reversals","id":"tender-voids-and-timeout-reversals","depth":2}],"frontmatter":{"seo":{"title":"Message Flows"}},"lastModified":"2025-04-04T07:37:09.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/qr/public/implement-retailer-message-flows","userData":{"isAuthenticated":false,"teams":["anonymous"]}}