# Klarna Checkout: Get Started

In this chapter we are going to talk about the most common task: purchase of a product using [Klarna Checkout](https://developers.klarna.com/en/klarna-checkout). Unfortunately, You cannot use Payum's order to purchase stuff. Only klarna specific format is supported. We assume you already read basic [get it started](/payum/get-it-started.md).

### Installation

The preferred way to install the library is using [composer](http://getcomposer.org/). Run composer require to add dependencies to *composer.json*:

```bash
php composer.phar require payum/klarna-checkout php-http/guzzle7-adapter
```

### config.php

We have to only add the gateway factory. All the rest remain the same:

```php
<?php
//config.php

use Payum\Core\PayumBuilder;
use Payum\Core\Payum;

/** @var Payum $payum */
$payum = (new PayumBuilder())
    ->addGateway('klarna', [
        'factory' => 'klarna_checkout',
        'merchant_id' => 'EDIT IT',
        'secret' => 'EDIT IT',
    ])

    ->getPayum()
;
```

An initial configuration for Payum basically wants to ensure we have things ready to be stored such as a token, or a payment details. We also would like to have a registry of various gateways supported and the place where they can store their information (e.g. payment details).

***Note**: Consider using something other than `FilesystemStorage` in production. `DoctrineStorage` may be a good alternative.*

First we have modify `config.php` a bit. We need to add gateway factory and payment details storage.

### prepare.php

```php
<?php
// prepare.php

use Payum\Core\Model\ArrayObject;

include __DIR__.'/config.php';

/** @var \Payum\Core\Storage\StorageInterface $storage */
$storage = $this->getPayum()->getStorage(ArrayObject::class);

$details = $storage->create();
$details['purchase_country'] = 'SE';
$details['purchase_currency'] = 'SEK';
$details['locale'] = 'sv-se';
$storage->update($details);

/** @var \Payum\Core\Security\TokenInterface $authorizeToken */
$authorizeToken = $payum->getTokenFactory()->createAuthorizeToken('klarna', $details, 'done.php');

/** @var \Payum\Core\Security\TokenInterface $notifyToken */
$notifyToken = $payum->getTokenFactory()->createNotifyToken('klarna', $details);

$details['merchant'] = array(
    'terms_uri' => 'http://example.com/terms',
    'checkout_uri' => $authorizeToken->getTargetUrl(),
    'confirmation_uri' => $authorizeToken->getTargetUrl(),
    'push_uri' => $notifyToken->getTargetUrl()
);
$details['cart'] = array(
    'items' => array(
         array(
            'reference' => '123456789',
            'name' => 'Klarna t-shirt',
            'quantity' => 2,
            'unit_price' => 12300,
            'discount_rate' => 1000,
            'tax_rate' => 2500
         ),
         array(
            'type' => 'shipping_fee',
            'reference' => 'SHIPPING',
            'name' => 'Shipping Fee',
            'quantity' => 1,
            'unit_price' => 4900,
            'tax_rate' => 2500
         )
    )
);
$storage->update($details);

header("Location: ".$authorizeToken->getTargetUrl());
```

That's it. As you see we configured Klarna Checkout `config.php` and set details `prepare.php`. [capture.php](/payum/examples/capture-script.md) and [done.php](/payum/examples/done-script.md) scripts remain same.

***

### Supporting Payum

Payum is an MIT-licensed open source project with its ongoing development made possible entirely by the support of community and our customers. If you'd like to join them, please consider:

* [Become a sponsor](https://github.com/sponsors/Payum)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://payum.gitbook.io/payum/klarna/checkout/get-it-started.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
