zenopay-sdk


Namezenopay-sdk JSON
Version 0.3.0 PyPI version JSON
download
home_pageNone
SummaryA modern Python SDK for the ZenoPay payment API
upload_time2025-07-27 07:07:14
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords africa api mobile-money payments payments-gateway sdk tanzania ussd zenopay
VCS
bugtrack_url
requirements black bump-my-version flake8-pyproject ginx httpx pip-check-updates pydantic pytest pytest-cov python-dotenv typing-extensions
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ZenoPay Python SDK

Modern Python SDK for ZenoPay payment API with async/sync support, order management, and disbursements.

## Installation

```bash
pip install zenopay-sdk
```

## Quick Start

```python
from elusion.zenopay import ZenoPay
from elusion.zenopay.models.order import NewOrder
from elusion.zenopay.utils import generate_order_id

# Initialize client (uses environment variables)
client = ZenoPay()

# Create order (sync)
with client:
    order = NewOrder(
        order_id=generate_order_id(),
        buyer_email="customer@example.com",
        buyer_name="John Doe",
        buyer_phone="07XXXXXXXX",
        amount=1000
    )
    response = client.orders.sync.create(order)
    print(f"Order ID: {response.results.order_id}")
```

## Configuration

### Environment Variables

```bash
export ZENOPAY_API_KEY="your_api_key"
```

### Code Configuration

```python
client = ZenoPay(
    api_key="your_api_key",
    timeout=30.0
)
```

## Orders API

### Synchronous Operations

```python
from elusion.zenopay import ZenoPay
from elusion.zenopay.models.order import NewOrder
from elusion.zenopay.utils import generate_order_id

client = ZenoPay()

# Create order
def create_order():
    with client:
        order = NewOrder(
            order_id=generate_order_id(),
            buyer_email="test@example.com",
            buyer_name="Test User",
            buyer_phone="07XXXXXXXX",
            amount=1000,
        )
        response = client.orders.sync.create(order)
        return response.results.order_id

# Check status
def check_status(order_id: str):
    with client:
        response = client.orders.sync.check_status(order_id)
        return response.results

# Check if paid
def check_payment(order_id: str):
    with client:
        return client.orders.sync.check_payment(order_id)

# Wait for payment completion
def wait_for_payment(order_id: str):
    with client:
        return client.orders.sync.wait_for_payment(order_id)

# Usage example
if __name__ == "__main__":
    order_id = create_order()
    status = check_status(order_id)
    is_paid = check_payment(order_id)

    print(f"Order: {order_id}")
    print(f"Status: {status.data[0].payment_status}")
    print(f"Paid: {is_paid}")

    order_content = wait_for_payment(order_id)
    print(f"Order completed: {order_content}")
```

### Asynchronous Operations

```python
import asyncio
from elusion.zenopay import ZenoPay
from elusion.zenopay.models.order import NewOrder
from elusion.zenopay.utils import generate_order_id

client = ZenoPay()

# Create order (async)
async def create_order_async():
    async with client:
        order = NewOrder(
            order_id=generate_order_id(),
            buyer_email="test@example.com",
            buyer_name="Test User",
            buyer_phone="07XXXXXXXX",
            amount=1000,
            webhook_url="https://example.com/webhook",
            metadata={"key": "value"},
        )
        response = await client.orders.create(order)
        return response.results.order_id

# Check status (async)
async def check_status_async(order_id: str):
    async with client:
        response = await client.orders.check_status(order_id)
        return response.results.data[0].payment_status

# Check payment (async)
async def check_payment_async(order_id: str):
    async with client:
        return await client.orders.check_payment(order_id)

# Usage example
async def async_example():
    order_id = await create_order_async()
    status = await check_status_async(order_id)
    is_paid = await check_payment_async(order_id)

    print(f"Async Order: {order_id}")
    print(f"Async Status: {status}")
    print(f"Async Paid: {is_paid}")

asyncio.run(async_example())
```

## Disbursements API

### Mobile Money Disbursements

