Under development¶
PayGate Integration with EasySwitch¶
Overview¶
As the leading integrator and pioneer of electronic payment solutions in Togo, PayGate Global enables e-merchants and Togolese organizations to accept mobile payments on both web and mobile platforms. Notably designed to reduce fraud and maximize revenue, PayGate offers a simple and secure solution for collecting online payments via mobile money.
Prerequisites¶
By default, any newly created account on PayGate remains inactive until all required formalities are completed. To activate your account:
- EasySwitch library is installed. For setup instructions, see Installation.
- Go to your Profile page in the dashboard.
- Submit the necessary documents:
- Business registration certificate or tax ID
- ID Card
- Project description
- Contact details
- Callback URL (Add the callback_url in the dashboard and define it in your code)
Once verified, your account will be activated and ready to use. After activation, your API key becomes available directly from your dashboard.
Supported Countries¶
PayGate supports the following countries and payment methods:
Country | Mobile Money Operators | Card Payments |
---|---|---|
Togo | Mixx By Yas, Moov | ✅ |
Setup¶
Basic Configuration¶
from easyswitch import (
EasySwitch,
TransactionDetail,
Provider,
TransactionStatus,
Currency,
TransactionType,
CustomerInfo
)
# Prepare PayGate configuration
config = {
"debug": True,
"default_provider": Provider.PAYGATE,
"providers": {
"PAYGATE": {
"api_key": "your_paygate_api_key",
"callback_url": "your_paygate_callback_url",
"timeout": 60, # timeout in seconds for HTTP requests
"environment": "production", # Only Production mode for paygate
},
}
}
#Initialize paygate client
client = EasySwitch.from_dict(config_dict=config)
Alternative Configuration Methods¶
EasySwitch supports multiple configuration methods:
# 1. From environment variables
client = EasySwitch.from_env()
# 2. From JSON file
client = EasySwitch.from_json("config.json")
# 3. From YAML file
client = EasySwitch.from_yaml("config.yaml")
# 4. From multiple sources (with overrides)
client = EasySwitch.from_multi_sources(
env_file=".env",
json_file="overrides.json"
)
Configuration¶
Environment Variables¶
Create a .env
file or set the following environment variables:
# PayGate Configuration
PAYGATE_API_KEY=sk_production_your_api_key_here
PAYGATE_ENVIRONMENT=production
PAYGATE_CALLBACK_URL=your_paygate_callback_url
Authentication¶
PayGate uses API key authentication. EasySwitch automaticaly set this for requests.
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
Security Note: Never expose your secret API key in client-side code. Always use environment variables or secure configuration management.
EasySwitch Methods¶
EasySwitch provides a unified interface for all payment operations. Here are the main methods available:
Core Methods¶
Method | Description | Returns |
---|---|---|
send_payment(transaction) |
Send a payment transaction | PaymentResponse |
check_status(transaction_id, provider) |
Check transaction status | TransactionStatus |
Configuration Methods¶
Method | Description | Returns |
---|---|---|
from_env(env_file) |
Initialize from environment variables | EasySwitch |
from_json(json_file) |
Initialize from JSON file | EasySwitch |
from_yaml(yaml_file) |
Initialize from YAML file | EasySwitch |
from_dict(config_dict) |
Initialize from Python dictionary | EasySwitch |
from_multi_sources(**sources) |
Initialize from multiple sources | EasySwitch |
API Methods¶
1. Create Payment¶
Initiate a payment transaction using EasySwitch's TransactionDetail
class and send_payment
method.
# Create a TransactionDetail object
transaction = TransactionDetail(
transaction_id="transaction1234", # Unique ID generated by your system
provider=Provider.PAYGATE,
status = TransactionStatus.PENDING,
amount = 100,
currency=Currency.XOF,
transaction_type=TransactionType.PAYMENT,
customer=CustomerInfo(
firstname="John",
lastname="Doe",
email="john.doe@email.com",
phone_number="+22990123456"
),
reason="Product XYZ Purchase"
)
# Send payment using EasySwitch
response = client.send_payment(transaction)
# Check response properties
print(f"Local Transaction ID: {transaction.transaction_id}") # Your internal ID
print(f"FedaPay Transaction ID: {response.transaction_id}") # ID generated by FedaPay
print(f"Payment URL: {response.payment_link}")
print(f"Status: {response.status}")
print(f"Is Successful: {response.is_successful}")
print(f"Is Pending: {response.is_pending}")
Response Object (PaymentResponse):
PaymentResponse(
transaction_id='transaction1234',
provider='PAYGATE',
status=<TransactionStatus.PENDING: 'pending'>,
amount=100, currency=<Currency.XOF: 'XOF'>,
created_at=datetime.datetime(2025, 5, 15, 22, 16, 12, 279729),
expires_at=None, reference='transaction1234',
payment_link='payment_link',
transaction_token=None,
customer=CustomerInfo(phone_number='+22990123456', first_name='John', last_name='Doe', email='john.doe@email.com', address=None, city=None, country=None, postal_code=None, zip_code=None, state=None, id=None),
raw_response={'payment_url': 'payment_link'}, metadata={})
⚠️ Important Notes
transaction_id
in EasySwitch = your own internal identifier (must be unique in your system).transaction_id
in the PayGate response = the ID generated by PayGate's platform.
🔄 ID Mapping Overview
Context | Field Name | Who Generates It? | Purpose |
---|---|---|---|
EasySwitch (your system) | transaction_id |
You | Internal reference to track the transaction in your own DB. |
FedaPay | transaction_id |
FedaPay | Unique identifier in FedaPay’s system (returned after init). |
✅ Best Practice
- Always generate a unique
transaction_id
in your system. - Store both IDs (your own + PayGate's) for reconciliation.
2. Check Payment Status¶
Retrieve the current status of a payment transaction using EasySwitch's check_status
method.
# Check transaction status
transaction_id = "transaction1234"
response = client.check_status(transaction_id)
status = response.status
print(f"Status value: {status}")
# Check specific status types
if status == TransactionStatus.SUCCESSFUL:
print("Payment completed successfully!")
elif status == TransactionStatus.PENDING:
print("Payment is still processing...")
elif status == TransactionStatus.FAILED:
print("Payment failed")
Response Object (TransactionStatusResponse):
TransactionStatusResponse(
transaction_id="transaction1234", # PayGate transaction ID (not your local one)
provider=Provider.PAYGATE,
status=TransactionStatus.PENDING,
amount=1000.0,
data={...} # Raw PayGate's transaction data
)
Available TransactionStatus Values:
class TransactionStatus(str, Enum):
PENDING = "pending"
SUCCESSFUL = "successful"
FAILED = "failed"
ERROR = "error"
CANCELLED = "cancelled"
REFUSED = "refused"
EXPIRED = "expired"
PROCESSING = "processing"
INITIATED = "initiated"
COMPLETED = "completed"
3. PayGate Limitations¶
Important: PayGate does not support refunds or transaction cancellation through their API. These operations must be handled manually through the PayGate dashboard or by contacting their support team.
Unsupported Operations¶
Operation | PayGate Support | Alternative |
---|---|---|
Refunds | ❌ Not supported | Manual processing via dashboard |
Transaction Cancellation | ❌ Not supported | Contact PayGate support |
Partial Refunds | ❌ Not supported | Manual processing via dashboard |