Logo blk

PayPlug API Quick guides

[ PHP ]

Overview

Installing the Library

1- Download the library on GitHub:

github.com/payplug/payplug-php

github.com/payplug/payplug-python

github.com/payplug/payplug-sharp

2- Add to all your pages that use the API:

<?php
require_once('PATH_TO_PAYPLUG/payplug_php/lib/init.php');
import payplug
using Payplug;

Authentication

Verify your identity when communicating with the API by providing a secret key in all your requests.

To submit your credentials, include your key in all pages that use the API:

<?php
\Payplug\Payplug::setSecretKey('sk_live_VOTRE_CLE_PRIVEE');
payplug.set_secret_key('sk_live_VOTRE_CLE_PRIVEE')
Configuration.SecretKey = "sk_live_VOTRE_CLE_PRIVEE";

API keys start with “sk_”.
They are available in My account, then API Credentials in the PayPlug portal.

Access LIVE and TEST modes using the same endpoint. To switch between modes, simply provide the related secret key to the mode you wish to access.

Create a payment

The payment creation process

create a payment

  1. Create the payment; a link to a payment page will be generated.
  2. Redirect the customer to the payment page.
  3. After entering card details, your customer is automatically redirected to the return page on your site.
  4. PayPlug sends you a confirmation via IPN (Instant Payment Notification).

Creating a payment

The following code shows an example of a payment request that automatically redirects your client to the payment page:

<?php
$email = 'john.watson@example.net';
$amount = 33;
$customer_id = '42710';

$payment = \Payplug\Payment::create(array(
  'amount'           => $amount * 100,
  'currency'         => 'EUR',
  'customer'         => array(
    'email'          => $email
  ),
  'hosted_payment'   => array(
    'return_url'     => 'https://example.net/return?id='.$customer_id,
    'cancel_url'     => 'https://example.net/cancel?id='.$customer_id
  ),
  'notification_url' => 'https://example.net/notifications?id='.$customer_id,
  'metadata'         => array(
    'customer_id'    => $customer_id
    )
));

$payment_url = $payment->hosted_payment->payment_url;
$payment_id = $payment->id;
header('Location:' . $payment_url);
payment_data = {
  'amount': 3300,
  'currency': 'EUR',
  'customer': {
    'email': 'john.watson@example.net'
  },
  'hosted_payment': {
    'return_url': 'https://example.net/return?id=42710',
    'cancel_url': 'https://example.net/cancel?id=42710',
  },
  'notification_url': 'https://example.net/notifications?id=42710',
  'metadata': {
    'customer_id': 42710,
  },
}
payment = payplug.Payment.create(**payment_data)
payment_id = str(payment.id)
var paymentData = new Dictionary<string, dynamic>
{
  {"amount", 3300},
  {"currency", "EUR"},
  {"customer", new Dictionary<string, object>
    {
      {"email", "john.watson@example.net"}
    }
  },
  {"hosted_payment", new Dictionary<string, object>
    {
      {"return_url", "https://example.net/return?id=42710"},
      {"cancel_url", "https://example.net/cancel?id=42710"}
    }
  },
  {"notification_url", "https://example.net/notifications?id=42710"},
  {"metadata", new Dictionary<string, object>
    {
      {"customer_id", "42710"}
    }
  }
};
var payment = Payment.Create(paymentData);
var payment_id = payment["id"];

IMPORTANT: Please note that all amounts must be expressed in centimes as positive whole numbers (1€ = 100 centimes).

Confirmation

Option 1: Instant Payment Notification (IPN)

When creating a payment, you can specify a notification URL for use with IPN: notification_url. Whether the payment is successful or is fails, a POST query containing an object corresponding to the payment will be sent to your server.

<?php
$input = file_get_contents('php://input');
try {
  $resource = \Payplug\Notification::treat($input);
  if ($resource instanceof \Payplug\Resource\Payment
    && $resource->is_paid) {
    $payment_id = $resource->id;
    $payment_state = $resource->is_paid;
    $payment_date = $resource->hosted_payment->paid_at;
    $payment_amount = $resource->amount;
    $payment_data = $resource->metadata[customer_id];
  }
}
catch (\Payplug\Exception\PayplugException $exception) {
    echo $exception;
}
request_body = request.body
try:
  resource = payplug.notifications.treat(request_body)
except payplug.exceptions.PayplugError:
  pass
else:
  if resource.object == 'payment' and resource.is_paid:
    payment_id = str(resource.id)
    payment_state = str(resource.is_paid)
    payment_date = datetime.datetime.fromtimestamp(resource.hosted_payment.paid_at).strftime('%d/%m/%Y %H:%M:%S')
    payment_amount = str(resource.amount)
    payment_data = resource.metadata['customer_id']
    pass
