Integration
Bluecode
Credit Card
Direct Debit
eps
iDEAL
Klarna
Maestro
Pay by bank
Payment Page
PayPal
Tools
Error codes
Result codes
Test data
For testing Klarna, you do not need test data in the traditional sense. However, you do need an account with Klarna.
As a merchant, you must create an account with Klarna (and their test system – “Playground”) (see Klarna - Before you test). In the portal, you must then generate your Klarna API key via the corresponding section under “Settings”. The API username and password obtained there must be provided to GiroCheckout support, as this information is stored in our data center and is required for communication with Klarna.
All test transactions can be viewed in the Playground, where you can also generate test settlement files if needed.
During testing itself, you do not need any additional data.
Detailed information on the transaction types.
Klarna allows:
A reservation is to be used when the actual fulfillment of an order takes place at a later time, but the order amount for the presented card (for credit card transactions) or the given account information (for Paydirekt payments and others) needs to be authorized beforehand at the time of the order. Once the reservation period has expired, the reservation is either booked or voided.
Use sale when the business case is complete, e.g. a shopping cart was offered, ordered and delivered to the customer. The customer's payment method is debited with the amount of the sale.
A successful initialization generates a reference number and provides a redirect link to the merchant. The provided link leads to the payment form. The customer must be redirected to this URL, either via an HTTP redirect header, an HTML page with a corresponding meta tag, or JavaScript.
Provided by: GiroCheckout\ Called by: Merchant\
As seen in the workflow, there are various API calls during a Klarna transaction. The form the buyer fills out after being redirected to the processing center is provided and processed by Klarna and can change in content and flow depending on shop settings or buyer situation.
URL https://payment.girosolution.de/girocheckout/api/v2/transaction/start
Name | Required | Type | Description |
---|---|---|---|
merchantId | Yes | Integer | Merchant ID of a Klarna project |
projectId | Yes | Integer | Project ID of a Klarna project |
merchantTxId | Yes | String(255) | Unique transaction ID of the merchant. Allowed characters: any letters (including special language characters), 0-9, characters & = + , : ; . _ ! ? # /. This information is transmitted by GiroCheckout to Klarna via the field merchant_information.merchant_data_1. |
type | Optional | String(4) | Transaction type (see Transaction types) \ SALE = Sale is booked immediately (default) \ AUTH = Reservation of the amount |
amount | Yes | Integer | For decimal currencies, specify the amount in the smallest currency unit, e.g., cents, pennies |
currency | Yes | String(3) | Transaction currency, according to ISO 4217.\ EUR = Euro |
purpose | Yes | String(40) | Purpose of the transaction. Since Klarna does not recognize this field, GiroCheckout stores the information under basket.soft_descriptor if no information is provided from the shop. |
urlRedirect | Yes | String(2048) | URL to which the customer is redirected after payment. |
urlNotify | Yes | String(2048) | URL to which the payment result is reported. |
locale | Optional | String(4) | Language of the Klarna form \ de = German (default) \ en = English \ es = Spanish \ fr = French \ it = Italian \ ja = Japanese \ pt = Portuguese \ nl = Dutch \ cs = Czech \ sv = Swedish \ da = Danish \ pl = Polish |
billingAddress | Optional | JSON-String | Optional field that can contain the buyer's billing address. The individual fields can be found in the list below. |
shippingAddress | Optional | JSON-String | Optional field that can contain the buyer's shipping address. If this information is missing, the billing address will be used as the shipping address. The individual fields can be found in the list below. |
customerInfo | Optional | JSON-String | Optional field that can contain additional information about the buyer. The individual fields can be found in the list below. |
basket | Yes | JSON-String | Mandatory field that describes the shopping cart. The individual fields can be found in the list below. |
kassenzeichen | Optional | String(255) | Optional field for passing a cash register identifier. This will be displayed in the GiroCockpit in the transaction details (and soon also exported) and can be searched for there. All UTF-8 characters are allowed. |
hash | Yes | String(32) | HMAC MD5 hash over all values of the call. See generate hash. |
This object structure applies to both the billing address (billingAddress) and the shipping address (shippingAddress).
Name | Mandatory | Type | Description |
---|---|---|---|
first_name | Yes | String(50) | First name of the recipient. |
last_name | Yes | String(50) | Last name of the recipient. |
title | No | String(20) | Klarna understands “title” as the customer's salutation, e.g., Mr., Mrs., etc. |
Yes | String(254) | Email address of the recipient. | |
phone_contact | No | Sub-object | Phone number of the recipient (see below). |
company_name | No | String(100) | Company name, if the recipient is a company. |
address_line_1 | Yes | String(100) | Main street and house number of the billing address. |
address_line_2 | No | String(100) | Additional address line of the billing address (optional). |
address_line_3 | No | String(100) | Further additional address line of the billing address (optional). |
postal_code | Yes | String(10) | Postal code of the billing address. |
city | Yes | String(50) | City of the billing address. |
state | No | String(50) | State or region of the billing address. |
country | Yes | String(2) | Two-letter country code of the billing address (ISO 3166). |
phone_contact Object:
Name | Mandatory | Type | Description |
---|---|---|---|
phone_type | No | String(10) | Type of phone number: `HOME`, `WORK`, or `MOBILE`. |
phone_number | No | String(20) | Phone number of the recipient. |
Name | Mandatory | Type | Description |
---|---|---|---|
customer_id | No | String(50) | Unique customer ID. |
date_of_birth | No | String(10) | Customer's date of birth in the format `YYYY-MM-DD`. |
gender | No | String(10) | Customer's gender: `MALE`, `FEMALE`, `DIVERSE`. |
title | No | String(100) | Klarna understands “title” as the customer's salutation, e.g., Mr., Mrs., etc. |
personal_identifications | No | Sub-object | List of identification documents (see below). |
contacts | No | Sub-object | List of customer contact options (see below). |
contacts Object:
Here, an array with multiple elements can be specified in the phone_contacts object with the following fields:
Name | Mandatory | Type | Description |
---|---|---|---|
phone_type | No | String(10) | Type of phone number: `FAX`, `HOME`, `MOBILE`, `OTHER`, `PAGER`, `WORK`. |
phone_number | No | String(16) | Phone number in E.164 format (e.g., `+442071838750`). |
personal_identifications Object:
Here, an array with multiple elements can be specified with the following fields:
Name | Mandatory | Type | Description |
---|---|---|---|
type | No | String(20) | Type of identification: `PASSPORT`, `NATIONAL`, `CPF`, `CNPJ`, `CURP`, `SSN`, `DRIVERS_LICENSE`. |
id | No | String(26) | Customer's identification number. |
issued_by | No | String(50) | For `DRIVERS_LICENSE`: Issuing authority or region; for others: Country (ISO 3166-1 Alpha-2 Code). |
Name | Mandatory | Type | Description |
---|---|---|---|
basket_id | Yes | String(140) | Unique identifier of the shopping cart, e.g., “basket123456”. |
invoice_id | No | String(127) | External invoice number of the API caller. |
soft_descriptor | No | String | Dynamic text that appears on the buyer's bank statement, e.g., “800-123-1234”. This stores the “purpose” (intended use) if the field is not used otherwise. |
shipping_costs | No | Sub-object | Shipping costs of the shopping cart (see below). |
basket_discount | No | Sub-object | Discount on the entire shopping cart (see below). |
basket_type | Yes | String(10) | Type of shopping cart: `DIGITAL`, `MIXED`, or `PHYSICAL`. |
shipping_costs and basket_discount
Name | Mandatory | Type | Description |
---|---|---|---|
amount | Yes | Integer | Amount in the smallest currency unit (e.g., cents). |
currency | Yes | String(3) | Currency according to ISO 4217 (e.g., `EUR`). |
basket_items List:
An array with the following fields:
Name | Mandatory | Type | Description |
---|---|---|---|
name | Yes | String(127) | Name of the item, e.g., “A fine shirt”. |
description | No | String(127) | Description of the item. |
reference | No | String(64) | Item number, SKU, or other merchant reference. |
quantity | Yes | Object | Quantity and unit of the item (see below). |
unit_price | Yes | Object | Price details for the item (see below). |
item_discount | No | Object | Discounts for this item (see below). |
quantity Object:
Name | Mandatory | Type | Description |
---|---|---|---|
quantity_amount | Yes | Integer | Number of units purchased. |
quantity_unit | Yes | String(8) | Unit of measure for the item (e.g., `pcs`, `kg`). |
unit_price Object:
Name | Mandatory | Type | Description |
---|---|---|---|
net | Yes | Integer | Net price of the item in the smallest currency unit. |
gross | Yes | Integer | Gross price of the item in the smallest currency unit. |
currency | Yes | String(3) | Currency according to ISO 4217 (e.g., `EUR`). |
tax | Yes | Integer | Tax amount in the smallest currency unit or tax rate (with two decimal places). |
item_discount Object:
Name | Mandatory | Type | Description |
---|---|---|---|
net | No | Integer | Discount excluding taxes in the smallest currency unit. |
gross | No | Integer | Discount including taxes in the smallest currency unit. |
currency | No | String(3) | Currency according to ISO 4217 (e.g., `EUR`). |
tax | No | Integer | Tax amount in the smallest currency unit or tax rate. |
basket: { "basket_id": "basket123456", "basket_type": "PHYSICAL", "basket_items": [ { "name": "Item 1", "quantity": { "quantity_amount": 3, "quantity_unit": "pcs" }, "unit_price": { "net": 500, "gross": 600, "currency": "EUR", "tax": 2000 } } ] } billing_address: { "title": "Mr.", "first_name": "Max", "last_name": "Mustermann", "company_name": "Acme GmbH", "email": "maxi.muster@example.com", "phone_contact": { "phone_type": "MOBILE", "phone_number": "+491701234567" }, "address_line_1": "Mustergasse 123", "address_line_2": "Haus A", "address_line_3": "Wohnung 12", "postal_code": "88888", "city": "Berlin", "state": "Berlin", "country": "DE" } shipping_address: { "title": "Mr.", "first_name": "Max", "last_name": "Mustermann", "company_name": "Acme GmbH", "email": "maxi.muster@example.com", "phone_contact": { "phone_type": "HOME", "phone_number": "+49755283492987" }, "address_line_1": "Musterstr. 1a", "postal_code": "88888", "city": "Berlin", "state": "Berlin", "country": "DE" } customer_information: { "customer_id": "CUST123456", "date_of_birth": "1985-06-15", "gender": "MALE", "title": "Mr.", "personal_identifications": [ { "type": "PASSPORT", "id": "A1234567", "issued_by": "DE" }, { "type": "DRIVERS_LICENSE", "id": "DL78901234", "issued_by": "Bavarian Ministry of Transport" } ], "contacts": { "phone_contacts": [ { "phone_type": "HOME", "phone_number": "+442071838750" } ] } } }
curl -d "merchantId=1234567" \ -d "projectId=1234" \ -d "merchantTxId=1234567890" \ -d "amount=1000" \ -d "currency=EUR" \ -d "purpose=Beispieltransaktion" \ -d "basket={\"basket_items\":[{\"name\":\"Item 1\",\"quantity\":{\"quantity_amount\":1,\"quantity_unit\":\"pcs\"},\"unit_price\":{\"net\":1000,\"gross\":1200,\"currency\":\"EUR\",\"tax\":2000}}]}" \ -d "urlRedirect=http://www.my-domain.de/klarna/redirect" \ -d "urlNotify=http://www.my-domain.de/klarna/notify" \ -d "hash=2ddc45c15307201dca8a50a094c70ab9" \ https://payment.girosolution.de/girocheckout/api/v2/transaction/start
The response consists of a JSON object. The field `rc` returns an error code. If `rc = 0` is returned, the transaction was successfully initialized. You will receive a transaction number and the redirectURL to the Klarna form as a response.
Name | Mandatory | Type | Description |
---|---|---|---|
rc | Yes | Integer | Error number |
msg | Yes | String(255) | Additional information in case of an error |
reference | Optional | String(36) | Unique GiroCheckout transaction ID |
redirect | Optional | String(2048) | Redirect URL to forward the customer to their online banking |
HEADER Parameters | |||
hash | Yes | String(32) | HMAC MD5 hash over all values of the response. See hash of the response |
{"reference":"6d2d31b6-c23f-47c4-8f6c-1a0495f35f0f","redirect":"https://testmerch.directpos.de/web-api/SSLPayment.po?n=wrlIRO9O30S4NNAO9h6uHwhyWibDFKUWeoWy7mPLDDyZ","rc":"0","msg":""}
{"reference":null,"redirect":null,"rc":5030,"msg":"Betrag ungültig"}
The outcome of a payment is transmitted to the URL specified in the urlNotify parameter. This notification serves to inform the merchant of the transaction outcome. This information can be used to update the transaction status on the merchant's side.
The payment outcome of a transaction is stored in the `gcResultPayment` field.
URL: notifyUrl from the transaction initialization
Provided by: Merchant
Called by: GiroCheckout
Name | Mandatory | Type | Description |
---|---|---|---|
gcReference | Yes | String(36) | GiroCheckout transaction ID |
gcMerchantTxId | Yes | String(255) | Merchant transaction ID |
gcBackendTxId | Yes | String(22) | Payment processor transaction ID |
gcAmount | Yes | Integer | For decimal currencies, specify the amount in the smallest currency unit, e.g., cents, pennies |
gcCurrency | Yes | String(3) | Currency |
gcResultPayment | Yes | Integer | Payment result codes |
gcHash | Yes | String(32) | HMAC MD5 hash over all values of the call. See generate hash |
One of the following HTTP status codes is expected as a response to the GET request.
HTTP Statuscode | Description |
---|---|
200 (OK) | The notification was processed correctly. |
400 (Bad Request) | The merchant did not process the notification and does not wish to be notified again. |
All others | The notification will be repeated up to 10 times every 30 minutes until the merchant returns HTTP status code 200 or 400. |
After completing the payment, the customer can return to the merchant via a link. Redirection occurs only when the buyer clicks the “Cancel” or “Back to Shop” button or automatically after a few seconds.
URL: redirectUrl from the transaction initialization
Provided by: Merchant
Called by: GiroCheckout
Name | Mandatory | Type | Description |
---|---|---|---|
gcReference | Yes | String(36) | GiroCheckout transaction ID |
gcMerchantTxId | Yes | String(255) | Merchant transaction ID |
gcBackendTxId | Yes | String(22) | Payment processor transaction ID |
gcAmount | Yes | Integer | For decimal currencies, specify the amount in the smallest currency unit, e.g., cents, pennies |
gcCurrency | Yes | String(3) | Currency |
gcResultPayment | Yes | Integer | Payment result |
gcHash | Yes | String(32) | HMAC MD5 hash over all values of the call. See generate hash |
These transactions reference a previously completed transaction. The transaction is based on server-to-server communication and does not require customer action (data entry).
Provided by: GiroCheckout
Called by: Merchant
Beim Buchen (capture) wird das Kundenkonto mit einem Betrag belastet, die Gutschrift erfolgt auf das Händlerkonto. Dieses Modell setzt voraus, dass der zugrundeliegende Geschäftsvorfall abgeschlossen ist, z.B. wurde ein Warenkorb angeboten, bestellt und an den Kunden ausgeliefert.
Eine Erstattung ist zu verwenden, wenn dem Kunden eine vorangegangene Zahlung komplett oder teilweise erstattet werden soll.
Stornieren ist zu verwenden, wenn eine akzeptierte Transaktion nicht ausgeführt werden soll.
URL CAPTURE: https://payment.girosolution.de/girocheckout/api/v2/transaction/capture
URL REFUND: https://payment.girosolution.de/girocheckout/api/v2/transaction/refund
URL VOID: https://payment.girosolution.de/girocheckout/api/v2/transaction/void
Name | Mandatory | Type | Description |
---|---|---|---|
merchantId | Yes | Integer | Merchant ID of a Klarna project |
projectId | Yes | Integer | Project ID of a Klarna project |
merchantTxId | Yes | String(255) | Unique transaction ID of the merchant. Allowed characters: any letters (including language-specific special characters), 0-9, characters & = + , : ; . _ ! ? # / |
amount | Yes (optional for Void) | Integer | For decimal currencies, specify the amount in the smallest currency unit, e.g., cents, pennies |
currency | Yes (optional for Void) | String(3) | Currency of the transaction, according to ISO 4217. EUR = Euro |
purpose | Optional | String(27) | Purpose of the refund or capture. Since Klarna does not know this field, GiroCheckout stores the information under `basket.soft_descriptor` if no information is provided by the shop. |
reference | Yes | String(36) | GiroCheckout transaction ID for which a booking or refund is to be performed |
kassenzeichen | Optional | String(255) | Optional field for passing a cash register identifier. This will be displayed in the GiroCockpit in the transaction details (and soon also exported) and can be searched for there. |
basket | Optional | JSON-String | Optional field that describes the shopping cart. The individual fields can be found in the list above. |
shippingInfo | Optional | JSON-String | Optional field that provides shipping information. The individual fields can be found in the list below. |
hash | Yes | String(32) | HMAC MD5 hash over all values of the call. See generate hash |
Name | Mandatory | Type | Description |
---|---|---|---|
shipping_company | No | String | Name of the shipping company (as specific as possible). |
shipping_method | No | String | Shipping method (e.g., PickUpStore, Home, Postal). |
tracking_number | No | String | Tracking number for the shipment. |
tracking_uri | No | String | URL for shipment tracking for the customer. |
return_shipping_company | No | String | Name of the shipping company for returns. |
return_tracking_number | No | String | Tracking number for the return shipment. |
shipping_delay | No | Integer | Delay (in days) before shipping the order. |
curl -d "merchantId=1234567" \ -d "projectId=1234" \ -d "merchantTxId=1234567890" \ -d "amount=100" \ -d "currency=EUR" \ -d "reference=fb70602d-c137-4413-8432-7dcc69a9d891" \ -d "hash=edb7459114db25c2991d1783d4ab5388" \ https://payment.girosolution.de/girocheckout/api/v2/transaction/capture
The response consists of a JSON object. The field `rc` returns an error code. If `rc = 0` is returned, the transaction was successfully initialized. You will receive a transaction number and further information as a response.
Name | Mandatory | Type | Description |
---|---|---|---|
rc | Yes | Integer | Error number |
msg | Yes | String(255) | Additional information in case of an error |
reference | Yes | String(36) | GiroCheckout transaction ID |
referenceParent | Yes | String(36) | GiroCheckout transaction ID of the underlying original transaction |
merchantTxId | Yes | String(255) | Merchant transaction ID |
backendTxId | Yes | String(22) | Payment processor transaction ID |
amount | Yes | Integer | For decimal currencies, specify the amount in the smallest currency unit, e.g., cents, pennies |
currency | Yes | String(3) | Currency |
resultPayment | Yes | Integer | Transaction result |
hash | Yes | String(32) | HMAC MD5 hash over all values of the call. See generate hash |
{"reference":"6d2d31b6-c23f-47c4-8f6c-1a0495f35f0f","redirect":"https://testmerch.directpos.de/web-api/de_DE/R.po?n=iNJGcJ4M2LZASZ-swXO5urRQntxOxb92NFiITsP60GcIhP","rc":"0","msg":""}
{"reference":null,"redirect":null,"rc":5030,"msg":"Betrag ungültig"}