Skip to content

Home

setu is a Python SDK for accessing Setu’s UPI Deeplinks APIs. The SDK is designed with ease of access in mind, with native Python class objects for inputs & ouputs and custom exceptions.

Version Downloads License

SDK in action

Getting started

SDK documentation →
Full documentation →
Product overview →

Installation

pip install setu

Features

  • Full support for latest UPI Deeplinks APIs
  • Native Python class objects for all inputs & responses
  • Allows both JWT & OAuth authentication mechanisms
  • SANDBOX mode to test integration & PRODUCTION for live data
  • Internal mechanism for OAuth authentication to automatically re-fetch token when current one expires, and retry all failed requests.

Examples

Setup

from setu import Deeplink
from setu.contract import RefundRequestItem, SetuAPIException

dl = Deeplink(
    scheme_id="c4f57443-dc1e-428f-8c4e-e5fd531057d2",
    secret="5b288618-473f-4193-ae1b-8c42f223798e",
    product_instance_id="861023031961584801",
    auth_type="OAUTH",
    mode="SANDBOX",
)
bill_amount = 100
try:
    link = dl.create_payment_link(
        amount_value=bill_amount,
        biller_bill_id="test_transaction_1234",
        amount_exactness="EXACT",
        payee_name="Python SDK unittest",
        transaction_note="unittest transaction",
    )
    assert link.payment_link.upi_id == "refundtest@kaypay"
except SetuException as e:
    assert False
try:
    link_status = dl.check_payment_status(link.platform_bill_id)
    assert link_status.status == "BILL_CREATED"
except SetuAPIException as e:
    assert False
try:
    credit_response = dl.trigger_mock_payment(
        float(bill_amount) / 100, link.payment_link.upi_id, link.platform_bill_id
    )
except SetuAPIException as e:
    assert False

Mock Settlement

try:
    dl.trigger_mock_settlement([credit_response.utr])
except SetuAPIException as e:
    assert False

Expire bill payment

try:
    dl.expire_payment_link(link.platform_bill_id)
except SetuAPIException as e:
    assert False

Initiate Refund

try:
    batch_initiate_refund_response = dl.initiate_batch_refund(
        refunds=[
            RefundRequestItem(
                identifier=link.platform_bill_id,
                identifierType="BILL_ID",
                refundType="FULL",
            ),
        ],
    )
    assert batch_initiate_refund_response.refunds[0].status == "Pending"
except SetuAPIException as e:
    assert False

Get refund batch status

try:
    refund_batch_status_response = dl.get_batch_refund_status(batch_initiate_refund_response.batch_id)
    assert refund_batch_status_response.refunds[0].bill_id == link.platform_bill_id
except SetuAPIException as e:
    assert False

Get individual refund status

try:
    refund_status_response = dl.get_refund_status(batch_initiate_refund_response.refunds[0].id)
    assert refund_status_response.bill_id == link.platform_bill_id
except SetuAPIException as e:
    assert False

Contributing

Have a look through existing Issues and Pull Requests that you could help with. If you'd like to request a feature or report a bug, please create a GitHub Issue using the template provided.

See contribution guide →

Credits

This package was created with Cookiecutter and the waynerv/cookiecutter-pypackage project template.

License

MIT. Have at it.