1- Téléchargez la librairie sur GitHub :
github.com/payplug/payplug-php
github.com/payplug/payplug-python
2- Ajoutez dans toutes vos pages utilisant l’API :
<?php
require_once('PATH_TO_PAYPLUG/payplug_php/lib/init.php');
import payplug
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::init(array(
'secretKey' => 'sk_live_VOTRE_CLE_PRIVEE',
'apiVersion' => 'LA_VERSION_API',
));
payplug.set_secret_key('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 “Paramètres” puis sur “Clé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.
Consultez le changelog pour savoir quelle version d’API utiliser.
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',
'billing' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en'
),
'shipping' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en',
'delivery_type' => 'BILLING'
),
'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)
Attention : tous les montants doivent être des entiers positifs en centime (1€ = 100 centimes).
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 htmlentities($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']
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.
Si vous ne souhaitez pas utiliser les notifications (IPN), vous pouvez utiliser l’approche suivante :
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)
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.
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)
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)
L’exemple ci-dessus comprend des metadata afin de faciliter le suivi du remboursement.
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 htmlentities($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
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.
Si vous ne souhaitez pas utiliser les notifications (IPN), vous pouvez utiliser l’approche suivante :
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)
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.
sent_by
pour la méthode d’envoi; Un lien vers la page de paiement sera généré.Avec la demande de paiement, vous pouvez spécifier comment envoyer l’URL vers
la page de paiement à votre client :
Options | Expiration | Description |
---|---|---|
SMS | Envoyer un SMS à votre client avec l’URL de paiement. | |
Envoyer un e-mail à votre client avec l’URL de paiement. | ||
OTHER | Une URL de paiement sans expiration est générée. Vous devez gérer l’envoi de cette URL à votre client. | |
NULL | Une URL de paiement est générée et expire 15 minutes après ouverture. |
Le code suivant détaille l’exemple d’une demande de paiement envoyée automatiquement par e-mail
à votre client avec un lien 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',
'billing' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en'
),
'shipping' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en',
'delivery_type' => 'BILLING'
),
'hosted_payment' => array(
'return_url' => 'https://example.net/return?id='.$customer_id,
'cancel_url' => 'https://example.net/cancel?id='.$customer_id,
'sent_by' => 'EMAIL'
),
'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;
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',
'sent_by': 'EMAIL',
},
'notification_url': 'https://example.net/notifications?id=42710',
'metadata': {
'customer_id': 42710,
},
}
payment = payplug.Payment.create(**payment_data)
payment_id = str(payment.id)
NOTE: Tous les montants doivent être des entiers positifs
(1€ = 100 centimes).
Le code suivant détaille l’exemple d’une demande de paiement envoyée automatiquement par SMS
à votre client avec un lien vers la page de paiement.
<?php
$email = 'john.watson@example.net';
$phone_number = '+33600000000';
$amount = 33;
$customer_id = '42710';
$payment = \Payplug\Payment::create(array(
'amount' => $amount * 100,
'currency' => 'EUR',
'billing' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'mobile_phone_number' => $phone_number,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en'
),
'shipping' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'mobile_phone_number' => $phone_number,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en'
'delivery_type' => 'BILLING'
),
'hosted_payment' => array(
'return_url' => 'https://example.net/return?id='.$customer_id,
'cancel_url' => 'https://example.net/cancel?id='.$customer_id,
'sent_by' => 'SMS'
),
'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;
payment_data = {
'amount': 3300,
'currency': 'EUR',
'customer': {
'email': 'john.watson@example.net',
'phone_number':'+33600000000',
},
'hosted_payment': {
'return_url': 'https://example.net/return?id=42710',
'cancel_url': 'https://example.net/cancel?id=42710',
'sent_by': 'SMS',
},
'notification_url': 'https://example.net/notifications?id=42710',
'metadata': {
'customer_id': 42710,
},
}
payment = payplug.Payment.create(**payment_data)
payment_id = str(payment.id)
NOTE: Pour envoyer un SMS, la variable phone_number
doit être renseignée.
La demande de paiement est compatible avec une grande majorité des fonctionnalités de l’API.
save_card = true
et récupérez l’URL vers la page de paiement,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,
'billing' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en'
),
'shipping' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en',
'delivery_type' => 'BILLING'
),
'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)
Tous les montants doivent être des entiers positifs en centime (1€ = 100 centimes).
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 htmlentities($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
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.
payment_method
Maintenant que vous disposez de l’ID d’une carte, vous pouvez la débiter à nouveau sans avoir besoin de nécessairement refaire passer votre client par une page de paiement :
<?php
$email = 'john.watson@example.net';
$amount = 33;
$customer_id = '42710';
$card_id = 'card_e7133426b8de947b37161dfba1897dd1';
$initiator = 'PAYER';
$payment = \Payplug\Payment::create(array(
'amount' => $amount * 100,
'currency' => 'EUR',
'payment_method' => $card_id,
'initiator' => $initiator,
'billing' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en'
),
'shipping' => array(
'title' => 'mr',
'first_name' => 'John',
'last_name' => 'Watson',
'email' => $email,
'address1' => '221B Baker Street',
'postcode' => 'NW16XE',
'city' => 'London',
'country' => 'GB',
'language' => 'en',
'delivery_type' => 'BILLING'
),
'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)
Une fois que le paiement est créé, il faut ensuite gérer la réponse comme indiqué dans la slide suivante.
L’objet paiement contient de nombreuses variables nécessaires pour procéder au paiement, en particulier :
{
"id": "pay_5iHMDxy4ABR4YBVW4UscIn",
"amount": 1000,
"is_paid": true,
"authorization": null,
"failure": null,
"hosted_payment": {
"payment_url": "https://secure.payplug.com/pay/5iHMDxy4ABR4YBVW4UscIn",
"return_url": "https://example.net/success?id=42",
"cancel_url": "https://example.net/cancel?id=42",
"paid_at": 1434010827,
"sent_by": null
},
[...]
}
Ensuite, votre intégration devra gérer le paiement comme suit :
is_paid
est true
, alors vous pouvez considérer le paiement comme payé ;authorization
et authorized_at
sont présents et remplis, l’authorisation a bien été réalisée ;failure
est remplis, le paiement a donc échoué pour la raison indiquée ;hosted_payment.payment_url
pour compléter le paiement.Suite au paiement votre client recevra une confirmation par e-mail.
La prise d’empreinte d’une carte permet de mettre en place les usages suivants :
Permettez à vos acheteurs de payer sans avoir besoin de saisir à chaque fois ses coordonnées bancaires.
Proposez la possibilité de souscrire à des abonnements récurrents sur votre site web.
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.
Les données utilisées pour afficher la pop-in Oney peuvent être récupérées via la route de simulation de paiement Oney.
L’exemple suivant permet d’effectuer une requête de simulation de paiement Oney.
<?php
$simulations = \Payplug\OneySimulation::getSimulations(array(
'amount' => 17266,
'country' => 'FR',
'operations' => ['x3_with_fees', 'x4_with_fees']
));
data = {
'amount': 17266,
'country': 'FR',
'operations': ['x3_with_fees', 'x4_with_fees']
}
simulations = payplug.OneyPaymentSimulation.get_simulation(**data)
Les données peuvent être utilisées pour afficher la pop-in.
{
"result": true,
"simulations": {
"x3_with_fees": {...},
"x4_with_fees": {
"installments": [
{
"date": "2021-01-22T01:00:00.000Z",
"amount": 4316
},
{
"date": "2021-02-22T01:00:00.000Z",
"amount": 4316
},
{
"date": "2021-03-22T01:00:00.000Z",
"amount": 4317
}
],
"total_cost": 380,
"nominal_annual_percentage_rate": 18.05,
"effective_annual_percentage_rate": 19.62,
"down_payment_amount": 4697
}
}
}
Pop-in | Data |
---|---|
Pour un montant de | amount envoyé en tant que donnée de la requête |
Premier apport | down_payment_amount |
Coût du financement | total_cost |
TAEG | effective_annual_percentage_rate |
Mensualité n°1 | installments[0]['amount'] |
Mensualité n°2 | installments[1]['amount'] |
Mensualité n°3 | installments[2]['amount'] |
Total | down_payment_amount + installments[0]['amount'] + installments[1]['amount'] + installments[2]['amount'] |