```python
from elusion.zenopay import ZenoPay
from elusion.zenopay.models.disbursement import NewDisbursement, UtilityCodes
from elusion.zenopay.utils import generate_order_id

client = ZenoPay()

def disburse():
    response = client.disbursements.sync.disburse(
        disbursement_data=NewDisbursement(
            amount=5000,
            pin=0000,  # Your ZenoPay PIN
            transid=generate_order_id(),
            utilitycode=UtilityCodes.CASHIN,
            utilityref="07XXXXXXXX"  # Phone number
        )
    )
    return response.results.zenopay_response.result

# Usage
if __name__ == "__main__":
    result = disburse()
    print(f"Disbursement result: {result}")
```

### Available Utility Codes

```python
from elusion.zenopay.models.disbursement import UtilityCodes

# Available disbursement types
UtilityCodes.CASHIN      # Mobile money cash-in
# Add other available codes as needed
```

## Webhook Handling

### Basic Setup

```python
# Setup handlers
def payment_completed(event):
    order_id = event.payload.order_id
    reference = event.payload.reference
    print(f"Payment completed: {order_id} - {reference}")

def payment_failed(event):
    order_id = event.payload.order_id
    print(f"Payment failed: {order_id}")

# Register handlers
client.webhooks.on_payment_completed(payment_completed)
client.webhooks.on_payment_failed(payment_failed)

# Process webhook
webhook_data = '{"order_id":"123","payment_status":"COMPLETED","reference":"REF123"}'
response = client.webhooks.process_webhook_request(webhook_data)
```

### Flask Integration

```python
from flask import Flask, request, jsonify
from elusion.zenopay import ZenoPay

app = Flask(__name__)
client = ZenoPay()

def handle_completed_payment(event):
    order_id = event.payload.order_id
    # Update database, send emails, etc.
    print(f"Order {order_id} completed")

client.webhooks.on_payment_completed(handle_completed_payment)

@app.route('/zenopay/webhook', methods=['POST'])
def webhook():
    raw_data = request.data.decode('utf-8')
    response = client.webhooks.process_webhook_request(raw_data)
    return jsonify({'status': response.status})

if __name__ == '__main__':
    app.run()
```

### FastAPI Integration

```python
from fastapi import FastAPI, Request
from elusion.zenopay import ZenoPay

app = FastAPI()
client = ZenoPay()

def handle_completed_payment(event):
    order_id = event.payload.order_id
    print(f"Order {order_id} completed")

client.webhooks.on_payment_completed(handle_completed_payment)

@app.post("/zenopay/webhook")
async def webhook(request: Request):
    raw_data = await request.body()
    raw_data_str = raw_data.decode('utf-8')
    response = client.webhooks.process_webhook_request(raw_data_str)
    return {'status': response.status}
```

## Error Handling

```python
from elusion.zenopay.exceptions import (
    ZenoPayError,
    ZenoPayValidationError,
    ZenoPayNetworkError,
    ZenoPayAuthenticationError
)

try:
    with client:
        response = client.orders.sync.create(order)
except ZenoPayValidationError as e:
    print(f"Validation error: {e.message}")
    print(f"Details: {e.validation_errors}")
except ZenoPayAuthenticationError as e:
    print(f"Authentication error: {e.message}")
except ZenoPayNetworkError as e:
    print(f"Network error: {e.message}")
except ZenoPayError as e:
    print(f"General error: {e.message}")
```

## Models

### Order Models

```python
from elusion.zenopay.models.order import NewOrder
from elusion.zenopay.utils import generate_order_id

# Create order with all fields
order = NewOrder(
    order_id=generate_order_id(),
    buyer_email="customer@example.com",
    buyer_name="John Doe",
    buyer_phone="07XXXXXXXX",
    amount=1000,
    webhook_url="https://yoursite.com/webhook",
    metadata={
        "product_id": "12345",
        "campaign": "summer_sale"
    }
)

# Minimal order
order = NewOrder(
    order_id=generate_order_id(),
    buyer_email="customer@example.com",
    buyer_name="John Doe",
    buyer_phone="07XXXXXXXX",
    amount=1000
)
```

### Disbursement Models

