Official Python SDK for ToyyibPay Payment Gateway
Project description
ToyyibPay Python SDK
A modern, easy-to-use Python SDK for integrating with ToyyibPay payment gateway. Inspired by Stripe's SDK design principles.
Features
- 🚀 Simple, intuitive API
- 🔒 Full type hints support
- ⚡ Async/await support
- 🛡️ Comprehensive error handling
- 🔧 Easy integration with Flask, FastAPI, and Django
- 📊 Built-in webhook handling
- 🗄️ Optional database integration (PostgreSQL first, MySQL/MongoDB coming soon)
- 🧪 Well-tested and production-ready
Installation
pip install toyyibpay
With specific integrations:
# For PostgreSQL support
pip install toyyibpay[postgres]
# For Flask integration
pip install toyyibpay[flask]
# For FastAPI integration
pip install toyyibpay[fastapi]
# For everything
pip install toyyibpay[all]
Quick Start
Basic Usage
import toyyibpay
# Initialize client
client = toyyibpay.Client(api_key="your-api-key")
# Create a payment
bill = client.create_bill(
name="John Doe",
email="john@example.com",
phone="0123456789",
amount=100.00, # MYR 100.00
order_id="ORD-12345",
description="Purchase of Product X"
)
print(f"Payment URL: {bill.payment_url}")
print(f"Bill Code: {bill.bill_code}")
Async Usage
import asyncio
import toyyibpay
async def create_payment():
async with toyyibpay.AsyncClient(api_key="your-api-key") as client:
bill = await client.create_bill(
name="John Doe",
email="john@example.com",
phone="0123456789",
amount=100.00,
order_id="ORD-12345"
)
return bill
# Run async function
bill = asyncio.run(create_payment())
Environment-based Configuration
import os
import toyyibpay
# Set environment variables
os.environ['TOYYIBPAY_API_KEY'] = 'your-api-key'
os.environ['TOYYIBPAY_CATEGORY_ID'] = 'your-category-id'
os.environ['TOYYIBPAY_ENVIRONMENT'] = 'production' # or 'dev'
# Create client from environment
config = toyyibpay.ToyyibPayConfig.from_env()
client = toyyibpay.Client(config=config)
Flask Integration
from flask import Flask, request, jsonify
import toyyibpay
app = Flask(__name__)
client = toyyibpay.Client(api_key="your-api-key")
@app.route('/create-payment', methods=['POST'])
def create_payment():
data = request.get_json()
try:
bill = client.create_bill(
name=data['name'],
email=data['email'],
phone=data['phone'],
amount=data['amount'],
order_id=data.get('order_id')
)
return jsonify({
'success': True,
'payment_url': bill.payment_url,
'bill_code': bill.bill_code
})
except toyyibpay.ToyyibPayError as e:
return jsonify({
'success': False,
'error': str(e)
}), 400
FastAPI Integration
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import toyyibpay
app = FastAPI()
client = toyyibpay.Client(api_key="your-api-key")
class PaymentRequest(BaseModel):
name: str
email: str
phone: str
amount: float
@app.post("/create-payment")
async def create_payment(payment: PaymentRequest):
try:
bill = client.create_bill(
name=payment.name,
email=payment.email,
phone=payment.phone,
amount=payment.amount,
order_id=toyyibpay.utils.generate_order_id()
)
return {
"payment_url": bill.payment_url,
"bill_code": bill.bill_code
}
except toyyibpay.ToyyibPayError as e:
raise HTTPException(status_code=400, detail=str(e))
Webhook Handling
import toyyibpay
from toyyibpay.webhooks import WebhookHandler
# Create webhook handler
webhook_handler = WebhookHandler()
# Register event handlers
@webhook_handler.on_payment_success
def handle_success(data: toyyibpay.CallbackData):
print(f"Payment {data.order_id} successful!")
# Update order status, send email, etc.
@webhook_handler.on_payment_failed
def handle_failure(data: toyyibpay.CallbackData):
print(f"Payment {data.order_id} failed: {data.reason}")
# Handle failed payment
# Process webhook (in your webhook endpoint)
def process_webhook(request_body, headers):
try:
callback_data = webhook_handler.process(request_body, headers)
return {"success": True}
except toyyibpay.WebhookError as e:
return {"success": False, "error": str(e)}
Database Integration Sample Code (Optional)
from sqlalchemy import create_engine
import toyyibpay
from toyyibpay.db import PostgresPaymentStore
# Setup database
engine = create_engine("postgresql://user:pass@localhost/mydb")
payment_store = PostgresPaymentStore(engine)
payment_store.create_tables()
# Create payment with database tracking
def create_payment_with_tracking(customer_data):
# Create bill with ToyyibPay
bill = client.create_bill(**customer_data)
# Store in database
with payment_store.session() as session:
payment = payment_store.create_payment(
session,
order_id=customer_data['order_id'],
amount=customer_data['amount'],
bill_code=bill.bill_code,
customer_name=customer_data['name'],
customer_email=customer_data['email']
)
return bill
API Reference
Client Methods
create_bill()
Create a new payment bill.
bill = client.create_bill(
name="Waiz Wafiq", # Customer name (required)
email="waiz@gmail.com", # Customer email (required)
phone="0123456789", # Customer phone (required)
amount=100.00, # Amount in MYR (required)
order_id="ORD-12345", # Your reference ID (required)
description="bayar hutang", # Description (optional)
return_url="https://...", # Return URL (optional)
callback_url="https://...", # Callback URL (optional)
)
get_bill_transactions()
Get transaction history for a bill.
# Get all transactions
transactions = client.get_bill_transactions("bill_code")
# Get only successful transactions
successful = client.get_bill_transactions(
"bill_code",
status=toyyibpay.PaymentStatus.SUCCESS
)
check_payment_status()
Check payment status for a bill.
status = client.check_payment_status("bill_code")
if status == toyyibpay.PaymentStatus.SUCCESS:
print("Payment successful!")
create_category()
Create a new payment category.
category = client.create_category(
name="Online Store",
description="Payments for online store"
)
Enums
PaymentStatus: SUCCESS, PENDING, FAILED, PENDING_TRANSACTIONPaymentChannel: FPX, CREDIT_CARD, FPX_AND_CREDIT_CARDEnvironment: DEV, STAGING, PRODUCTION
Exceptions
ToyyibPayError: Base exceptionAuthenticationError: Invalid API keyValidationError: Invalid request dataNetworkError: Network-related errorsAPIError: ToyyibPay API errors
Configuration
Environment Variables
TOYYIBPAY_API_KEY: Your ToyyibPay API keyTOYYIBPAY_CATEGORY_ID: Default category IDTOYYIBPAY_ENVIRONMENT: Environment (dev/staging/production)TOYYIBPAY_RETURN_URL: Default return URLTOYYIBPAY_CALLBACK_URL: Default callback URLDATABASE_URL: PostgreSQL connection string (optional)
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Acknowledgments
- Inspired by Stripe's excellent Python SDK
- Thanks to the ToyyibPay team for their payment gateway service
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file toyyibpay-0.1.0.tar.gz.
File metadata
- Download URL: toyyibpay-0.1.0.tar.gz
- Upload date:
- Size: 6.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d3f7d45905598c7cd423c7555c9c3dd2149e2e4b27e77c4d005f8ec95d96124
|
|
| MD5 |
d134014c95909ebfef76ff9e2a7c72f2
|
|
| BLAKE2b-256 |
609ad6652373e963da2d2ff5b0af8215cbdd27f2d6afc5e1b3aa92d63e7a407b
|
File details
Details for the file toyyibpay-0.1.0-py3-none-any.whl.
File metadata
- Download URL: toyyibpay-0.1.0-py3-none-any.whl
- Upload date:
- Size: 4.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0588601631be4177d3b955fd0192d701f1a3b13c806ac985a20c1fe44c9f94bc
|
|
| MD5 |
20dfa23bcf1060f5f059b4579f1945aa
|
|
| BLAKE2b-256 |
294c05c2864b1780262c6dc854634a41264e630a18fd13bf965b666f56b2fbad
|