Skip to main content

Python SDK for Bank of Maldives Connect API with synchronous and asynchronous support

Project description

BML Connect Python SDK

PyPI version Python Support License: MIT

ViewCount GitHub forks GitHub stars PyPI - Downloads contributions welcome GitHub issues

Python SDK for Bank of Maldives Connect API with synchronous and asynchronous support.
Compatible with all Python frameworks including Django, Flask, FastAPI, and Sanic.

Features

  • 🔄 Sync/Async Support: Choose your preferred programming style
  • 🎯 Full API Coverage: Transactions, webhooks, and signature verification
  • 📝 Type Annotations: Full type hint support for better development experience
  • 🛡️ Error Handling: Comprehensive error hierarchy for easy debugging
  • 🚀 Framework Agnostic: Works with any Python web framework
  • 📄 MIT Licensed: Open source and free to use

Installation

pip install bml-connect-python

Quick Start

Synchronous Usage

from bml_connect import BMLConnect, Environment

client = BMLConnect(
    api_key="your_api_key",
    app_id="your_app_id",
    environment=Environment.SANDBOX
)

try:
    transaction = client.transactions.create_transaction({
        "amount": 1500,  # 15.00 MVR
        "currency": "MVR",
        "provider": "alipay",
        "redirectUrl": "https://yourstore.com/success",
        "localId": "order_123",
        "customerReference": "Customer #456"
    })
    print(f"Transaction ID: {transaction.transaction_id}")
    print(f"Payment URL: {transaction.url}")
except Exception as e:
    print(f"Error: {e}")
finally:
    client.close()

Asynchronous Usage

import asyncio
from bml_connect import BMLConnect, Environment

async def main():
    client = BMLConnect(
        api_key="your_api_key",
        app_id="your_app_id",
        environment=Environment.SANDBOX,
        async_mode=True
    )
    
    try:
        transaction = await client.transactions.create_transaction({
            "amount": 2000,
            "currency": "MVR",
            "provider": "wechat",
            "redirectUrl": "https://yourstore.com/success"
        })
        print(f"Transaction ID: {transaction.transaction_id}")
    finally:
        await client.aclose()

asyncio.run(main())

Framework Integration Examples

Flask Integration

from flask import Flask, request, jsonify
from bml_connect import BMLConnect

app = Flask(__name__)
client = BMLConnect(api_key="your_api_key", app_id="your_app_id")

@app.route('/webhook', methods=['POST'])
def webhook():
    payload = request.get_json()
    signature = payload.get('signature')
    
    if client.verify_webhook_signature(payload, signature):
        # Process webhook
        return jsonify({"status": "success"}), 200
    else:
        return jsonify({"error": "Invalid signature"}), 403

FastAPI Integration

from fastapi import FastAPI, Request, HTTPException
from bml_connect import BMLConnect

app = FastAPI()
client = BMLConnect(api_key="your_api_key", app_id="your_app_id")

@app.post("/webhook")
async def handle_webhook(request: Request):
    payload = await request.json()
    signature = payload.get("signature")
    
    if client.verify_webhook_signature(payload, signature):
        return {"status": "success"}
    else:
        raise HTTPException(403, "Invalid signature")

Sanic Integration

from sanic import Sanic, response
from bml_connect import BMLConnect

app = Sanic("BMLWebhook")
client = BMLConnect(api_key="your_api_key", app_id="your_app_id")

@app.post('/webhook')
async def webhook(request):
    payload = request.json
    signature = payload.get('signature')
    
    if client.verify_webhook_signature(payload, signature):
        return response.json({"status": "success"})
    else:
        return response.json({"error": "Invalid signature"}, status=403)

API Reference

Core Classes

  • BMLConnect: Main entry point for the SDK
  • Transaction: Transaction object with all transaction details
  • QRCode: QR code details for payment processing
  • PaginatedResponse: For paginated transaction lists
  • Environment: Enum for SANDBOX and PRODUCTION environments
  • SignMethod: Enum for signature methods
  • TransactionState: Enum for transaction states