```python
from elusion.zenopay.models.disbursement import NewDisbursement, UtilityCodes
from elusion.zenopay.utils import generate_order_id

# Mobile money disbursement
disbursement = NewDisbursement(
    amount=5000,
    pin=0000,  # Your ZenoPay PIN
    transid=generate_order_id(),
    utilitycode=UtilityCodes.CASHIN,
    utilityref="07XXXXXXXX"  # Phone number
)
```

### Response Models

```python
# Order creation response
response = client.orders.sync.create(order)
print(f"Order ID: {response.results.order_id}")

# Status check response
status = client.orders.sync.check_status(order_id)
print(f"Payment Status: {status.results.data[0].payment_status}")

# Disbursement response
response = client.disbursements.sync.disburse(disbursement_data)
print(f"Result: {response.results.zenopay_response.result}")
```

## API Reference

### Order Operations

| Method           | Sync                                    | Async                                    | Description                |
| ---------------- | --------------------------------------- | ---------------------------------------- | -------------------------- |
| Create Order     | `client.orders.sync.create()`           | `await client.orders.create()`           | Create new payment order   |
| Check Status     | `client.orders.sync.check_status()`     | `await client.orders.check_status()`     | Check order payment status |
| Check Payment    | `client.orders.sync.check_payment()`    | `await client.orders.check_payment()`    | Returns boolean if paid    |
| Wait for Payment | `client.orders.sync.wait_for_payment()` | `await client.orders.wait_for_payment()` | Poll until completed       |

### Disbursement Operations

| Method   | Sync                                   | Async                                   | Description             |
| -------- | -------------------------------------- | --------------------------------------- | ----------------------- |
| Disburse | `client.disbursements.sync.disburse()` | `await client.disbursements.disburse()` | Send money disbursement |

### Webhook Events

| Event     | Handler Method                           | Description        |
| --------- | ---------------------------------------- | ------------------ |
| COMPLETED | `client.webhooks.on_payment_completed()` | Payment successful |
| FAILED    | `client.webhooks.on_payment_failed()`    | Payment failed     |
| PENDING   | `client.webhooks.on_payment_pending()`   | Payment initiated  |
| CANCELLED | `client.webhooks.on_payment_cancelled()` | Payment cancelled  |

## Best Practices

### Context Managers

Always use context managers for proper resource cleanup:

```python
# Sync
with client:
    response = client.orders.sync.create(order)

# Async
async with client:
    response = await client.orders.create(order)
```

### Error Handling

Handle specific exceptions for better error management:

```python
try:
    with client:
        response = client.orders.sync.create(order)
except ZenoPayValidationError:
    # Handle validation errors
    pass
except ZenoPayNetworkError:
    # Handle network issues
    pass
```

### Environment Configuration

Use environment variables for sensitive configuration:

```python
# Don't hardcode credentials
client = ZenoPay(api_key=os.getenv('ZENOPAY_API_KEY'))
```

### Generate Unique Order IDs

Always use the built-in utility to generate unique order IDs:

```python
from elusion.zenopay.utils import generate_order_id

order_id = generate_order_id()  # Generates UUID-based unique ID
```


## Support

