Skip to main content

Personal QR

Implement customer identification using personal QR codes from the Vipps or MobilePay app for quick and secure user verification at physical points of sale.

tip

For a visual walkthrough of the customer's experience with personal QR:

Overviewโ€‹

If you have a QR code scanner, you can identify customers by scanning their personal QR code from the Vipps or MobilePay app. This enables quick, contactless in-store payments without manually entering phone numbers.

Vipps scan

Scanner typesโ€‹

Personal QR codes can be scanned in two ways:

Customer-facing scanner - A permanent scanner positioned for customer self-service. Customers scan their personal QR code at any time during checkout.

Cashier scanner - The cashier scans the customer's QR code using a wired scanner, either while scanning items or immediately before payment.

Getting the customer's phone numberโ€‹

Use the Personal QR exchange endpoint to convert the scanned QR code into the customer's phone number.

Important

For MobilePay, the personal QR code is tokenized, so you must use the exchange endpoint to get the phone number.

For Vipps, the personal QR code currently contains the phone number in clear-text format (e.g., https://qr.vipps.no/28/2/01/031/4712345678?v=1). However, we strongly recommend using the exchange endpoint for Vipps as well, as this will become required in the future when Vipps also moves to tokenized QR codes. Using the exchange endpoint now ensures your integration will continue to work without changes.

Requestโ€‹

POST:/v1/exchange

curl -X POST https://apitest.vipps.no/qr/v1/exchange \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR-ACCESS-TOKEN" \
-H "Ocp-Apim-Subscription-Key: YOUR-SUBSCRIPTION-KEY" \
-H "Merchant-Serial-Number: YOUR-MSN" \
-d '{
"qrCode": "https://qr.vipps.no/p/qwjhewqhueheuqwhuqwhe"
}'

Responseโ€‹

The response format differs depending on whether you're using Vipps or MobilePay:

For MobilePay (always tokenized, version 2.0):

{
"msisdn": "4712345678",
"timestamp": 1634025600,
"version": "2.0"
}

For Vipps (currently clear-text, version 1.0, but transitioning to version 2.0):

{
"msisdn": "4712345678",
"version": "1.0"
}

Response fields:

  • msisdn - The customer's phone number, which you can use to initiate the payment
  • timestamp - UTC timestamp (in seconds) indicating when the QR code was generated (only available in version 2.0)
  • version - The QR code version:
    • 2.0 - Tokenized format (all MobilePay, future Vipps)
    • 1.0 - Clear-text format (current Vipps, deprecated)

Creating the paymentโ€‹

After obtaining the phone number, create a payment using POST:/epayment/v1/payments with these settings:

  • Set userFlow to PUSH_MESSAGE to send the payment request directly to the customer's app
  • Set customerInteraction to CUSTOMER_PRESENT (required for regulatory compliance)
  • Include the customer's personalQr in the request
  • Optionally add receipt.orderLines to display purchase details in the app

Example requestโ€‹

curl -X POST https://apitest.vipps.no/epayment/v1/payments \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR-ACCESS-TOKEN" \
-H "Ocp-Apim-Subscription-Key: YOUR-SUBSCRIPTION-KEY" \
-H "Merchant-Serial-Number: YOUR-MSN" \
-H 'Idempotency-Key: YOUR-IDEMPOTENCY-KEY' \
-H "Vipps-System-Name: acme" \
-H "Vipps-System-Version: 3.1.2" \
-H "Vipps-System-Plugin-Name: acme-webshop" \
-H "Vipps-System-Plugin-Version: 4.5.6" \
-d '{
"amount": {
"value": 49800,
"currency": "NOK"
},
"paymentMethod": {
"type": "WALLET"
},
"customer": {
"personalQr": "https://qr.vipps.no/p/qwjhewqhueheuqwhuqwhe"
},
"receipt":{
"orderLines": [
{
"name": "Orange hoodie",
"id": "hoodie1234",
"totalAmount": 29900,
"totalAmountExcludingTax": 23920,
"totalTaxAmount": 5980,
"taxRate": 2500
},
{
"name": "White T-shirt",
"id": "tshirt1234",
"totalAmount": 19900,
"totalAmountExcludingTax": 15920,
"totalTaxAmount": 3980,
"taxRate": 2500
},
],
"bottomLine": {
"currency": "NOK",
"posId": "Butikken-23412",
"receiptNumber": "0527013501"
},
},
"reference": 2486791679658155992,
"userFlow": "PUSH_MESSAGE",
"returnUrl": "http://example.com/redirect?reference=2486791679658155992",
"paymentDescription": "Payment to Butikken",
"customerInteraction": "CUSTOMER_PRESENT"
}'

Troubleshootingโ€‹

Error: "The parameter PersonalQr is invalid"โ€‹

This error occurs when the QR code value cannot be recognized. The personalQr parameter only accepts QR codes from the Vipps or MobilePay app's personal QR section.

Common causes:

  • The entire QR code content was not captured or transmitted
  • A different type of QR code (merchant QR, promotional QR, etc.) was scanned instead
  • The scanner captured a QR code from something other than the customer's app

Solutions:

  • Verify the complete QR code content is being sent in the request
  • Ensure the customer is showing their personal QR code from within the Vipps or MobilePay app
  • Check that the scanner is reading the correct QR code and not others nearby

See alsoโ€‹