Exception Hierarchy

BMLConnectError
├── AuthenticationError
├── ValidationError
├── NotFoundError
├── ServerError
└── RateLimitError

Signature Utilities

from bml_connect import SignatureUtils

# Generate signature
signature = SignatureUtils.generate_signature(data, api_key, method)

# Verify signature
is_valid = SignatureUtils.verify_signature(data, signature, api_key, method)

Advanced Usage

Transaction Management

# Create a transaction
transaction = client.transactions.create_transaction({
    "amount": 5000,
    "currency": "MVR",
    "provider": "alipay",
    "redirectUrl": "https://yourstore.com/success",
    "localId": "order_456"
})

# Get transaction details
details = client.transactions.get_transaction(transaction.transaction_id)

# List transactions with pagination
transactions = client.transactions.list_transactions(
    page=1,
    per_page=10,
    status="completed"
)

Webhook Handling

@app.route('/webhook', methods=['POST'])
def handle_webhook():
    payload = request.get_json()
    
    # Verify webhook signature
    if not client.verify_webhook_signature(payload, payload.get('signature')):
        return {"error": "Invalid signature"}, 403
    
    # Process different webhook events
    event_type = payload.get('event_type')
    if event_type == 'transaction.completed':
        # Handle completed transaction
        transaction_id = payload.get('transaction_id')
        # Your business logic here
    elif event_type == 'transaction.failed':
        # Handle failed transaction
        pass
    
    return {"status": "success"}

Requirements

  • Python 3.7+
  • See requirements.txt and requirements-dev.txt for dependencies

Development

Setup Development Environment

# Clone the repository
git clone https://github.com/quillfires/bml-connect-python.git
cd bml-connect-python

# Install in development mode
pip install -e .[dev]

Running Tests

pytest

Code Quality

# Format code
black .

# Lint code
flake8 .

# Type checking
mypy .

Project Structure

bml-connect-python/
├── src/bml_connect/          # Source code
├── tests/                    # Test files
├── examples/                 # Usage examples
├── pyproject.toml           # Build configuration
├── requirements.txt         # Runtime dependencies
├── requirements-dev.txt     # Development dependencies
└── README.md               # This file

Contributing

We welcome contributions! Please see our Contributing Guidelines for details.

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Ensure all tests pass
  6. Submit a pull request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

Changelog

See CHANGELOG.md for a detailed history of changes.

Security

If you discover any security-related issues, please email fayaz.quill@gmail.com instead of using the issue tracker.


Made with ❤️ for the Maldivian developer community

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bml_connect_python-1.1.2.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bml_connect_python-1.1.2-py3-none-any.whl (10.3 kB view details)

Uploaded Python 3

File details

Details for the file bml_connect_python-1.1.2.tar.gz.

File metadata

  • Download URL: bml_connect_python-1.1.2.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bml_connect_python-1.1.2.tar.gz
Algorithm Hash digest
SHA256 5bda425536d2566ea1d62c98d831fd5f252e3de89c72b5a910a69b43755b6e6b
MD5 1c5908c00ce83b597b41a99f588eb67e
BLAKE2b-256 771345a43cb59f88ef1d29d9064d79038fabebe9a0d5ffb38a0e783d75118ea7

See more details on using hashes here.

Provenance

The following attestation bundles were made for bml_connect_python-1.1.2.tar.gz:

Publisher: release.yml on quillfires/bml-connect-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bml_connect_python-1.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for bml_connect_python-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 df5333116c16edd2e537e0f1ea0e38ad5031c250d0d41b7e2594f2f2578757b1
MD5 12454f0c4fe573a6bcc654c3d74a31a4
BLAKE2b-256 b210b14327746973bd3715fd52fa3e6ab4f9a1d07fa09a58585ece9782b692de

See more details on using hashes here.

Provenance

The following attestation bundles were made for bml_connect_python-1.1.2-py3-none-any.whl:

Publisher: release.yml on quillfires/bml-connect-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page