using Payplug.Exceptions;

string json = new StreamReader(request.InputStream).ReadToEnd();
try
{
  var payment = Notification.Treat(json);
  if (payment["object"] == "payment" && payment["is_paid"])
  {
    var payment_id = payment["id"];
    var payment_state = payment["is_paid"];
    var payment_date = DateTimeOffset.FromUnixTimeSeconds(payment["hosted_payment"]["paid_at"]).DateTime;
    var payment_amount = payment["amount"];
    var payment_data = payment["metadata"]["customer_id"];
  }
}
catch (InvalidApiResourceException $e)
{
   Console.WriteLine($e);
}

The notification URL must be publicly accessible via the internet. It will not work if you are operating offline or if the page is protected with a firewall or proxy.

Confirmation

Option 2: Extracting payment details

If you prefer not to use IPN, you may use the following method to extract payment details:

payment notifications

Steps one to three are the same as in the first diagram. In step four, make an API call using the payment ID that was generated when the payment was created:

<?php
$payment = \Payplug\Payment::retrieve($payment_id);
payment = payplug.Payment.retrieve(payment_id)
var payment = Payment.Retrieve(payment_id);

Managing metadata

Metadata allow you to include additional information when processing payments or refunds.

{
  "metadata": {
    "transaction_id": "tsct_201506023456",
    "customer_id": 58790,
    "product_id": "ts_blk_00234",
    "shipping": "The delivery was delayed"
  }
}

You can add up to ten keys. Names cannot exceed twenty (20) characters, and stored content cannot exceed five hundred (500) characters.

Refund a payment

The refund creation process

create a refund

  1. Create a refund using the payment ID of the payment you wish to refund.
  2. PayPlug sends you a confirmation via IPN (instant payment notification).

Processing a refund

Option 1: Full refunds

In order to process a refund, you will need the payment ID of the payment you wish to refund.

The following code shows an example of a full refund:

<?php
$payment_id = 'pay_5iHMDxy4ABR4YBVW4UscIn';
$refund = \Payplug\Refund::create($payment_id);
payment_id = 'pay_5iHMDxy4ABR4YBVW4UscIn'
refund = payplug.Refund.create(payment_id)
var paymentId = "pay_5iHMDxy4ABR4YBVW4UscIn";
var refund = Refund.Create(paymentId);

Processing a refund

Option 2: Partial refunds

If you only need to refund a portion of the payment, the following in an example of a partial refund:

<?php
$payment_id = 'pay_5iHMDxy4ABR4YBVW4UscIn';
$data = array(
  'amount' => 358,
  'metadata'          => array(
      'customer_id'       => 42710,
      'reason'            => 'The delivery was delayed'
    )
  );
$refund = \Payplug\Refund::create($payment_id, $data);
payment_id = 'pay_5iHMDxy4ABR4YBVW4UscIn'
refund_data = {
  'amount': 358,
  'metadata': {
    'customer_id': 42710,
    'reason': 'The delivery was delayed',
  },
}
refund = payplug.Refund.create(payment_id, **refund_data)
var paymentId = "pay_5iHMDxy4ABR4YBVW4UscIn";
var refundData = new Dictionary<string, dynamic>
{
  {"amount", 3300},
  {"metadata", new Dictionary<string, dynamic>
    {    
      {"customer_id", 42710},
      {"reason", "The delivery was delayed"}
    }
  }
};
var refund = Refund.Create(paymentId, refundData);

The example above includes metadata useful in tracking the refund.

Confirmation

Option 1: Instant Payment Notification (IPN)

If you specified a notification URL for use with IPN when the payment was created, after the refund is processed, a POST query containing an object corresponding to the refund will be sent to your server using the provided URL.

<?php
$input = file_get_contents('php://input');
try {
  $resource = \Payplug\Notification::treat($input);

  if ($resource->object == "refund")) {
    $refund_id = $resource->id;
    $payment_id = $resource->payment_id;
    $refund_date = $resource->created_at;
    $refund_amount = $resource->amount;
    $refund_data = $resource->metadata[reason];
  }
}
catch (\Payplug\Exception\PayplugException $exception) {
  echo $exception;
}
request_body = request.body
try:
  resource = payplug.notifications.treat(request_body)
except payplug.exceptions.PayplugError:
  pass
else:
  if resource.object == 'refund':
    refund_id = str(resource.id)
    payment_id = str(resource.payment_id)
    refund_date = datetime.datetime.fromtimestamp(resource.created_at).strftime('%d/%m/%Y %H:%M:%S')
    refund_amount = str(resource.amount)
    refund_data = resource.metadata['reason']
    pass
