Generera Swish QR-koder via API

Med Swish QR-koder går det att göra en Swishbetalning genom att scanna en QR-kod med Swish-appen. QR-koden innehåller uppgifter om belopp, mottagarnummer och meddelande.

Det går att generera QR-koder manuellt med hjälp av den praktiska QR-generatorn på Swish hemsida.

Automatiserad generering

Hur gör man om man vill generera en ny QR-kod för varje betalning, exempelvis för en webbutik på nätet?

Om användarna av en webbtjänst ska kunna betala via Swish QR-koder så behöver genereringen av QR-koder automatiseras. En ny QR-kod behöver skapas för varje betalning. Detta går att få till med Swish QR-generator API. Webbtjänsten skickar då ett anrop till Swish APIt innehållandes betalningsuppgifterna. Som svar på anropet får webbtjänsten en QR-kod som sedan kan visas för användaren som är i färd med att betala.

Hur ser ett API-anrop ut?

I API-dokumentationen (under General QR codes > View Guide) framgår URLen för API-resursen:

 https://mpc.getswish.net/qrg-swish/api/v1/prefilled

API-resursen förväntar sig POST-anrop med MIME type application/json.

Exempel med cURL

Nedan skickar vi ett anrop till APIt med cURL:

curl --request POST --header "Content-Type: application/json" --data '{"format":"png","size":300,"message":{"value":"test message","editable":true},"amount":{"value":100,"editable":false}}' --output qrcode.png https://mpc.getswish.net/qrg-swish/api/v1/prefilled

cURL-kommandot sparar responsen till fil (qrcode.png). Filen innehåller en QR-kod. Om man scannar QR-koden med Swish appen så får man ett förifyllt betalmeddelandet (”test message”) samt belopp (100 kr). QR-koden innehåller inte en betalningsmottagare. editable styr huruvida användaren ska kunna editera innehållet i respektive fält.

QR-koden i exemplet.
När QR-koden scannats.

För att ha mottagaren ifylld så behöver man även inkludera följande i datat:

"payee":{"value":"123456789","editable":true}

Där ”123456789” är mottagarens nummer. curl-anropet från exemplet ser då se ut så här:

curl --request POST --header "Content-Type: application/json" --data '{"format":"png","size":300,"message":{"value":"test message","editable":true},"amount":{"value":100,"editable":false},"payee":{"value":"123456789","editable":true}}' --output qrcode.png https://mpc.getswish.net/qrg-swish/api/v1/prefilled

Om mottagarnumret är felaktigt så genereras QR-koden, men den går inte att scanna med Swish-appen.

Implementerat i Python

Motsvarande anrop kan skickas i Python. Nedanstående kodsnutt använder requests-biblioteket för att spara QR-koden som png-fil (Python 3.6+):

import requests

response = requests.post('https://mpc.getswish.net/qrg-swish/api/v1/prefilled', json={
    'payee': {
        'value': '123456789',
        'editable': True,
    },
    'amount': {
        'value': '100',
        'editable': False,
    },
    'message': {
        'value': 'test message',
        'editable': True,
    },
    'format': 'png',
    'size': 300,
})
with open('qrcode.png', 'wb') as file_object:
    file_object.write(response.content)

Koden kan refaktoreras till en funktion med några extra parametrar samt validering:

import requests


def save_qr_code_to_file(
    payee: str,
    amount: str,
    message: str,
    filepath: str = 'qrcode.png',
    file_format: str = 'png',
    width_in_pixels: int = 300,
    editable_message: bool = True,
    editable_amount: bool = True,
    editable_payee: bool = True,
):
    assert file_format in ('jpg', 'png', 'svr'), \
        f'Supported file formats: jpg, png, svr (not {file_format})'
    assert width_in_pixels >= 300, 'Minimum size is 300 pixels'
    assert any([payee, amount, message]), \
        'At least one of payee, amount and message must be provided'
    data_dict = {
        'format': file_format,
        'size': width_in_pixels,
    }
    if payee:
        data_dict['payee'] = {
            'value': payee,
            'editable': editable_payee,
        }
    if amount:
        data_dict['amount'] = {
            'value': amount,
            'editable': editable_amount,
        }
    if message:
        data_dict['message'] = {
            'value': message,
            'editable': editable_message,
        }

    url_to_swish_qr_api = 'https://mpc.getswish.net/qrg-swish/api/v1/prefilled'
    response = requests.post(url_to_swish_qr_api, json=data_dict)
    assert response.status_code == 200, f'Unexpected status code: {response.status_code}'
    with open(filepath, 'wb') as file_object:
        file_object.write(response.content)


# Exempel på funktionsanrop
save_qr_code_to_file(payee='123456789', amount='100', message='test message')