Płatności cykliczne

Płatności cykliczne to po prostu ponowne obciążenia karty (resale) wykonywane w określonych odstępach czasowych. Możesz wykonywać je według schematu określanego przez Twój model biznesowy.

Transakcje cykliczne PayPal

Standardowo transakcje cykliczne odbywają się za pośrednictwem tzw. profili recurringowych. Dzięki nim PayPal sam automatycznie inicjuje kolejne płatności według instrukcji, jakie przekażemy mu wraz z pierwszą transakcją.

Konfiguracja powiadomień:
Aby poprawnie zintegrować takie transakcje z systemem PayLane, należy ustawić powiadomienia na koncie PayPal tak, by wskazywały na serwer PayLane: https://secure.paylane.com/paypalIPN.

Tworzenie profilu recurringowego:
Aby stworzyć profil recurringowy należy do parametrów pierwszej płatności dodać strukturę recurring określającą własności profilu. Przykładowo:

1
2
3
4
5
6
7
8
9
10
11
12
13
$paypal_params = array(
    'sale'     => array(
        'amount'      => 19.99,
        'currency'    => 'EUR',
        'description' => 'Product #1'
    ),
    'back_url'  => 'http://example-page.com',
    'recurring' => array(
        'amount'     => '19.99',
        'start_date' => '2014-11-01',
        'period'     => 'month'
    ),
);
1
2
3
4
5
6
7
8
9
10
11
12
13
paypal_params = {
    'sale' => {
        'amount'      => 19.99,
        'currency'    => 'EUR',
        'description' => 'Product #1'
    },
    'back_url' => 'http://example-page.com',
    'recurring' => array(
        'amount'     => '19.99',
        'start_date' => '2014-11-01',
        'period'     => 'month'
    )
}
1
2
3
4
5
6
7
8
9
10
11
12
13
paypal_params = {
  'sale' : {
    'amount'      : 19.99,
    'currency'    : 'EUR',
    'description' : 'Product #1'
  },
  'back_url' : 'http://example.com',
  'recurring' : {
     'amount'     => '19.99',
     'start_date' => '2014-11-01',
     'period'     => 'month'
  }
}

W strukturze recurring mamy trzy parametry:

  • amount – kwota, jaka będzie cyklicznie pobierana (separator dziesiętny: kropka),
  • start_date – data (w formacie RRRR-MM-DD) określająca początek cyklu,
  • period – okres cyklu płatności; możliwe wartości: day – dzień, week – tydzień, month – miesiąc, year – rok.

Transakcje referencyjne

Transakcje referencyjne (tzw. resale odwołujące sie do wcześniejszych płatności) oferują nieco większe możliwości dla bardziej doświadczonych użytkowników – to oni sami bezpośrednio inicjują każdą kolejną płatność. Należy jednak mieć na uwadze, że takie rozwiązanie trzeba dodatkowo samodzielnie zaimplementować.

Co więcej, aby móc skorzystać z tego rozwiązania, należy zgłosić się do PayPala w celu aktywacji transakcji referencyjnych. PayPal wymaga odpowiednich miesięcznych obrotów (np. rzędu 100000 USD) i decyzja o włączeniu transakcji referencyjnych należy do niego.

Resale nie wymaga kompletu informacji o transakcji/kliencie. Dlatego właśnie potrzebna jest najpierw przynajmniej jedna płatność, do której można się odwołać.

Zacznij od przygotowania informacji potrzebnych do zrealizowania ponownej płatności. W tym celu musisz najpierw pozyskać numer ID wcześniejszej transakcji, który jednoznacznie określa daną płatność w systemie PayLane. Możesz łatwo odczytać ten numer podczas przeprowadzania transakcji, na przykład:

1
2
$status = $client->paypalSale($paypal_params);
$id_first_sale = $status['id_sale'];
1
2
status = client.paypal_sale(paypal_params)
id_first_sale = status['id_sale']
1
2
status = client.paypal_sale(paypal_params)
id_first_sale = status['id_sale']
1
2
3
4
5
6
api.payPalSale(sale,"http://example-page.com",new Callback<RedirectSaleResult>() {
    @Override
    public void onFinish(RedirectSaleResult result) {
        long idSale=result.getIdSale();
    }
});
Na stronie Pojedyncza transakcja znajdziesz więcej informacji na temat dokonywania pojedynczej płatności.

Wprawdzie możesz odwołać się do dowolnej wcześniejszej transakcji PayPal, to jednak zalecamy odnoszenie się do ostatniej (najnowszej) płatności. Takie podejście ma wiele zalet, pozwala m.in. na łatwe śledzenie przepływu płatności.

Zazwyczaj sprzedawcy przechowują takie numery ID w swoich bazach danych. W ten sposób nie muszą przechowywać żadnych wrażliwych danych, a jednocześnie mają możliwość bezpośredniego odwołania się do wybranej transakcji.

Gdy posiadasz już numer ID (np. pobrany z bazy danych), możesz przygotować dane potrzebne do obciążenia karty i wywołać metodę resaleBySale.

Możesz sprawdzić czy płatność została wykonana prawidłowo wywołując metodę isSuccess. Pozyskanie numeru ID transakcji (lub danych o błędzie, jeśli operacja się nie powiodła) 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
14
15
16
17
18
19
20
$resale_params = array(
    'id_sale'     => $id_first_sale,
    'amount'      => 99.99,
    'currency'    => 'EUR',
    'description' => 'Recurring billing product #1',
);

try {
    $status = $client->resaleBySale($resale_params);
} catch (Exception $e) {
    // handle exceptions here
}

if ($client->isSuccess()) {
    echo "Success, second 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
15
16
17
18
19
20
21
resale_params = {
    'id_sale'     => id_first_sale,
    'amount'      => 99.99,
    'currency'    => 'EUR',
    'description' => 'Recurring billing product #1'
}

begin
    status = client.resale_by_sale(resale_params)
rescue PayLane::ClientError => e
    # handle exceptions here
end

if client.success?
    puts "Success, id_second_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
12
13
14
15
16
17
18
resale_params = {
  'id_sale'     : id_first_sale,
  'amount'      : 99.99,
  'currency'    : 'EUR',
  'description' : 'Recurring billing product #1'
}

try:
    status = client.resale_by_sale(resale_params)
except Exception, e:
    # handle exceptions here

if client.is_success():
    print 'Success, second 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.resaleSale(idSale, 99.99, "EUR", "Recurring billing product #1", new Callback<FraudSaleResult>() {

    @Override
    public void onFinish(FraudSaleResult 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.
    }
});

Płatności cykliczne są po prostu ponownymi obciążeniami konta PayPal. Od Ciebie zależy, czy będą to odstępy tygodniowe, miesięczne, roczne czy inne; podobnie możesz wykonać resale np. dopiero, gdy klient osiągnie określoną kwotę do spłaty.