using Payplug.Exceptions;

string json = new StreamReader(request.InputStream).ReadToEnd();
try
{
  var payment = Notification.Treat(json);
  if (payment["object"] == "refund")
  {
    var refund_id = payment["id"];
    var payment_id = payment["payment_id"];
    var refund_date = DateTimeOffset.FromUnixTimeSeconds(payment["created_at"]).DateTime;
    var refund_amount = payment["amount"];
    var refund_data = payment["metadata"]["reason"];
  }
}
catch (InvalidApiResourceException $e)
{
  Console.WriteLine($e);
}

The notification URL must be publicly accessible via the internet.
It will not work if you are operating offline or if the page is protected with a firewall or proxy.

Confirmation

Option 2: Extracting payment details

If you prefer not to use IPN, you may use the following method to extract payment details:

refund notifications

Step one is the same as in the first diagram.
In step two, make an API call using the payment ID and the refund ID:

<?php
$paymentId  = 'pay_5iHMDxy4ABR4YBVW4UscIn';
$refundId   = 're_3NxGqPfSGMHQgLSZH0Mv3B';
$refund = \Payplug\Refund::retrieve($paymentId, $refundId);
payment_id = 'pay_5iHMDxy4ABR4YBVW4UscIn'
refund_id = 're_3NxGqPfSGMHQgLSZH0Mv3B'
refund = payplug.Refund.retrieve(payment_id, refund_id)
var paymentId = "pay_5iHMDxy4ABR4YBVW4UscIn";
var refundId = "re_3NxGqPfSGMHQgLSZH0Mv3B";
var refund = Refund.Retrieve(paymentId, refundId);

Managing metadata

Metadata allow you to include additional information when processing payments or refunds.

{
  "metadata": {
    "transaction_id": "tsct_201506023456",
    "customer_id": 58790,
    "product_id": "ts_blk_00234",
    "shipping": "The delivery was delayed"
  }
}

You can add up to ten keys. Names cannot exceed twenty (20) characters,
and stored content cannot exceed five hundred (500) characters.

Save a card

Using the “save card” feature

create a payment

  1. Create the payment using save_card = true; a link to a payment page will be generated.
  2. Redirect the customer to the payment page.
  3. After entering card details, your customer is automatically redirected to the previously-indicated return page on your site.
  4. PayPlug sends you a confirmation including the secure card ID via IPN (Instant Payment Notification).

Combining the “save card” with a payment

The following is an example of a payment with the “save card” feature that automatically redirects your client to the payment page:

<?php
$email = 'john.watson@example.net';
$amount = 33;
$customer_id = '42710';

$payment = \Payplug\Payment::create(array(
  'amount'           => $amount * 100,
  'currency'         => 'EUR',
  'save_card'        => true,
  'customer'         => array(
    'email'          => $email
  ),
  'hosted_payment'   => array(
    'return_url'     => 'https://example.net/success?id='.$customer_id,
    'cancel_url'     => 'https://example.net/cancel?id='.$customer_id
  ),
  'notification_url' => 'https://example.net/notifications?id='.$customer_id,
  'metadata'         => array(
    'customer_id'    => $customer_id
  )
));
payment_data = {
  'amount': 3300,
  'currency': 'EUR',
  'save_card': True,
  'customer': {
    'email': 'john.watson@example.net'
  },
  'hosted_payment': {
    'return_url': 'https://example.net/success?id=42710',
    'cancel_url': 'https://example.net/cancel?id=42710',
  },
  'notification_url': 'https://example.net/notifications?id=42710',
  'metadata': {
    'customer_id': 42710,
  },
}
payment = payplug.Payment.create(**payment_data)
var paymentData = new Dictionary<string, dynamic>
{
  {"amount", 3300},
  {"currency", "EUR"},
  {"save_card", true},
  {"customer", new Dictionary<string, object>
    {
      {"email", "john.watson@example.net"}
    }
  },
  {"hosted_payment", new Dictionary<string, object>
    {
      {"return_url", "https://example.net/success?id=42710"},
      {"cancel_url", "https://example.net/cancel?id=42710"}
    }
  },
  {"notification_url", "https://example.net/notifications?id=42710"},
  {"metadata", new Dictionary<string, object>
    {
      {"customer_id", "42710"}
    }
  }

};
var payment = Payment.Create(paymentData);

All amounts must be expressed in centimes as positive whole numbers (1€ = 100 centimes).

Confirmation

When creating a payment, you can specify a notification URL for use with IPN: notification_url. Whether the payment is successful or fails, a POST query containing an object corresponding to the payment will be sent to your server.

