3939
4040Before starting, ensure you have:
4141- ** Python 3.7+** installed on your system
42- - A ** CinetPay merchant account** (sign up at [ CinetPay.com ] ( https://cinetpay.com ) )
42+ - A ** CinetPay merchant account** (sign up at [ CinetPay Registration ] ( https://app-new. cinetpay.com/register ) )
4343- Your ** API credentials** from CinetPay dashboard
4444- A ** text editor** or IDE (VS Code, PyCharm, etc.)
4545
@@ -55,8 +55,8 @@ pip install easyswitch
5555
5656### Step 3: Get Your CinetPay Credentials
5757
58- 1 . ** Login to CinetPay Dashboard **
59- - Go to [ CinetPay Dashboard ] ( https://dashboard .cinetpay.com )
58+ 1 . ** Login to CinetPay Merchant Portal **
59+ - Go to [ CinetPay Merchant Portal ] ( https://app-new .cinetpay.com )
6060 - Navigate to ** Settings** → ** API Keys**
6161
62622 . ** Copy Your Credentials**
@@ -67,7 +67,7 @@ pip install easyswitch
6767 ```
6868
69693 . ** Create Webhook Endpoint**
70- - In dashboard , go to ** Webhooks**
70+ - In merchant portal , go to ** Webhooks**
7171 - Add your webhook URL: ` https://yoursite.com/webhook/cinetpay `
7272
7373### Step 4: Environment Setup
@@ -252,13 +252,13 @@ Once testing is complete:
252252### Getting Your CinetPay Credentials
253253
254254** Step 1: Create CinetPay Account**
255- 1 . Visit [ CinetPay.com ] ( https://cinetpay.com ) and click "Sign Up"
255+ 1 . Visit [ CinetPay Merchant Registration ] ( https://app-new. cinetpay.com/register ) to create your account
2562562 . Choose "Merchant Account" for business use
2572573 . Complete KYC verification process
2582584 . Wait for account approval (usually 24-48 hours)
259259
260260** Step 2: Access Your Dashboard**
261- 1 . Login to [ CinetPay Dashboard ] ( https://dashboard .cinetpay.com )
261+ 1 . Login to [ CinetPay Merchant Portal ] ( https://app-new .cinetpay.com )
2622622 . Navigate to ** Settings** → ** API Integration**
2632633 . Copy your credentials (keep them secure!)
264264
@@ -317,9 +317,9 @@ set CINETPAY_ENVIRONMENT=sandbox
317317
318318| Channel | Code | Countries | Description |
319319| ---------------| -----------------| --------------------| -------------------------------|
320- | Mobile Money | ` MOBILE_MONEY ` | CI, SN, ML, BF, NE | Orange Money, MTN, Moov, Wave |
321- | Bank Cards | ` CARD ` | All | Visa, Mastercard, local bank cards |
322- | Bank Transfer | ` BANK_TRANSFER ` | CI, SN | Direct bank-to-bank transfers |
320+ | Mobile Money | ` MOBILE_MONEY ` | CI, SN, ML, BF, NE, CM, TD, CF, CD, GN | Orange Money, MTN, Moov, Wave |
321+ | Bank Cards | ` CREDIT_CARD ` | Excludes GN, CD | Visa, Mastercard, local bank cards (not available for GNF/CDF) |
322+ | Wallet | ` WALLET ` | Various | Electronic wallets |
323323| All Methods | ` ALL ` | All | Let customer choose payment method |
324324
325325### Multiple Initialization Methods
@@ -500,8 +500,8 @@ CinetPay follows a **redirect-based payment flow** where customers are redirecte
500500
501501| Currency | Code | Countries | Minimum Amount |
502502| ----------| ------| -----------| ----------------|
503- | West African CFA Franc | XOF | Côte d'Ivoire, Senegal, Mali, Burkina Faso, Niger | 100 XOF |
504- | Central African CFA Franc | XAF | Cameroon, Chad, Central African Republic | 100 XAF |
503+ | West African CFA Franc | XOF | Côte d'Ivoire, Senegal, Mali, Burkina Faso, Niger | 100 XOF (must be multiple of 5) |
504+ | Central African CFA Franc | XAF | Cameroon, Chad, Central African Republic | 100 XAF (must be multiple of 5) |
505505| Congolese Franc | CDF | Democratic Republic of Congo | 1000 CDF |
506506| Guinean Franc | GNF | Guinea | 1000 GNF |
507507| US Dollar | USD | All supported countries | 1 USD |
@@ -619,7 +619,7 @@ CinetPay follows a **redirect-based payment flow** where customers are redirecte
619619| Field | Type | Format | Description | Example | Validation Rules |
620620| -------| ------| --------| -------------| ---------| ------------------|
621621| ` transaction_id ` | string | Any unique string | Your unique transaction identifier | ` "TXN-ORDER-001" ` | Max 100 chars, alphanumeric + hyphens |
622- | ` amount ` | float | Positive number | Amount in currency base unit | ` 5000.0 ` | Min: 100 XOF, 1 USD |
622+ | ` amount ` | float | Positive number | Amount in currency base unit (converted to int internally) | ` 5000.0 ` | Min: 100 XOF, 1 USD |
623623| ` currency ` | Currency | Enum value | Transaction currency | ` Currency.XOF ` | XOF, XAF, CDF, GNF, USD |
624624| ` customer.first_name ` | string | Text | Customer's first name | ` "Marie" ` | 2-50 characters |
625625| ` customer.last_name ` | string | Text | Customer's last name | ` "Kouame" ` | 2-50 characters |
@@ -660,6 +660,10 @@ def validate_transaction_fields(data):
660660 if amount < min_amounts.get(currency, 100 ):
661661 errors.append(f " Amount too low for { currency} " )
662662
663+ # CinetPay requires amounts to be multiples of 5 for XOF and XAF
664+ if currency in [Currency.XOF , Currency.XAF ] and amount % 5 != 0 :
665+ errors.append(f " Amount must be a multiple of 5 for { currency} " )
666+
663667 # Validate phone number
664668 phone = data.get(' customer' , {}).get(' phone_number' , ' ' )
665669 if not phone.startswith(' +' ):
0 commit comments