dalholm / omnipay-klarna
Klarna Checkout gateway for Omnipay payment processing library
Requires
- omnipay/common: ^2.0||^3.0
Requires (Dev)
- omnipay/tests: ^2.0||^3.0
README
This package is a modified version of omnipay-klarna-checkout by nyehandel and Intflow. With this package you can run on Laravel 8 and PHP 8. This package will also contain more functinallity then the original package.
Introduction
Omnipay is a framework agnostic, multi-gateway payment processing library for PHP 5.6+. This package implements Klarna Checkout support for Omnipay.
This package supports PHP 8
Installation
To install, simply add it to your composer.json
file:
$ composer require dalholm/omnipay-klarna
Initialization
First, create the Omnipay gateway:
$gateway = Omnipay\Omnipay::create('\Dalholm\Omnipay\KlarnaCheckout\Gateway'); // or $gateway = new Dalholm\Omnipay\Klarna\Gateway(/* $httpClient, $httpRequest */);
Then, initialize it with the correct credentials:
$gateway->initialize([ 'username' => $username, 'secret' => $secret, 'api_region' => $region, // Optional, may be Gateway::API_VERSION_EUROPE (default) or Gateway::API_VERSION_NORTH_AMERICA 'testMode' => false // Optional, default: true ]); // or $gateway->setUsername($username); $gateway->setSecret($secret); $gateway->setApiRegion($region);
Usage
For general usage instructions, please see the main Omnipay repository.
General flow
- Create a Klarna order
- Update transaction (if required)
- Render the Iframe
- Respond to redirects to
checkoutUrl
orconfirmation_url
- Respond to checkout callbacks
- Respond to the request to
push_url
(indicates order was completed by client) with a ackowledgement - Extend authorization (if required)
- Update the merchant address (if required)
- Perform one or more capture(s), refund(s) or void operations
Authorize
To create a new order, use the authorize
method:
$data = [ 'amount' => 100, 'tax_amount' => 20, 'currency' => 'SEK', 'locale' => 'SE', 'purchase_country' => 'SE', 'notify_url' => '', // https://developers.klarna.com/api/#checkout-api__ordermerchant_urls__validation 'return_url' => '', // https://developers.klarna.com/api/#checkout-api__ordermerchant_urls__checkout 'terms_url' => '', // https://developers.klarna.com/api/#checkout-api__ordermerchant_urls__terms 'validation_url' => '', // https://developers.klarna.com/api/#checkout-api__ordermerchant_urls__validation 'items' => [ [ 'type' => 'physical', 'name' => 'Shirt', 'quantity' => 1, 'tax_rate' => 2500, 'price' => 1000, 'unit_price' => 1000, 'total_tax_amount' => 200, ], ], ]; $response = $gateway->authorize($data)->send()->getData();
This will return the order details as well as the checkout HTML snippet to render on your site.
Render Iframe
Klarna Checkout requires an iframe to be rendered when authorizing payments:
$response = $gateway->fetchTransaction(['transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab']) ->send(); echo $response->getData()['checkout']['html_snippet'];
After submitting the form within the iframe,
Klarna will redirect the client to the provided confirmation_url
(success)
or checkout_url
(failure)`.
Update transaction
While an order has not been authorized (completed) by the client, it may be updated:
$response = $gateway->updateTransaction([ 'transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab', 'amount' => 200, 'tax_amount' => 40, 'currency' => 'SEK', 'locale' => 'SE', 'purchase_country' => 'SE', 'items' => [/*...*/], ])->send();
The response will contain the updated order data.
Update Merchant References
While an order has not been authorized (completed) by the client, it may be updated:
$response = $gateway->updateMerchantReferences([ 'transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab', 'merchant_reference1' => (String) 'Your reference or order id', 'merchant_reference2' => (String) 'Another reference or order id', ])->send();
Response will be an Empty response (204)
Extend authorization
Klarna order authorization is valid until a specific date, and may be extended (up to a maximum of 180 days). The updated expiration date may then be retrieved with a fetch request
if ($gateway->extendAuthorization(['transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab'])->send()->isSuccessful()) { $expiration = new \DateTimeImmutable( $gateway->fetchTransaction(['transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab']) ->send() ->getData()['management']['expires_at'] ); }
Capture
$success = $gateway->capture([ 'transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab', 'amount' => '995', ])->send() ->isSuccessful();
Fetch
A Klarna order is initially available through the checkout API. After it has been authorized, it will be available through the Order management API (and will, after some time, no longer be available in the checkout API). This fetch request will first check whether the order exitst in the checkout API. If that is not the case, or the status indicates the order is finished, it will also fetch the order from the order management API
$response = $gateway->fetchTransaction(['transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab']) ->send(); $success = $response->isSuccessful(); $checkoutData = $response->getData()['checkout'] ?? []; $managementData = $response->getData()['management'] ?? [];
API documentation | Checkout | Order management
Acknowlegde
Acknowledge a completed order
$success = $gateway->acknowledge(['transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab']) ->send() ->isSuccessful();
Refund
$success = $gateway->refund([ 'transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab', 'amount' => '995', ])->send() ->isSuccessful();
Void
You may release the remaining authorized amount. Specifying a specific amount is not possible.
$success = $gateway->void(['transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab']) ->send() ->isSuccessful();
Update customer address
This may be used when updating customer address details after the order has been authorized. Success op this operation is subject to a risk assessment by Klarna. Both addresses are required parameters.
$success = $gateway->refund([ 'transactionReference' => 'a5bec272-d68d-4df9-9fdd-8e35e51f92ab', 'shipping_address' => [ 'given_name'=> 'Klara', 'family_name'=> 'Joyce', 'title'=> 'Mrs', 'street_address'=> 'Apartment 10', 'street_address2'=> '1 Safeway', 'postal_code'=> '12345', 'city'=> 'Knoxville', 'region'=> 'TN', 'country'=> 'us', 'email'=> 'klara.joyce@klarna.com', 'phone'=> '1-555-555-5555' ], 'billing_address' => [ 'given_name'=> 'Klara', 'family_name'=> 'Joyce', 'title'=> 'Mrs', 'street_address'=> 'Apartment 10', 'street_address2'=> '1 Safeway', 'postal_code'=> '12345', 'city'=> 'Knoxville', 'region'=> 'TN', 'country'=> 'us', 'email'=> 'klara.joyce@klarna.com', 'phone'=> '1-555-555-5555' ], ])->send() ->isSuccessful();
Units
Klarna expresses amounts in minor units as described here.