Pojedyncza transakcja

Przygotuj dane potrzebne do przeprowadzenia płatności jak w przykładzie poniżej.
Jak widzisz, w przypadku płatności kartą potrzebne są trzy zestawy informacji: dotyczące transakcji (sale), klienta (customer) oraz konta (account).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ddebit_params = array(
    'sale' => array(
        'amount'      => 19.99,
        'currency'    => 'EUR',
        'description' => 'Product #1'
    ),
    'customer' => array(
        'name'    => 'Hans Muller',
        'email'   => 'hans@muller.de',
        'ip'      => '127.0.0.1',
        'address' => array (
            'street_house' => 'Platz der Republik 1',
            'city'         => 'Berlin',
            'state'        => 'Berlin',
            'zip'          => '11011',
            'country_code' => 'DE',
        ),
    ),
    'account' => array(
        'account_holder'  => 'Hans Muller',
        'account_country' => 'DE',
        'iban'            => 'DE12345678901234567890',
        'bic'             => 'BICBICDE',
        'mandate_id'      => '54321',
    ),
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ddebit_params = {
    'sale'=> {
        'amount'      => 19.99,
        'currency'    => 'EUR',
        'description' => 'Product #1'
    },
    'customer' => {
        'name'    => 'Hans Muller',
        'email'   => 'hans@muller.de',
        'ip'      => '127.0.0.1',
        'address' => {
            'street_house' => 'Platz der Republik 1',
            'city'         => 'Berlin',
            'state'        => 'Berlin',
            'zip'          => '11011',
            'country_code' => 'DE'
        }
    },
    'account' => {
        'account_holder'  => 'Hans Muller',
        'account_country' => 'DE',
        'iban'            => 'DE12345678901234567890',
        'bic'             => 'BICBICDE',
        'mandate_id'      => '54321'
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ddebits_params = {
  'sale' : {
    'amount'      : 19.99,
    'currency'    : 'EUR',
    'description' : 'Product #1'
  }
  'customer' : {
    'name'  : 'Hans Muller',
    'email' : 'hans@muller.de',
    'ip'    : '127.0.0.1',
    'address' : {
      'street_house' : 'Platz der Republik 1',
      'city'         : 'Berlin',
      'state'        : 'Berlin',
      'zip'          : '500',
      'country_code' : 'DE'
    },
  },
  'account' : {
    'account_holder'  : 'Hans Muller',
    'account_country' : 'DE',
    'iban'            : 'DE12345678901234567890',
    'bic'             : 'BICBICDE',
    'mandate_id'      : '54321'
  }
}
1
2
3
4
Sale sale         = new Sale(19.99, "EUR", "Product #1");
Address address   = new Address("1600 Pennsylvania Avenue Northwest", "Washington", "DC", "500", "US");
Customer customer = new Customer("John Doe", "john@doe.com", "127.0.0.1", address);
Account account   = new Account("Hans Muller","de","DE12345678901234567890","BICBICDE","54321");

Teraz po prostu wykonaj płatność używając metody directDebitSale.

Możesz sprawdzić, czy płatność się powiodła, wywołując metodę isSuccess.
Pozyskanie numeru ID transakcji (lub informacji o błędzie, jeśli coś pójdzie nie tak), jest również bardzo proste i może wyglądać jak na poniższym przykładzie.

1
2
3
4
5
6
7
8
9
10
11
12
13
try {
    $status = $client->directDebitSale($ddebit_params);
} catch (Exception $e) {
    // handle exceptions here
}

if ($client->isSuccess()) {
    echo "Success, id_sale: {$status['id_sale']} \n";
} else {
    die("Error ID: {$status['error']['id_error']}, \n".
        "Error number: {$status['error']['error_number']}, \n".
        "Error description: {$status['error']['error_description']}");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
begin
    status = client.direct_debit_sale(ddebit_params)
rescue PayLane::ClientError => e
    # handle exceptions here
end

if client.success?
    puts "Success, id_sale: #{status["id_sale"]}"
else
    puts "Error ID: #{status["error"]["id_error"]}, \n"\
         "Error number: #{status["error"]["error_number"]}, \n"\
         "Error description: #{status["error"]["error_description"]}"
    exit
end
1
2
3
4
5
6
7
8
9
10
11
try:
    status = client.direct_debit_sale(ddebits_params)
except Exception, e:
    # handle exceptions here

if client.is_success():
    print 'Success, id_sale: %s' % status['id_sale']
else:
    sys.exit('Error ID: ' + str(status["error"]["id_error"]) + '\n' \
             'Error number: ' + str(status["error"]["error_number"]) + '\n' \
             'Error description: ' + str(status["error"]["error_description"]))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
api.directDebitSale(sale, customer, account, new Callback<SaleResult>() {

    @Override
    public void onFinish(SaleResult result) {
        // success
    }

    @HandleException
    public void onProtocolError(ProtocolException e) {
        // invoke if not success
        // e.getCode() - error code
        // e.getMessage() - error message
    }

    @Override
    public void onError(Exception e) {
        // connection error etc.
    }
});

Dokładne opisy wszystkich metod i struktur znajdziesz w opisie funkcji.

Zauważ, że transakcje direct debit oznaczane są po wykonaniu jako pending. Możesz sprawdzić ich status (czy zmienił się na performed, cleared itd.) korzystając z metody getSaleInfo:

1
2
3
4
5
6
try {
    $sale_info = $client->getSaleInfo(array('id_sale' => $id_sale));
}
catch (Exception $e) {
    // handle exceptions here
}
1
2
3
4
5
begin
    sale_info = client.get_sale_info({"id_sale" => id_sale})
rescue PayLane::ClientError => e
    # handle exceptions here
end
1
2
3
4
try:
    sale_info = client.get_sale_info({'id_sale': id_sale})
except Exception, e:
    # handle exceptions here
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
api.saleInfo(idSale, new Callback<SaleInfoResult>() {
    @Override
    public void onFinish(SaleInfoResult result) {
        // success
    }

    @HandleException
    public void onProtocolError(ProtocolException e) {
        // invoke if not success
        // e.getCode() - error code
        // e.getMessage() - error message
    }

    @Override
    public void onError(Exception e) {
        // connection error etc.
    }
});

Reversal

Podobnie jak w przypadku kart występują chargebacki (obciążenia zwrotne), w płatnościach direct debit występuje mechanizm reversal.

Sprawdzanie statusów transakcji direct debit jest wysoce zalecane – w ten sposób można określić, czy reversal (a więc żądanie zwrotu środków) wystąpił, czy nie. Możesz sprawdzać statusy transakcji ręcznie w Merchant Panelu, ale również automatycznie przez API.

Jeśli chcesz użyć API, by sprawdzić status transakcji direct debit, użyj metody getSaleInfo:

1
2
3
4
5
6
try {
    $sale_info = $client->getSaleInfo(array('id_sale' => $id_sale));
}
catch (Exception $e) {
    // handle exceptions here
}
1
2
3
4
5
begin
    status = client.get_sale_info({"id_sale" => id_sale})
rescue PayLane::ClientError => e
    # handle exceptions here
end
1
2
3
4
try:
    sale_info = client.get_sale_info({'id_sale': id_sale})
except Exception, e:
    # handle exceptions here
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
api.saleInfo(idSale, new Callback<SaleInfoResult>() {
    @Override
    public void onFinish(SaleInfoResult result) {
        // success
    }

    @HandleException
    public void onProtocolError(ProtocolException e) {
        // invoke if not success
        // e.getCode() - error code
        // e.getMessage() - error message
    }

    @Override
    public void onError(Exception e) {
        // connection error etc.
    }
});
Teraz po prostu sprawdź, czy pole is_reversal w sale_info ma wartość true czy false.

Możesz również użyć mechanizmu powiadomień o transakcjach, by sprawdzać statusy transakcji automatycznie. Dzięki temu nie będziesz musiał wysyłać żadnych żądań do naszych systemów – otrzymasz powiadomienie, gdy tylko transakcja zmieni swój status.