Create a background payment

This chapter describes how to use Wallet API to create allowance and control payment transactions. Allowance is a permission to make payments without asking the user permision for each payment. It allows to make small payments from wallet very quickly and smoothly, after she has confirmed client-initiated allowance or created one by herself.

Warning Creating an allowance does not guarantee that payment will be successfuly made without user intervention. For example, there may be insufficient account balance in that wallet.
Important Only one allowance can be active for a wallet at a time. If client creates new one and it gets confirmed, the active one will get canceled.

Integration

Before using API, you must register in Paysera system. Public registration is not yet available, please contact our support to register the client for this API. You will be provided with your credentials, for example:

client_id:     wkVd93h2uS
mac_key:       IrdTc8uQodU7PRpLzzLTW6wqZAO6tAMU
mac_algorithm: hmac-sha-256
Important mac_key must be kept secret at all times.

Every transaction follows 3 main and 1 optional steps until it's completed:

  1. Transaction is created by client (developed system);
  2. Transaction is accepted by user, relating it to specific wallet;
  3. Transaction is confirmed or revoked by the client (developed system);
  4. (Optionally) Each payment in transaction can be finalized or cancelled.

More info Making payments.

For creating background payment need to use at least 2 transactions:

  • Transaction 1. Creating and confirming allowance.

    As there is no payment only steps from 1 to 3 are followed.

  • Transaction 2. Creating and confirming payment with allowance.

    As user gives allowance, step 2 is accepted using user wallet_id, there is no need of other user actions.

Integration with the library

You can integrate payments into your website by downloading our open source software library. The library is used to check all the necessary security parameters of transferred and received data. PHP library is available on GitHub, together with more information about installing and using it. Please feel free to fork and make pull requests for added functionality or fixed bugs. More info: Wallet libraries.

Below you will find a working example. Locations where your Paysera access data has to be entered are marked with comments.

1. Create a folder.

Create a folder, name it paysera-wallet. Here, all the files related to payment creation will be stored.

2. Download the library.

Download GitHub files to the paysera-wallet folder.

3. Create a file that will create an allowance.

Create file allowance.php in the paysera-wallet folder. First of all you must include library and register GatewayClient_Autoloader as an SPL autoloader:

<?php
if (!class_exists('Paysera_WalletApi_Autoloader')) {
    require_once 'lib-wallet-php-client-master/src/Paysera/WalletApi/Autoloader.php';
}

Paysera_WalletApi_Autoloader::register();

Write in your authentication data values, which you have received as Wallet credentials:

// $clientId - mac
$clientId = 'wkVd93h2uS';
// $secret - mac_key
$secret = 'IrdTc8uQodU7PRpLzzLTW6wqZAO6tAMU';

Create main object to use for all functionality. Using our library you may create object either for production, either for testing – Sandbox:

Production
$api = new Paysera_WalletApi($clientId, $secret);
Sandbox
$api = new Paysera_WalletApi($clientId, $secret, Paysera_WalletApi_Util_Router::createForSandbox());
Info Only one of two methods to asign $api must be used: sandbox or production

Start new session as we will store transactionKey in $_SESSION['transactionKey']:

session_start();

To facilitate the catching of potential exceptions code must be surrounded in try block:

try {

// Allowance creation steps

} catch (Exception $e) {
    echo '<pre>', $e, '</pre>';
}

Inside try block there will be logic which creates and confirms allowance. First step is to create an allowance object, then create a transaction with a created allowance object, then authorise transaction and the last step - client (developed system) must confirm that transaction. Transaction might be confirmed automaticaly, after redirect to client (developed system) site or after callback. See Transaction resource for more information.

To create allowance object we need to create price which is used in allowance object:

$priceObj = Paysera_WalletApi_Entity_Money::create()
   ->setAmountInCents(500)
   ->setCurrency('EUR')
;

Create an allowance object. In this example we create allowance with max price and make it valid for a week. More info about all parameters: Allowance resource. In order to create allowance object and add parameters to it we use: Paysera_WalletApi_Entity_Payment:

$allowanceObj = Paysera_WalletApi_Entity_Allowance::create()
    ->setDescription('Allowance of 5.00 EURO for 7 days')
    ->setMaxPrice($priceObj)
    ->setValidFor(604800)
;

Transaction object is created and values are updated using Paysera_WalletApi_Entity_Transaction. In this example we are adding only allowance with a redirect link which will be used after user confirms transaction:

$transactionObj = Paysera_WalletApi_Entity_Transaction::create()
    ->addPayment($paymentObj)
    ->setRedirectUri('http://wallet.dev.docker/allowance.php')
;

After we get transaction object we are creating the transaction:

