Logo blk

Guides rapides API PayPlug

[ .NET ]

Présentation

Installez la librairie

1- Téléchargez la librairie sur GitHub :

github.com/payplug/payplug-php

github.com/payplug/payplug-python

github.com/payplug/payplug-sharp

2- Ajoutez dans toutes vos pages utilisant l’API :

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

Authenfiez-vous

L’authentification à l’API s’effectue en utilisant une clé secrète dans toutes les requêtes envoyées.

Pour utiliser la clé, ajoutez-là dans toutes vos pages utilisant l’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";

Les clés à utiliser avec l’API commencent par “sk_”.
Elles sont disponibles dans le portail PayPlug en cliquant sur “Mon compte” puis sur “Accès API”.

Les modes TEST et LIVE utilisent le même endpoint, pour changer de mode à l’autre il suffit de changer la clé secrète.

Créer un paiement

Fonctionnement de la création d’un paiement

create a payment

  1. Créez le paiement et récupérez l’URL vers la page de paiement,
  2. Redirigez le client vers la page de paiement,
  3. PayPlug redirige votre client vers la page de retour sur votre site,
  4. PayPlug vous envoie une confirmation au travers de la notification (IPN).

Le paiement

L’exemple suivant permet de créer le paiement puis de rediriger directement votre client vers la page de paiement :

<?php
$email = 'john.watson@example.net';
$amount = 33;
$cust_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='.$cust_id,
    'cancel_url'     => 'https://example.net/cancel?id='.$cust_id
  ),
  'notification_url' => 'https://example.net/notifications?id='.$cust_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"];

Attention : tous les montants doivent être des entiers positifs en centime (1€ = 100 centimes).

La confirmation

Option 1 : Les notifications (IPN)

Lors de la création du paiement, vous pouvez spécifier une URL de notification (IPN) : notification_url. Si la transaction est payée ou en échec, une requête POST contenant l’objet correspondant au paiement sera envoyée à votre serveur.

<?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:
  # Gérer les erreurs ici
  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']
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);
}

L’URL de notification doit être accessible publiquement depuis Internet. Elle ne pourra pas fonctionner si vous êtes en local ou si la page est derrière un firewall ou un proxy.

La confirmation

Option 2 : Récupérer le détail d’un paiement

Si vous ne souhaitez pas utiliser les notifications (IPN), vous pouvez utiliser l’approche suivante :

payment notifications

Les étapes 1 à 3 sont identiques à celles décrites dans le premier schéma. Dans l’étape 4, faites un appel vers l’API utilisant l’ID du paiement récupéré lors de sa création :

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

Gérez les metadatas

Les metadatas permettent d’ajouter des informations complémentaires lors de la création d’un paiement ou d’un remboursement.

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

Vous pouvez ajouter 10 clés. Leur nom ne doit pas dépasser les 20 caractères et les données stockées 500 caractères.

Créer un remboursement

Fonctionnement de la création d’un remboursement

create a refund

  1. Créez le remboursement en utilisant l’ID du paiement à rembourser,
  2. PayPlug vous envoie une confirmation au travers de la notification (IPN).

Le remboursement

Option 1 : le remboursement complet

Pour créer un remboursement, vous devez disposer de l’ID du paiement que vous souhaitez rembourser.

L’exemple suivant permet de rembourser l’intégralité de la transaction :

<?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);

Le remboursement

Option 2 : le remboursement partiel

Si vous souhaitez ne pas rembourser l’intégralité de la transaction, l’exemple suivant permet d’effectuer un remboursement partiel :

<?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);

L’exemple ci-dessus comprend des metadata afin de faciliter le suivi du remboursement.

La confirmation

Option 1 : Les notifications (IPN)

Si lors de la création du paiement vous pouvez spécifié une URL de notification (IPN), lors de la création du remboursement une requête POST contenant l’objet correspondant au remboursement sera envoyée à votre serveur sur cette 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);
}

L’URL de notification doit être accessible publiquement depuis Internet. Elle ne pourra pas fonctionner si vous êtes en local ou si la page est derrière un firewall ou un proxy.

La confirmation

Option 2 : Récupérer le détail d’un paiement

Si vous ne souhaitez pas utiliser les notifications (IPN), vous pouvez utiliser l’approche suivante :

refund notifications

L’étape 1 est identique à celle décrite dans le premier schéma. Dans l’étape 2, faites un appel vers l’API utilisant l’ID du paiement et l’ID du remboursement :

<?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);

Gérez les metadatas

Les metadatas permettent d’ajouter des informations complémentaires lors de la création d’un paiement ou d’un remboursement.

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

Vous pouvez ajouter 10 clés. Leur nom ne doit pas dépasser les 20 caractères et les données stockées 500 caractères.

Utiliser la prise d'empreinte de carte

Fonctionnement de la prise d’empreinte

create payment

  1. Créez le paiement en utilisant save_card = true et récupérez l’URL vers la page de paiement,
  2. Redirigez le client vers la page de paiement,
  3. PayPlug redirige votre client vers la page de retour sur votre site,
  4. PayPlug vous envoie une confirmation contenant l’empreinte de la carte au travers de la notification (IPN).

Le paiement et la prise d’empreinte

L’exemple suivant permet de créer le paiement qui va permettre de procéder à la prise d’empreinte puis de rediriger directement votre client vers la page de paiement :

<?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);

Tous les montants doivent être des entiers positifs en centime (1€ = 100 centimes).

La confirmation

Lors de la création du paiement, vous pouvez spécifier une URL de notification (IPN) : notification_url. Si la transaction est payée ou en échec, une requête POST contenant l’objet correspondant au paiement sera envoyée à votre serveur.

<?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);
}

Dans l’objet contenu dans la notification (IPN) vous pouvez maintenant récupérer l’id de la carte, c’est ce dernier que vous devrez utiliser pour les prochains paiements. Nous vous recommandons de récupérer également la date d’expiration de la carte afin de prévoir de contrôler la validité de la carte avant de créer la prochaine transaction.

Le paiement avec un ID de carte

create payment with a card id

  1. Créez le paiement en utilisant payment_method
    et l’ID de la carte préalablement enregistré,
  2. PayPlug vous envoie une confirmation au travers de la notification (IPN).

Créez un paiement avec l’ID d’une carte

Maintenant que vous disposez de l’ID d’une carte, vous pouvez la débiter à nouveau sans avoir besoin de refaire passer votre client par une page de paiement :

<?php
$email = 'john.watson@example.net';
$amount = 33;
$cust_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='.$cust_id,
  'metadata'         => array(
      'customer_id'  => $cust_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);

Suite au paiement votre client recevra une confirmation par e-mail.

Les usages

La prise d’empreinte d’une carte permet de mettre en place les usages suivants :

Paiement en 1 clic

Permettez à vos acheteurs de payer sans avoir besoin de saisir à chaque fois ses coordonnées bancaires.

Paiement récurrent

Proposez la possibilité de souscrire à des abonnements récurrents sur votre site web.

Paiement en plusieurs fois

Offrez à vos clients de payer un montant en 3 ou 4 règlements sans frais (moins de 90 jours).

Pour le paiement récurrent et le paiement en plusieurs fois, vous devrez gérer les échéanciers au niveau de votre service.