<?php
$input = file_get_contents('php://input');
try {
  $resource = \Payplug\Notification::treat($input);
  if ($resource instanceof \Payplug\Resource\Payment && $resource->is_paid) {
    $payment_id = $resource->id;
    $payment_state = $resource->is_paid,true;
    $payment_date = $resource->hosted_payment->paid_at;
    $payment_amount = $resource->amount;
    if ($resource->save_card == true) {
      $card_id = $resource->card->id;
      $card_exp_month = $resource->card->exp_month;
      $card_exp_year = $resource->card->exp_year;
    }
    $payment_data = $resource->metadata[customer_id];
  }
}
catch (\Payplug\Exception\PayplugException $exception) {
    echo $exception;
}
request_body = request.body
try:
  resource = payplug.notifications.treat(request_body)
except payplug.exceptions.PayplugError:
  pass
else:
  if resource.object == 'payment' and resource.is_paid:
    payment_id = str(resource.id)
    payment_state = str(resource.is_paid)
    payment_date = datetime.datetime.fromtimestamp(resource.hosted_payment.paid_at).strftime('%d/%m/%Y %H:%M:%S')
    payment_amount = str(resource.amount)
    if resource.save_card == True
      card_id = str(resource.card.id)
      card_exp_month = str(resource.card.exp_month)
      card_exp_year = str(resource.card.exp_year)
      pass
    payment_data = resource.metadata['customer_id']
    pass
using Payplug.Exceptions;

string json = new StreamReader(request.InputStream).ReadToEnd();
try
{
  var payment = Notification.Treat(json);
  if (payment["object"] == "payment" && payment["is_paid"])
  {
    var payment_id = payment["id"];
    var payment_state = payment["is_paid"];
    var payment_date = DateTimeOffset.FromUnixTimeSeconds(payment["hosted_payment"]["paid_at"]).DateTime;
    var payment_amount = payment["amount"];
    if (payment["save_card"]) == true)
    {
      var card_id = payment["card"]["id"];
      var card_exp_month = payment["card"]["exp_month"];
      var card_exp_year = payment["card"]["exp_year"];
    }
    var payment_data = payment["metadata"]["customer_id"];
  }
}
catch (InvalidApiResourceException e)
{
  Console.WriteLine(e);
}

You may now extract the card ID from the object in the IPN. This is what you will use to initiate future transactions. We recommend that you also document the card’s expiration date in order to verify that the card is still valid before attempting future payments.

Payments using a card ID

create a payment with a card id

  1. Create the payment using payment_method and the previously saved card ID.
  2. PayPlug sends you a confirmation via IPN.

Processing a payment using a card ID

Now that you have a card ID, you can initiate new payments without sending your customer to a payment page:

<?php
$email = 'john.watson@example.net';
$amount = 33;
$customer_id = '42710';
$card_id = 'card_e7133426b8de947b37161dfba1897dd1';

$payment = \Payplug\Payment::create(array(
  'amount'            => $amount * 100,
  'currency'          => 'EUR',
  'payment_method'    => $card_id,
  'customer'          => array(
      'email'             => $email
  ),
  'notification_url'  => 'https://example.net/notifications?id='.$customer_id,
  'metadata'          => array(
      'customer_id'       => $customer_id
));
payment_data = {
  'amount': 1000,
  'currency': 'EUR',
  'payment_method': 'card_e7133426b8de947b37161dfba1897dd1',
  'customer': {
    'email': 'john.watson@example.net'
  },
  'notification_url': 'https://example.net/notifications?id=42710',
  'metadata': {
    'customer_id': 42710,
  },
}
payment = payplug.Payment.create(**payment_data)
var paymentData = new Dictionary<string, dynamic>
{
  {"amount", 1000},
  {"currency", "EUR"},
  {"payment_method", "card_e7133426b8de947b37161dfba1897dd1"},
  {"customer", new Dictionary<string, object>
    {
      {"email", "john.watson@example.net"}
    }
  },

  {"notification_url", "https://example.net/notifications?id=42710"},
  {"metadata", new Dictionary<string, object>
    {
      {"customer_id", "42710"}
    }
  }
};
var payment = Payment.Create(paymentData);

Your customer will receive a confirmation email after each new transaction.

Advantages

The ‘save card’ feature makes the following payment options possible:

1-click ordering

Customers can pay securely without typing in their card details for every purchase.

Recurring payments

Customers can subscribe to services on your site using recurring payments.

Instalments

Customers can pay in three or four interest-free instalments (within a maximum 90-day period).

Please note that recurring payments and instalments are not automated; you will need to manage the payment schedules internally.