$transactionCreated = $api->walletClient()->createTransaction($transactionObj);

User is redirected to the transaction confirmation page with a code:

header('Location:' . $api->router()->getTransactionConfirmationUri($transactionCreated->getKey()));

After user accepts transaction client (developed system) must confirm it:

$transaction = $api->walletClient()->getTransaction($_SESSION['transactionKey'])

$api->walletClient()->confirmTransaction($transaction->getKey());

The whole code in the file allowance.php:

<?php
if (!class_exists('Paysera_WalletApi_Autoloader')) {
    require_once 'lib-wallet-php-client-master/src/Paysera/WalletApi/Autoloader.php';
}

Paysera_WalletApi_Autoloader::register();

// $clientId - mac
$clientId = 'wkVd93h2uS';
// $secret - mac_key
$secret = 'IrdTc8uQodU7PRpLzzLTW6wqZAO6tAMU';

$api = new Paysera_WalletApi($clientId, $secret, Paysera_WalletApi_Util_Router::createForSandbox());

session_start();
try {
    if (!isset($_SESSION['transactionKey'])) {
        $priceObj = Paysera_WalletApi_Entity_Money::create()
            ->setAmountInCents(500)
            ->setCurrency('EUR')
        ;

        $allowanceObj = Paysera_WalletApi_Entity_Allowance::create()
            ->setDescription('Allowance of 5.00 EURO for 7 days')
            ->setMaxPrice($priceObj)
            ->setValidFor(604800)
        ;

        $transactionObj = Paysera_WalletApi_Entity_Transaction::create()
            ->setAllowance($allowanceObj)
            ->setRedirectUri('http://wallet.dev.docker/allowance.php')
        ;

        $transactionCreated = $api->walletClient()->createTransaction($transactionObj);

        $_SESSION['transactionKey'] = $transactionCreated->getKey();

        header('Location:' . $api->router()->getTransactionConfirmationUri($transactionCreated->getKey()));
    }

    if (isset($_SESSION['transactionKey'])){
        $transaction = $api->walletClient()->getTransaction($_SESSION['transactionKey']);

        // ToDo: some action with $transaction

        if ($transaction->getStatus() == 'reserved') {
            $api->walletClient()->confirmTransaction($transaction->getKey());
        }

        unset($_SESSION['transactionKey']);
    }
} catch (Exception $e) {
    echo '<pre>', $e, '</pre>';
}

4. Create a file that will make background payment.

Create file pay-with-allowance.php in the paysera-wallet folder. the process is similar to Create a payment, just difference is that client (developed system) doesn't need to wait for user confirmation as created allowance will be added to transaction. The sample code which makes background payment with allowance:

<?php
if (!class_exists('Paysera_WalletApi_Autoloader')) {
    require_once 'lib-wallet-php-client-master/src/Paysera/WalletApi/Autoloader.php';
}

Paysera_WalletApi_Autoloader::register();

// $clientId - mac
$clientId = 'wkVd93h2uS';
// $secret - mac_key
$secret = 'IrdTc8uQodU7PRpLzzLTW6wqZAO6tAMU';

$api = new Paysera_WalletApi($clientId, $secret, Paysera_WalletApi_Util_Router::createForSandbox());

try {
    $priceOfItemOne = Paysera_WalletApi_Entity_Money::create()
        ->setAmountInCents(100)
        ->setCurrency('EUR')
    ;

    $itemOne = Paysera_WalletApi_Entity_Item::create()
        ->setTitle('Item One')
        ->setDescription('Item One in sale')
        ->setImageUri('https://developers.paysera.com/bundles/evpfrontpage/img/logo.png')
        ->setPrice($priceOfItemOne)
        ->setQuantity(2)
    ;

    $priceOfItemTwo = Paysera_WalletApi_Entity_Money::create()
        ->setAmountInCents(150)
        ->setCurrency('EUR')
    ;

    $itemTwo = Paysera_WalletApi_Entity_Item::create()
        ->setTitle('Item Two')
        ->setDescription('Item Two in sale')
        ->setImageUri('https://developers.paysera.com/bundles/evpfrontpage/img/logo.png')
        ->setPrice($priceOfItemTwo)
        ->setQuantity(1)
    ;

    $paymentObj = Paysera_WalletApi_Entity_Payment::create()
        ->addItem($itemOne)
        ->addItem($itemTwo)
        ->setDescription('In Sale')
    ;

    $allowanceTransaction = $api->walletClient()->getTransaction('[ALLOWANCE_TRANSACTION_KEY]');

    $transactionObj = Paysera_WalletApi_Entity_Transaction::create()
        ->addPayment($paymentObj)
        ->setAllowance($allowanceTransaction->getAllowance())
    ;

    $transactionCreated = $api->walletClient()->createTransaction($transactionObj);

    $api->walletClient()->acceptTransactionUsingAllowance(
        $transactionCreated->getKey(),
        $allowanceTransaction->getWallet()
    );

    // ToDo: some actions with transaction

    $api->walletClient()->confirmTransaction($transactionCreated->getKey());
} catch (Exception $e) {
    echo '<pre>', $e, '</pre>';
}
Info [ALLOWANCE_TRANSACTION_KEY] is transaction_key of transaction which were created on step 3.