- **GitHub**: [zenopay-python-sdk](https://github.com/elusionhub/zenopay-python-sdk)
- **Issues**: [Report bugs](https://github.com/elusionhub/zenopay-python-sdk/issues)
- **Email**: elusion.lab@gmail.com

## License

MIT License - see [LICENSE](LICENSE) file for details.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "zenopay-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Elution Hub <elusion.lab@gmail.com>",
    "keywords": "africa, api, mobile-money, payments, payments-gateway, sdk, tanzania, ussd, zenopay",
    "author": null,
    "author_email": "Elution Hub <elusion.lab@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/15/3b/7e501fd020bdd499fac4941d1c7ea96ef4f8b9eeef659ee2efb121eb41d5/zenopay_sdk-0.3.0.tar.gz",
    "platform": null,
    "description": "# ZenoPay Python SDK\n\nModern Python SDK for ZenoPay payment API with async/sync support, order management, and disbursements.\n\n## Installation\n\n```bash\npip install zenopay-sdk\n```\n\n## Quick Start\n\n```python\nfrom elusion.zenopay import ZenoPay\nfrom elusion.zenopay.models.order import NewOrder\nfrom elusion.zenopay.utils import generate_order_id\n\n# Initialize client (uses environment variables)\nclient = ZenoPay()\n\n# Create order (sync)\nwith client:\n    order = NewOrder(\n        order_id=generate_order_id(),\n        buyer_email=\"customer@example.com\",\n        buyer_name=\"John Doe\",\n        buyer_phone=\"07XXXXXXXX\",\n        amount=1000\n    )\n    response = client.orders.sync.create(order)\n    print(f\"Order ID: {response.results.order_id}\")\n```\n\n## Configuration\n\n### Environment Variables\n\n```bash\nexport ZENOPAY_API_KEY=\"your_api_key\"\n```\n\n### Code Configuration\n\n```python\nclient = ZenoPay(\n    api_key=\"your_api_key\",\n    timeout=30.0\n)\n```\n\n## Orders API\n\n### Synchronous Operations\n\n```python\nfrom elusion.zenopay import ZenoPay\nfrom elusion.zenopay.models.order import NewOrder\nfrom elusion.zenopay.utils import generate_order_id\n\nclient = ZenoPay()\n\n# Create order\ndef create_order():\n    with client:\n        order = NewOrder(\n            order_id=generate_order_id(),\n            buyer_email=\"test@example.com\",\n            buyer_name=\"Test User\",\n            buyer_phone=\"07XXXXXXXX\",\n            amount=1000,\n        )\n        response = client.orders.sync.create(order)\n        return response.results.order_id\n\n# Check status\ndef check_status(order_id: str):\n    with client:\n        response = client.orders.sync.check_status(order_id)\n        return response.results\n\n# Check if paid\ndef check_payment(order_id: str):\n    with client:\n        return client.orders.sync.check_payment(order_id)\n\n# Wait for payment completion\ndef wait_for_payment(order_id: str):\n    with client:\n        return client.orders.sync.wait_for_payment(order_id)\n\n# Usage example\nif __name__ == \"__main__\":\n    order_id = create_order()\n    status = check_status(order_id)\n    is_paid = check_payment(order_id)\n\n    print(f\"Order: {order_id}\")\n    print(f\"Status: {status.data[0].payment_status}\")\n    print(f\"Paid: {is_paid}\")\n\n    order_content = wait_for_payment(order_id)\n    print(f\"Order completed: {order_content}\")\n```\n\n### Asynchronous Operations\n\n```python\nimport asyncio\nfrom elusion.zenopay import ZenoPay\nfrom elusion.zenopay.models.order import NewOrder\nfrom elusion.zenopay.utils import generate_order_id\n\nclient = ZenoPay()\n\n# Create order (async)\nasync def create_order_async():\n    async with client:\n        order = NewOrder(\n            order_id=generate_order_id(),\n            buyer_email=\"test@example.com\",\n            buyer_name=\"Test User\",\n            buyer_phone=\"07XXXXXXXX\",\n            amount=1000,\n            webhook_url=\"https://example.com/webhook\",\n            metadata={\"key\": \"value\"},\n        )\n        response = await client.orders.create(order)\n        return response.results.order_id\n\n# Check status (async)\nasync def check_status_async(order_id: str):\n    async with client:\n        response = await client.orders.check_status(order_id)\n        return response.results.data[0].payment_status\n\n# Check payment (async)\nasync def check_payment_async(order_id: str):\n    async with client:\n        return await client.orders.check_payment(order_id)\n\n# Usage example\nasync def async_example():\n    order_id = await create_order_async()\n    status = await check_status_async(order_id)\n    is_paid = await check_payment_async(order_id)\n\n    print(f\"Async Order: {order_id}\")\n    print(f\"Async Status: {status}\")\n    print(f\"Async Paid: {is_paid}\")\n\nasyncio.run(async_example())\n```\n\n## Disbursements API\n\n### Mobile Money Disbursements\n\n```python\nfrom elusion.zenopay import ZenoPay\nfrom elusion.zenopay.models.disbursement import NewDisbursement, UtilityCodes\nfrom elusion.zenopay.utils import generate_order_id\n\nclient = ZenoPay()\n\ndef disburse():\n    response = client.disbursements.sync.disburse(\n        disbursement_data=NewDisbursement(\n            amount=5000,\n            pin=0000,  # Your ZenoPay PIN\n            transid=generate_order_id(),\n            utilitycode=UtilityCodes.CASHIN,\n            utilityref=\"07XXXXXXXX\"  # Phone number\n        )\n    )\n    return response.results.zenopay_response.result\n\n# Usage\nif __name__ == \"__main__\":\n    result = disburse()\n    print(f\"Disbursement result: {result}\")\n```\n\n### Available Utility Codes\n\n```python\nfrom elusion.zenopay.models.disbursement import UtilityCodes\n\n# Available disbursement types\nUtilityCodes.CASHIN      # Mobile money cash-in\n# Add other available codes as needed\n```\n\n## Webhook Handling\n\n### Basic Setup\n\n```python\n# Setup handlers\ndef payment_completed(event):\n    order_id = event.payload.order_id\n    reference = event.payload.reference\n    print(f\"Payment completed: {order_id} - {reference}\")\n\ndef payment_failed(event):\n    order_id = event.payload.order_id\n    print(f\"Payment failed: {order_id}\")\n\n# Register handlers\nclient.webhooks.on_payment_completed(payment_completed)\nclient.webhooks.on_payment_failed(payment_failed)\n\n# Process webhook\nwebhook_data = '{\"order_id\":\"123\",\"payment_status\":\"COMPLETED\",\"reference\":\"REF123\"}'\nresponse = client.webhooks.process_webhook_request(webhook_data)\n```\n\n### Flask Integration\n\n```python\nfrom flask import Flask, request, jsonify\nfrom elusion.zenopay import ZenoPay\n\napp = Flask(__name__)\nclient = ZenoPay()\n\ndef handle_completed_payment(event):\n    order_id = event.payload.order_id\n    # Update database, send emails, etc.\n    print(f\"Order {order_id} completed\")\n\nclient.webhooks.on_payment_completed(handle_completed_payment)\n\n@app.route('/zenopay/webhook', methods=['POST'])\ndef webhook():\n    raw_data = request.data.decode('utf-8')\n    response = client.webhooks.process_webhook_request(raw_data)\n    return jsonify({'status': response.status})\n\nif __name__ == '__main__':\n    app.run()\n```\n\n### FastAPI Integration\n\n```python\nfrom fastapi import FastAPI, Request\nfrom elusion.zenopay import ZenoPay\n\napp = FastAPI()\nclient = ZenoPay()\n\ndef handle_completed_payment(event):\n    order_id = event.payload.order_id\n    print(f\"Order {order_id} completed\")\n\nclient.webhooks.on_payment_completed(handle_completed_payment)\n\n@app.post(\"/zenopay/webhook\")\nasync def webhook(request: Request):\n    raw_data = await request.body()\n    raw_data_str = raw_data.decode('utf-8')\n    response = client.webhooks.process_webhook_request(raw_data_str)\n    return {'status': response.status}\n```\n\n## Error Handling\n\n```python\nfrom elusion.zenopay.exceptions import (\n    ZenoPayError,\n    ZenoPayValidationError,\n    ZenoPayNetworkError,\n    ZenoPayAuthenticationError\n)\n\ntry:\n    with client:\n        response = client.orders.sync.create(order)\nexcept ZenoPayValidationError as e:\n    print(f\"Validation error: {e.message}\")\n    print(f\"Details: {e.validation_errors}\")\nexcept ZenoPayAuthenticationError as e:\n    print(f\"Authentication error: {e.message}\")\nexcept ZenoPayNetworkError as e:\n    print(f\"Network error: {e.message}\")\nexcept ZenoPayError as e:\n    print(f\"General error: {e.message}\")\n```\n\n## Models\n\n### Order Models\n\n```python\nfrom elusion.zenopay.models.order import NewOrder\nfrom elusion.zenopay.utils import generate_order_id\n\n# Create order with all fields\norder = NewOrder(\n    order_id=generate_order_id(),\n    buyer_email=\"customer@example.com\",\n    buyer_name=\"John Doe\",\n    buyer_phone=\"07XXXXXXXX\",\n    amount=1000,\n    webhook_url=\"https://yoursite.com/webhook\",\n    metadata={\n        \"product_id\": \"12345\",\n        \"campaign\": \"summer_sale\"\n    }\n)\n\n# Minimal order\norder = NewOrder(\n    order_id=generate_order_id(),\n    buyer_email=\"customer@example.com\",\n    buyer_name=\"John Doe\",\n    buyer_phone=\"07XXXXXXXX\",\n    amount=1000\n)\n```\n\n### Disbursement Models\n\n```python\nfrom elusion.zenopay.models.disbursement import NewDisbursement, UtilityCodes\nfrom elusion.zenopay.utils import generate_order_id\n\n# Mobile money disbursement\ndisbursement = NewDisbursement(\n    amount=5000,\n    pin=0000,  # Your ZenoPay PIN\n    transid=generate_order_id(),\n    utilitycode=UtilityCodes.CASHIN,\n    utilityref=\"07XXXXXXXX\"  # Phone number\n)\n```\n\n### Response Models\n\n```python\n# Order creation response\nresponse = client.orders.sync.create(order)\nprint(f\"Order ID: {response.results.order_id}\")\n\n# Status check response\nstatus = client.orders.sync.check_status(order_id)\nprint(f\"Payment Status: {status.results.data[0].payment_status}\")\n\n# Disbursement response\nresponse = client.disbursements.sync.disburse(disbursement_data)\nprint(f\"Result: {response.results.zenopay_response.result}\")\n```\n\n## API Reference\n\n### Order Operations\n\n| Method           | Sync                                    | Async                                    | Description                |\n| ---------------- | --------------------------------------- | ---------------------------------------- | -------------------------- |\n| Create Order     | `client.orders.sync.create()`           | `await client.orders.create()`           | Create new payment order   |\n| Check Status     | `client.orders.sync.check_status()`     | `await client.orders.check_status()`     | Check order payment status |\n| Check Payment    | `client.orders.sync.check_payment()`    | `await client.orders.check_payment()`    | Returns boolean if paid    |\n| Wait for Payment | `client.orders.sync.wait_for_payment()` | `await client.orders.wait_for_payment()` | Poll until completed       |\n\n### Disbursement Operations\n\n| Method   | Sync                                   | Async                                   | Description             |\n| -------- | -------------------------------------- | --------------------------------------- | ----------------------- |\n| Disburse | `client.disbursements.sync.disburse()` | `await client.disbursements.disburse()` | Send money disbursement |\n\n### Webhook Events\n\n| Event     | Handler Method                           | Description        |\n| --------- | ---------------------------------------- | ------------------ |\n| COMPLETED | `client.webhooks.on_payment_completed()` | Payment successful |\n| FAILED    | `client.webhooks.on_payment_failed()`    | Payment failed     |\n| PENDING   | `client.webhooks.on_payment_pending()`   | Payment initiated  |\n| CANCELLED | `client.webhooks.on_payment_cancelled()` | Payment cancelled  |\n\n## Best Practices\n\n### Context Managers\n\nAlways use context managers for proper resource cleanup:\n\n```python\n# Sync\nwith client:\n    response = client.orders.sync.create(order)\n\n# Async\nasync with client:\n    response = await client.orders.create(order)\n```\n\n### Error Handling\n\nHandle specific exceptions for better error management:\n\n```python\ntry:\n    with client:\n        response = client.orders.sync.create(order)\nexcept ZenoPayValidationError:\n    # Handle validation errors\n    pass\nexcept ZenoPayNetworkError:\n    # Handle network issues\n    pass\n```\n\n### Environment Configuration\n\nUse environment variables for sensitive configuration:\n\n```python\n# Don't hardcode credentials\nclient = ZenoPay(api_key=os.getenv('ZENOPAY_API_KEY'))\n```\n\n### Generate Unique Order IDs\n\nAlways use the built-in utility to generate unique order IDs:\n\n```python\nfrom elusion.zenopay.utils import generate_order_id\n\norder_id = generate_order_id()  # Generates UUID-based unique ID\n```\n\n\n## Support\n\n- **GitHub**: [zenopay-python-sdk](https://github.com/elusionhub/zenopay-python-sdk)\n- **Issues**: [Report bugs](https://github.com/elusionhub/zenopay-python-sdk/issues)\n- **Email**: elusion.lab@gmail.com\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A modern Python SDK for the ZenoPay payment API",
    "version": "0.3.0",
    "project_urls": {
        "Changelog": "https://github.com/elusionhub/zenopay-python-sdk/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/elusionhub/zenopay-python-sdk#readme",
        "Homepage": "https://github.com/elusionhub/zenopay-python-sdk",
        "Issues": "https://github.com/elusionhub/zenopay-python-sdk/issues",
        "Repository": "https://github.com/elusionhub/zenopay-python-sdk.git"
    },
    "split_keywords": [
        "africa",
        " api",
        " mobile-money",
        " payments",
        " payments-gateway",
        " sdk",
        " tanzania",
        " ussd",
        " zenopay"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "be3f266ae404b32d4101ca99a5b9a013e707b1b6b97fd3ea50b736dd7d387597",
                "md5": "797e413ad95b8ef21c03283799b094c1",
                "sha256": "f07d5585575658b146a2fbc1e630223f7f68f2641c1ffa5fecfa57e345a56f57"
            },
            "downloads": -1,
            "filename": "zenopay_sdk-0.3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "797e413ad95b8ef21c03283799b094c1",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 31277,
            "upload_time": "2025-07-27T07:07:13",
            "upload_time_iso_8601": "2025-07-27T07:07:13.320743Z",
            "url": "https://files.pythonhosted.org/packages/be/3f/266ae404b32d4101ca99a5b9a013e707b1b6b97fd3ea50b736dd7d387597/zenopay_sdk-0.3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "153b7e501fd020bdd499fac4941d1c7ea96ef4f8b9eeef659ee2efb121eb41d5",
                "md5": "736dda3463b66d9edaa695279d3034d5",
                "sha256": "869d05a055e738aa2cf6042db513e3835a6cba2122913d55a55fe6a9800dc1f0"
            },
            "downloads": -1,
            "filename": "zenopay_sdk-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "736dda3463b66d9edaa695279d3034d5",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 22493,
            "upload_time": "2025-07-27T07:07:14",
            "upload_time_iso_8601": "2025-07-27T07:07:14.768432Z",
            "url": "https://files.pythonhosted.org/packages/15/3b/7e501fd020bdd499fac4941d1c7ea96ef4f8b9eeef659ee2efb121eb41d5/zenopay_sdk-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-27 07:07:14",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "elusionhub",
    "github_project": "zenopay-python-sdk",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "black",
            "specs": [
                [
                    "==",
                    "25.1.0"
                ]
            ]
        },
        {
            "name": "bump-my-version",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "flake8-pyproject",
            "specs": [
                [
                    "==",
                    "1.2.3"
                ]
            ]
        },
        {
            "name": "ginx",
            "specs": [
                [
                    "==",
                    "0.1.6"
                ]
            ]
        },
        {
            "name": "httpx",
            "specs": [
                [
                    "==",
                    "0.28.1"
                ]
            ]
        },
        {
            "name": "pip-check-updates",
            "specs": [
                [
                    "==",
                    "0.27.0"
                ]
            ]
        },
        {
            "name": "pydantic",
            "specs": [
                [
                    "==",
                    "2.11.7"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "==",
                    "8.4.1"
                ]
            ]
        },
        {
            "name": "pytest-cov",
            "specs": [
                [
                    "==",
                    "6.2.1"
                ]
            ]
        },
        {
            "name": "python-dotenv",
            "specs": [
                [
                    "==",
                    "1.1.1"
                ]
            ]
        },
        {
            "name": "typing-extensions",
            "specs": [
                [
                    "==",
                    "4.14.0"
                ]
            ]
        }
    ],
    "lcname": "zenopay-sdk"
}
        
Elapsed time: 1.54039s