System Integrated QR Code
Merchant Presented mode
The merchant displays the QR Code and the customer uses their mobile
device to scan the code.
Static QR codes are static pre-printed codes, normally on a sticker, that you attach to a point-of-sale location, vending machines, taxis etc. Static codes are a quick and cost effective solution to get started.
Dynamic QR codes is codes where amount and other data is embedded within the code. It requires a monitor or printer to display the dynamic code for the customer. Locations where you would want a dynamic QR code is restaurant (pay at table) where the code could be printed en the pro forma invoice. In that could you would include amount and table number, which will be returned via web hook.
To generate a dynamic QR code you add the parameter dynamic
to to the QR code data and add the fields you need.
Example
A restaurant that prints a receipt on table 7 and it is waiter 2 that shall receive the tip.
The QR data will be:
https://qr.hips.com/m/[YOUR_MERCHANT_ID]/[UNIQUE_ID]?dynamic={"table":"7","waiter":"2"}
All data that are passed in dynamic
will be reposted in the start_qr_session
web hook. See Pay Flow below.
If you want to use hips API to generate the dynamic QR code you could use the following API call where [UNIQUE_ID] is your QR code created via API or in the dashboard:
{
"dynamic": {"table":7,"waiter":2,"extra":"test"}
}
This will give you a response that looks like this:
{
"status": "online",
"code_token": 1,
"qr_start_webhook_url": "...",
"allow_tip": true,
"qr_data": "https://qr.hips.com/m/.../...",
"qr_code_b64_png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQAAAADjreInAAAFc0lEQV.....",
"mapped_to_sales_channel_id": "VRB6sFNiAWG5RUMBWTGFQtg8",
"order_timeout_seconds": 120,
"payment_timeout_seconds": 300,
"customer_text_preset_type": "general",
"asynchronous": false
}
To show your QR code for the payer in a web browser, you should embed the QR data in the tag like this:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQAAAADjreInAAAFc0lEQV.....">
If you want to save the PNG QR code in a file. You should Base64 decode the content in [qr_code_b64_png] before writing the data to a .png file.
Generate static QR codes
Static QR codes are pre-generated codes that you later attach to your account. The QR codes can be created and attached to merchants and sales channels via API.
Generate QR codes via API
Please see the QR API Create Payment QR Code
Self generated QR codes
You may also pre-generate and print codes on your own by following the instructions here.
https://qr.hips.com/m/[YOUR_MERCHANT_ID]/[UNIQUE_ID]?dynamic=
Field | Type | Description |
---|---|---|
YOUR_MERCHANT_ID | AN max 32b | Merchant ID |
UNIQUE_ID | AN max 32b | Unique ID for this specific sales location. This ID should be visible under the QR code for manual input if the device camera is broken. |
dynamic optional | AN max 4800b | Any dynamic data in json. Make sure the data is URL encoded. Example: ?dynamic={"table":"7","waiter":"2"} |
amount currency optional | AN max 100b | If this parameter is sent, you should not send Create Order . A web hook on payment will be sent to the IPN web hook configured on the QR code in dashboard instead. This is great if a POS cash system have limited possibilities to do live API calls or don't have an internet connection. Example: ?amount=100¤cy=EUR |
An example would be: https://qr.hips.com/m/ABC123/1
where ABC123
is the Merchant ID and 1
is the unique QR code for this merchant.
Connect a QR code to a sales location
Before any QR code can be used it must be connected to a sales location via our QR API. This is true for both API generated and self generated QR codes. Connect a Static QR Code
PayFlow
In this flow Hips waits for an order being submitted with the amount before the customer can make any payment. This solution is suitable for POS systems that have a full integration to Hips. In this mode tipping can be enabled and will be added to the pre-sent order amount.
-
Create a QR code
Use the following API endpoint Create Static QR Code -
Connect the QR code (now the code is scannable by a customer)
Use the following API endpoint Connect a Static QR Code -
Customer scans the QR code
Hips will post an start QR request to the URL specified when connecting a QR code in paramqr_start_webhook_url
. The content of this post will be a JSON object of the QR code.
The webhook will be sent and expect a http code of 200 or 201. If there is a different http code or a http timeout occurs (10 seconds), a new request will be sent (up to 3 requests). The idempotency key will be the same.
The webhook requesting to start the QR session sent to qr_start_webhook_url
will look like this:
{
"request_type": "start_qr_session",
"session_id": "ac7ed0cb-67f9-497b-bbb5-3339bcbea371",
"one_time_order_api_key": "eyJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7InNpZ25faW5fdHlwZSI6ImFwaSIsInNpZ25fc2NvcGUiOiJ0ZW1wX2FwaV9iZWFyZXJfa2V5X3NhbGVzX2NoYW5uZWwiLCJzaWduX2luX2lkIjoiUW00N0Y3Y3ptTkRhaldOeHNWMlppYzdmIn0sImV4cCI6MTYwMTM4NDc0Nn0.BPKHsBl54dZOSfAFO3nZXwaFmS6y0AsYMpueWDuhBR8",
"idempotency_key": "732ac2b0-232b-41a0-bc37-ca8a46870394",
"qr_id": "3snn8vUxMTZfHmnDwgPLSuR3",
"sales_channel_id": "Yo63AdPXo9k9XzWSJjfqrdCV",
"qr_code": "my-qr-serial-number",
"allow_tip": false,
"execute_at": "2019-10-19T18:34:49.898 01:00",
"order_timeout_seconds": 120,
"payment_timeout_seconds": 300,
"dynamic":{"table":"7","waiter":"2"},
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJkYXRhIjp7InJlcXVlc3RfdHlwZSI6InN0YXJ0X3FyX3Nlc3Npb24iLCJzZXNzaW9uX2lkIjoiYWM3ZWQwY2ItNjdmOS00OTdiLWJiYjUtMzMzOWJjYmVhMzcxIiwiaWRlbXBvdGVuY3lfa2V5IjoiNzMyYWMyYjAtMjMyYi00MWEwLWJjMzctY2E4YTQ2ODcwMzk0IiwicXJfaWQiOiIzc25uOHZVeE1UWmZIbW5Ed2dQTFN1UjMiLCJzYWxlc19jaGFubmVsX2lkIjoiWW82M0FkUFhvOWs5WHpXU0pqZnFyZENWIiwicXJfY29kZSI6Im15LXFyLXNlcmlhbC1udW1iZXIiLCJhbGxvd190aXAiOmZhbHNlLCJleGVjdXRlX2F0IjoiMjAxOS0xMC0xOSAxODozNDo0OSArMDEwMCIsIm9yZGVyX3RpbWVvdXRfc2Vjb25kcyI6MTIwLCJwYXltZW50X3RpbWVvdXRfc2Vjb25kcyI6MzAwfSwiaXNzIjoiaGlwcy5jb20ifQ.moaAIDJS_2PaKYsV2QQRtqMR5b5DwBfNuyFxFrFJ1vrN6CnSyDUDbxtYkvJ2fpXG8vREPBG0XiyzjO7ODRFMzRtfw4lgTY0ZBk0Wa9AoHrZD4zySG3rEWyD5vIgB7N5-qyr6lBO36e0V4rVb-Add6kD-431w1H7ppR17-Q3QjuwgzO9_GBt4vad65g1_850HoQMD-6vIhRAvERIuwNvE5nBx4VZLA_ytcfoEwfHWYLPsuNky5sfXtKM4MrlcLJReLs72Ua74geRWMMkBV4MuL-vSSxFD3e5hhJxYCEWj_BB_WqPf0r6s1ECB8mdkxaxqOffd8tqnZx1Fs3kfTNxSBw"
}
One Time Order API Key
You can use the API Key of the sales channel (if known) - or if you are an external system vendor, you would use the value in "one_time_order_api_key" as the Authorization Bearer token when creating the order. Example headers: Authorization: Bearer < one_time_order_api_key >
Vending machine down?
If your vending machine or other device are down and you want to tell the user something, please return HTTP code 412 on the "start_qr_session" event and the JSON string {"down_response_text":"Machine is down!"} to notify the user about this.
Key | Description |
---|---|
request_type | Type of request, can be start_qr_session ,canceled or `timed_out. Note that payment web hooks will be sent to the webhook specified when you Create Order |
idempotency_key | Read more about Idempotent Requests |
qr_id | The ID of the QR code when connected to a sales channel |
sales_channel_id | The ID of the sales channel the QR code is connected to |
qr_code | The unique code, can be generated by Hips or chosen by you when you connect a new code. |
allow_tip | Boolean indicates if the payer will be prompted for tip (max 20%) |
execute_at | Time and date when the request was executed |
session_id | The session ID, will be the same for this session if there is a canceled or timed_out request. The session id needs to be passed when you Create Order in the parameter qr_session_id . |
order_timeout_seconds | Time in seconds where the session times out if no Create Order has been sent to Hips. (Customer max wait time) |
payment_timeout_seconds | Time in seconds for how long you will wait for the customer to complete the payment after you have sent the Create Order API call. |
jwt | Webhook validation, read more here: Validating Webhooks |
dynamic | Any dynamo QR Data passed in when generating the QR code. |
Validate the webhook
If you wish to validate the authenticity of the webhook from Hips, please read here: Validating Webhooks
Vending machines expected behavior
At this point the vending machine should initiate the cashless payment protocol with the credit amount set to -1 (Unspecified amount). Once the customer has chosen a product and the amount is known, then continue to step 4. For vending machines the
fulfilled
parameter should be set tofalse
when creating an order.
Taxi expected behavior
When connecting a QR, make sure
allow_tip
is set totrue
should you want the user to be prompted about adding tip (Max 20% on top of the original amount). If you get a callback on theqr_start_webhook_url
, then you know that this specific taxi mapped to this QR code's customer want to pay by QR payment. When the ride is over, and the amount is known, the taxi system should go to step 4 and create an order. But only in the case whenqr_start_webhook_url
first has been triggered. For taxi thefulfilled
parameter should be set totrue
when creating an order.
-
Create an Order
Use the following API endpoint Create Order. Make sure you pass in thecode_token
retrieved when creating and connecting the QR code. Pass that token in theqr_code_token
parameter when you create an order. Don't forget to set thewebhook_url
when creating an order to get payment events. Theqr_start_webhook_url
will not be triggered anymore at this stage. -
Wait for web hook callback
Now you just have to wait for a callback to the URL specified when creating the order in parameterwebhook_url
Vending machines expected behavior
If there is a successful payment and the product was dispensed, you should call the Fulfill API Fulfill an order to make sure the amount is settled. If for some reason the product could not be dispensed, you should call the Refund API. Not doing anything will result in an automatic refund after 7 days.
Restaurant behavior
Restaurants should make sure the QR code setting in dashboard (or via API) is set to asynchron. We recommend restaurants to print a dynamic QR code on each pro-forma receipt with the data
amount
,table
,reference
,waiter
,currency
dynamically in the code. Then configure the QR payment code to do a IPN web hook to POS system or POS server when the payment is completed.If you instead want to send the amount via API, then make sure you have set the timeouts very high (at least 20 minutes) on the QR code (configurable via API or in dashboard).
System Integrator
Let Hips support know if you are a system integrator and want custom fields for each QR code to be entered when adding new QR codes in the merchant dashboard or via API, that is also sent back to you web hook. We currently support 4 custom fields.
Updated almost 4 years ago