Integration with the specification

If it's available (there is PHP with required version in your server), we strongly advise to use our library.

1. Create allowance.

This method creates allowance in Paysera system. After creating allowance, user should be redirected to confirmation page or allowance should be confirmed in other ways. More info about allowance: Allowance Resource.

Info Creating a new allowance does not affect the active one - it is canceled only when (if) the new one is confirmed
Warning Allowances with status new are deleted automatically 1 month after creation time.
POST https://wallet.paysera.com/rest/v1/allowance
Example request for allowance without limits
POST /rest/v1/allowance HTTP/1.1
Host: wallet.paysera.com
Content-Type: application/json;charset=utf-8
User-Agent: Paysera WalletApi PHP library
Authorization: MAC id="wkVd93h2uS", ts="1343822400", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="JhfX/LyydJN8+K+S3gU3CpMcF/H+7Je0Qqvx7bKghV8=", ext="body_hash=Y2nyrCCNhAqRbJu0UK8b57S%2BDim5jcyCsRQoz9My4j0%3D"
{
    "description": "Allowance for weekly services (5 weeks)",
    "currency": "EUR",
    "max_price": 1500,
    "valid": {
        "for": 3110400
    }
}
Info This allows us to charge wallet maximum sum of 15.00 Euros in 36 days. For example, this can be used for charging 3 Euros each week for 5 weeks.
Warning Allowance is invalid if payments for 15.00 Euros are confirmed or 36 days passes. You cannot confirm more than 15.00 Euros using this allowance neither at once in single payment, nor at different payments using smaller amounts.
Example response
HTTP/1.1 200 OK
Content-type: application/json;charset=utf-8
{
    "id": 2987,
    "transaction_key": "pDAlAZ3z",
    "created_at": 1355314332,
    "status": "new",
    "description": "Allowance for weekly services (5 weeks)",
    "currency": "EUR",
    "max_price": 1500
}

2. Create transaction.

Transaction groups one or more objects into one confirmable group. To confirm any created object, there must be a transaction.

Info Default transaction is created together with payment and allowance to be confirmed without creating it manually.

Moreover, transactions take part in all-or-nothing scenarios: either all of grouped payments are done successfuly, or all fail. For example, if wallet has sufficient account balance only for one of grouped payments, user will be unable to confirm this transaction.
Transactions are also good when making shop carts with payments to different beneficiaries - user will have to confirm something just once.

Warning Transactions group payments only when confirming. If payment is canceled, other payments in the same transaction remain unchanged.

This method creates transaction that groups payment(s) and/or allowance into one confirmable item. More info about transaction creation: Transaction resource.

POST https://wallet.paysera.com/rest/v1/transaction
Example request for creating payment and assigning optional allowance
POST /rest/v1/transaction HTTP/1.1
Host: wallet.paysera.com
Content-Type: application/json;charset=utf-8
User-Agent: Paysera WalletApi PHP library
Authorization: MAC id="wkVd93h2uS", ts="1343822400", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="JoZ+SX/Q8y0W1omXBjTrZA9YyZ2gjM6tLmmSly4s5Xo=", ext="body_hash=gK8kVbYW1XEeZUf4BR1yZ45YLu%2BEYnq1WOGYtRhxyQA%3D"
{
    "payments": [
        {
            "description": "Payment for order No. 1234",
            "price": 1299,
            "currency": "EUR",
            "parameters": {
                "orderid": 1234
            }
        }
    ],
    "allowance": {
        "id": 784,
        "optional": true
    },
    "redirect_uri": "http:\/\/www.example.com\/somePage"
}
Example response
HTTP/1.1 200 OK
Content-type: application/json;charset=utf-8
{
    "transaction_key": "pDAlAZ3z",
    "created_at": 1355314332,
    "status": "new",
    "project_id": 2248,
    "valid_for_payment_card_debit": false,
    "payments": [
        {
            "id": 2988,
            "transaction_key": "pDAlAZ3z",
            "created_at": 1355314332,
            "status": "new",
            "price": 1299,
            "currency": "EUR",
            "description": "Payment for order No. 1234",
            "parameters": {
                "orderid": 1234
            }
        }
    ],
    "allowance": {
        "optional": true,
        "data": {
            "id": 784,
            "transaction_key": "pDAlAZ3z",
            "created_at": 1355314332,
            "status": "new",
            "description": "Allowance for weekly services (5 weeks)",
            "currency": "EUR",
            "max_price": 1500,
            "limits": [
                {
                    "max_price": 300,
                    "time": 604800
                }
            ]
        }
    },
    "reserve": {
        "until": 1355400732
    },
    "use_allowance": false,
    "suggest_allowance": false,
    "auto_confirm": false,
    "redirect_uri": "http:\/\/www.example.com\/somePage"
}

