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.
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')