Read all the blue sections to better understand the documentation and the orange sections signifying the alert so avoid mistakes to be made during integrations and detailed integration procedures.
API keys are your digital references towards PayDunya systems. We use them to identify your account and the applications you will create. These keys are necessary for any integration of the APIs of PayDunya's payments APIs. Here are the steps to follow:
First you need have a PayDunya Business account activated. Create one if it is not yet the case.
Login to your account and click on Integration API at the menu level on the left.
Click on the button Set up a new application and fill out the form.
Choose Test mode, I want to make payment tests
and
Enable production mode
.
pip install paydunya
git clone https://github.com/paydunyadev/paydunya-python-master.git
cd paydunya-python-master
python setup.py install
Login to your account and click on Intégration API at the menu level left then on details
aAt the level of the application you have created, retrieve the API keys and give them as arguments to the following methods
import paydunya
PAYDUNYA_ACCESS_TOKENS = {
'PAYDUNYA-MASTER-KEY': "wQzk9ZwR-Qq9m-0hD0-zpud-je5coGC3FHKW",
'PAYDUNYA-PRIVATE-KEY': "test_private_rMIdJM3PLLhLjyArx9tF3VURAF5",
'PAYDUNYA-TOKEN': "IivOiOxGJuWhc5znlIiK"
}
# Activate the 'test' mode. Debug is False by default
paydunya.debug = True
# Configure API Keys
paydunya.api_keys = PAYDUNYA_ACCESS_TOKENS
If you are in test use the test keys otherwise use the production keys and specify the mode by replacing "test"
with "live"
in the code above.
For more details on the transition to production click here.
You can configure your service/activity/company information as shown below. PayDunya uses these settings to configure the information that will appear on the payment page, PDF invoices, and printed receipts.
from paydunya import Store
# Configuring your service/company information
infos = {
'name': "Sandra's Store", # Only the name is required
'tagline': "Elegance is priceless,"
'postal_address': "Dakar Plateau - Establishment kheweul",
'phone_number': "336530583",
'website_url': "http://www.chez-sandra.sn",
'logo_url': "http://www.chez-sandra.sn/logo.png"
}
store = Store(**infos)
The IPN is the URL of the file on which you want to receive payment transaction information for possible backoffice processing. PayDunya uses this URL to send you information about the payment transaction instantly by POST
.
There are two ways to set up the Instant Payment Notification URL: either by going to your PayDunya account at the level of your app's configuration information or directly in your code.
Using the second option offers you the two possibilities below.
This instruction should be included in the configuration of your service/activity.
invoice.callback_url = "http://www.ma-super-boutique.com/fichier_de_reception_des_données_de_facturation"
This configuration will overwrite the global redistribution settings if they have already been defined.
invoice.callback_url = "http://www.ma-super-boutique.com/fichier_de_reception_des_données_de_facturation"
The successful validation of the payment transaction returns the structure below containing the customer information, the URL of its PayDunya invoice in PDF format and also a hash to verify that the received data come from our servers.
array (
'data' =>
array (
'response_code' => '00',
'response_text' => 'Transaction Found',
'hash' => '8c6666a27fe5daeb76dae6abc7308a557dca5be1bda85dfe5d81fa330cdc0bc3c4b37765fe5d2cc36aa2ba0f9284226a80f5488d14740fa70769d6079a179406',
'invoice' =>
array (
'token' => 'test_jkEdPY8SuG',
'items' =>
array (
'item_0' =>
array (
'name' => 'Chaussures Croco',
'quantity' => '3',
'unit_price' => '10000',
'total_price' => '30000',
'description' => 'Chaussures faites en peau de crocrodile authentique qui chasse la pauvreté',
),
'item_1' =>
array (
'name' => 'Chemise Glacée',
'quantity' => '1',
'unit_price' => '5000',
'total_price' => '5000',
'description' => '',
),
),
'taxes' =>
array (
'tax_0' =>
array (
'name' => 'TVA (18%)',
'amount' => '6300',
),
'tax_1' =>
array (
'name' => 'Livraison',
'amount' => '1000',
),
),
'token': 'test_Jh2T8skw1j',
'total_amount' => '42300',
'description' => 'Paiement de 42300 FCFA pour article(s) achetés sur Magasin le Choco',
),
'custom_data' =>
array (
'categorie' => 'Jeu concours',
'periode' => 'Noël 2015',
'numero_gagnant' => '5',
'prix' => 'Bon de réduction de 50%',
),
'actions' =>
array (
'cancel_url' => 'http://magasin-le-choco.com/cancel_url.aspx',
'callback_url' => 'http://magasin-le-choco.com/callback_url.aspx',
'return_url' => 'http://magasin-le-choco.com/return_url.aspx',
),
'mode' => 'test',
'status' => 'completed',
'customer' =>
array (
'name' => 'Alioune Faye',
'phone' => '774563209',
'email' => '[email protected]',
),
'receipt_url' => 'https://paydunya.com/sandbox-checkout/receipt/pdf/test_jkEdPY8SuG.pdf',
),
)
The hash returned by PayDunya is the hash of your MasterKey. This hash will allow you to make sure that the data you have received comes from our servers. The algorithm used to obtain the hash is SHA-512
. In the expected response, a failure message is entered in the fail_reason
node only for failed
or canceled bank card transactions
.
PayDunya Make a Post request of type application/x-www-form-urlencoded
on your callback endpoint and post a data table containing the payment information. You must use the "data"
key before recovering a node. The returned structure is located under the index "data"
.
For example to recover the payment status, the customer name and the hash, here is the code to execute:
# If you use Django or Flask
status = request.POST['data']['status']
# If you use Django or Flask
amount = request.POST['data']['invoice']['total_amount']
# If you use Django or Flask
hash = request.POST['data']['hash']
The hash returned by PayDunya is the hash of your MasterKey. This hash will allow you to make sure that the data you have received comes from our servers.
Hashez your main key and compare the result to the hash received by IPN.
import hashlib
try:
#Take your MasterKey, hash it and compare the result to the received hash by IPN
if(request.POST['data']['hash'] == hashlib.sha512(b"VOTRE_CLE_PRINCIPALE").hexdigest()):
if(request.POST['data']['status'] == "completed"):
# Faites vos traitements backoffice ici...
else:
puts "This request was not issued by PayDunya"
except:
# An error has occurred...
Never put your API keys in a file of your source code, instead use for example environment variables.
PayDunya's "Payment With Redistribution (PAR)" service allows you to create an invoice and redirect your customer to our platform so that it can complete the payment process. We recommend using the "Payment With Redistribution (PAR)" API because it is the most suitable in 99% of cases. The main advantage of this option is that customers can choose to pay from a variety of payment options available on our platform. In addition, if a new option is added in the future, it will appear directly on the payment page without you having to change anything in your source code.
# Do this if you want to redirect your customers to our website
# so that he can complete the payment process.
import paydunya
store = paydunya.Store(name='Sandra's Store')
invoice = paydunya.Invoice(store)
It is important to know that billing items are primarily used for presentation purposes on the payment page. PayDunya will not use any of the amounts declared to bill the customer. To do this, you must explicitly use the setTotalAmount
method of the API to specify the exact amount to bill the customer.
import paydunya
from paydunya import InvoiceItem, Store
store = Store(name='Sandra's Store')
# Adding items to your bill is very basic.
# The expected parameters are product name, quantity, unit price,
# the total price and a description.
items = [
InvoiceItem(
name="Croco shoes",
quantity=3,
unit_price="10000",
total_price="30000",
description="Shoes made of genuine crocodile skin that hunts poverty"
),
InvoiceItem(
name="Ice Shirt",
quantity=1,
unit_price="5000",
description="Nice shirt"
total_price="5000"
),
]
invoice = paydunya.Invoice(store)
invoice.add_items(items)
You can optionally define a general invoice description that will be used in cases where you need to include additional information in your invoice.
invoice.description = "Optional Description"
PayDunya expects you to specify the total amount of the customer's bill. This will be the amount that will be billed to your client. We consider that you have already done all calculations at your server before setting this amount. For your convenience, a calculate_total_amt
method that calculates the total invoice amount from the total amount of each invoice item is present at the Invoice
level.
PayDunya will not perform calculations on its servers. The total amount of the invoice set from your server will be the one that PayDunya will use to bill your customer.
invoice.total_amount = 42300
After adding items to your invoice and configuring the total invoice amount, you can redirect your customer to the payment page by calling the create
method from your invoice object invoice
. Please note that the invoice.create()
method returns a boolean (true or false) depending on whether the invoice was successfully created or not. This allows you to put an if - else
statement and handle the result as you see fit.
# The following code describes how to create a payment invoice at our servers,
# and do what you want if successful.
successful, response = invoice.create()
if successful:
# Do something with the response variable
This option is very interesting if you want to create your own payment solution over PayDunya or if you have to pay a certain percentage for each sale (in the case of a marketplace for example). The money is redistributed on the various PayDunya accounts of the recipients and the service is not invoiced.
You can transfer funds to other PayDunya customer accounts from your account via the Payment and Redistribution (PER) API. For security reasons, you must explicitly enable the Payment and Redistribution (PER) option in your integration/application configuration by going to your PayDunya account. You can always enable or disable the Payment and Redistribution (PER) service by updating the configuration of your integration/application by going to your PayDunya account.
account_alias = "EMAIL_OU_NUMERO_DU_CLIENT_PAYDUNYA"
amount = 6500
direct_pay = paydunya.DirectPay(account_alias, amount)
successful, response = direct_pay.process()
if successful:
# Do something with the response variable
You can add tax information on the payment page. This information will then be displayed on the payment page, PDF invoices and printed receipts, electronic receipts.
# The parameters are the name of the tax and the amount of the tax.
invoice.add_taxes([("TVA (18%)", 6300), ("Livraison", 1000)])
If you need to add additional data to your payment request information for future use, we offer you the option of backing up custom data on our servers and recovering it once the payment is successful.
Custom data is not displayed anywhere on the checkout page, invoices/receipts, downloads, and impressions. They are only retrieved using our confirm
callback action at the API level.
# Custom data allows you to add additional data to your billing information
# that can be retrieved later using our callback Confirm action
invoice.add_custom_data([
("category", "Competition"),
("period", "Christmas 2015"),
("number_gagnant", 5),
("price", "50% discount coupon"),
])
By default, the payment methods activated in your integration configuration will all be displayed on the payment page for all your invoices.
However, if you want to keep the list of payment methods to display on the payment page of a given invoice, we offer you the possibility to do so using the methods addChannel
and addChannels
.
To obtain the names of the operators to assign as values to the channels key, please consult this link which lists the different operators available.
# Addition of means of payment individually
invoice.add_channel('free-money-senegal')
invoice.add_channel('card')
# Ajout de plusieurs moyens de paiement à la fois
invoice.add_channels(['card', 'wave-senegal', 'orange-money-senegal'])
You can optionally define a URL to which your customers will be redirected after an order cancellation.
invoice.cancel_url = "http://magasin-le-choco.com/cancel_url"
PayDunya does a great job of managing downloads and receipt printing of payments after your customer has successfully paid for their order. However, there may be cases where you would want to redirect your customers to another URL after they have successfully paid for their order. The configuration below meets this need.
PayDunya will add ?token=invoice_token
to your URL. We will explain how to use this token in the next chapter.
invoice.return_url = "http://magasin-le-choco.com/return_url"
Our API allows you to check the status of all payment transactions using the invoice token. You can therefore keep your invoice token and use it to check the payment status of the invoice. The status of an invoice can be either pending (pending)
, canceled (canceled)
, or completed (completed)
depending on if yes or not the customer has paid the bill.
However, this option is suitable for PAR payments as it would allow you for example to know the payment status of your bill even if the customer is still on our payment page.
# PayDunya will automatically add the invoice token as a QUERYSTRING "token"
# if you have configured a "return_url" ou "cancel_url".
# Get the token via the QUERYSTRING if you use Django or Flask.
token = request.GET.get('token') # Example here with Django
successful, response = invoice.confirm(token)
if successful:
# Do something with the response variable