3. Authorise transaction.

After creating transaction, it has to be authorised by a user and confirmed by the client (developed system) to take effect. Authorising (reserving funds) can be accomplished using active allowance, without user intervention. This allowance must be accepted beforehand in some other way and confirmed by the client (developed system).

More info about authorising transaction: Authorising transactions (reserving funds).

Transaction cannot have an included allowance. Allowance must be accepted beforehand in some other way and confirmed by the client (developed system). More info about allowance: Allowance resource.

PUT https://wallet.paysera.com/rest/v1/transaction/:transaction_key/reserve/:wallet
Example request
PUT /rest/v1/transaction/pDAlAZ3z/reserve/14471 HTTP/1.1
Host: wallet.paysera.com
User-Agent: Paysera WalletApi PHP library
Authorization: MAC id="wkVd93h2uS", ts="1343822400", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="euh/Pkpa1pYAHyZHLg2sAscm0W7xYPEO92TbYdh5B3E="
Info In this example we are reserving price of transaction which transaction_key is pDAlAZ3z in the wallet which ID is 14471.

Example response

HTTP/1.1 200 OK
Content-type: application/json;charset=utf-8
{
    "transaction_key": "pDAlAZ3z",
    "created_at": 1355314332,
    "status": "reserved",
    "type": "automatic",
    "wallet": 14471,
    "valid_for_payment_card_debit": false,
    "project_id": 2248,
    "payments": [
        {
            "id": 2988,
            "transaction_key": "pDAlAZ3z",
            "created_at": 1355314332,
            "status": "reserved",
            "price": 1299,
            "currency": "EUR",
            "wallet": 14471,
            "freeze": {
                "until": 1357992732
            },
            "description": "Payment for order No. 1234",
            "parameters": {
                "orderid": 1234
            },
            "transfer_id": 578842
        }
    ],
    "reserve": {
        "until": 1357992732
    },
    "use_allowance": false,
    "suggest_allowance": false,
    "auto_confirm": false
}

4. Confirm transaction.

When transaction status is reserved, you can confirm or revoke the transaction.

PUT https://wallet.paysera.com/rest/v1/transaction/:transaction_key/confirm

Confirmed transaction is returned on success. See get transaction information response data structure for more information.

Example request
PUT /rest/v1/transaction/pDAlAZ3z/confirm HTTP/1.1
Host: wallet.paysera.com
User-Agent: Paysera WalletApi PHP library
Authorization: MAC id="wkVd93h2uS", ts="1343822400", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="LW8+ekuXz2uP3LBAgyX8Tm0pV9U6AnjTz3M3hRB2z0E="
Example response
HTTP/1.1 200 OK
Content-type: application/json;charset=utf-8
{
    "transaction_key": "pDAlAZ3z",
    "created_at": 1355314332,
    "status": "confirmed",
    "type": "page",
    "wallet": 14471,
    "valid_for_payment_card_debit": false,
    "confirmed_at": 1355314392,
    "project_id": 2248,
    "payments": [
        {
            "id": 2988,
            "transaction_key": "pDAlAZ3z",
            "created_at": 1355314332,
            "status": "confirmed",
            "price": 1299,
            "currency": "EUR",
            "wallet": 14471,
            "confirmed_at": 1355314392,
            "freeze": {
                "until": 1357992732
            },
            "description": "Payment for order No. 1234",
            "parameters": {
                "orderid": 1234
            }
        }
    ],
    "allowance": {
        "optional": true,
        "data": {
            "id": 784,
            "transaction_key": "pDAlAZ3z",
            "created_at": 1355314332,
            "status": "active",
            "currency": "EUR",
            "wallet": 14471,
            "confirmed_at": 1355314392,
            "valid": {
                "until": 1357992732
            },
            "description": "Allowance for weekly services (5 weeks)",
            "max_price": 1500,
            "limits": [
                {
                    "max_price": 300,
                    "time": 604800
                }
            ]
        }
    }
}