Skip to main content

A Python library for the Atmos payment provider

Project description

Atmos Payment Provider Python Library

A Python library for integrating with the Atmos payment provider API.

Installation

pip install atmos-payment

Features

  • Authentication handling with automatic token refresh
  • Payment processing (create, pre-apply, confirm transactions)
  • Card binding functionality
  • Transaction information retrieval
  • Error handling
  • Support for both single and multi-transactions
  • Support for OFD (fiscal) transactions
  • Callback validation utilities

Usage

Basic Usage

from atmos import AtmosClient, OfdItem, Transaction

# Initialize the client
client = AtmosClient(
    consumer_key="your_consumer_key",
    consumer_secret="your_consumer_secret",
    store_id="your_store_id",
    test_mode=True  # Set to False for production
)

# Create a transaction
transaction = client.create_transaction(
    amount=5000000,  # Amount in tiyins (50,000.00 currency units)
    account="12345",  # Your internal payment identifier
    terminal_id="your_terminal_id"  # Optional if you have only one terminal
)

# Get the transaction ID
transaction_id = transaction.transaction_id

# Pre-confirm the transaction with a card
client.pre_confirm_transaction(
    transaction_id=transaction_id,
    card_number="8600490744313347",
    expiry="2410"  # YYmm format
)

# Confirm the transaction with the OTP code
# For test cards, the OTP is always 111111
result = client.confirm_transaction(
    transaction_id=transaction_id,
    otp="111111"
)

# Check if the transaction was successful
if result.store_transaction and result.store_transaction.confirmed:
    print(f"Transaction {transaction_id} was successful!")
    print(f"Amount: {result.store_transaction.amount / 100:.2f}")
else:
    print("Transaction failed")

Creating an OFD Transaction

# Create OFD items
ofd_items = [
    OfdItem(
        ofd_code="XXXXXXXXX",
        name="Product 1",
        amount=300000,  # 3,000.00 currency units
        quantity=1
    ),
    OfdItem(
        ofd_code="XXXXXXXXX",
        name="Product 2",
        amount=200000,  # 2,000.00 currency units
        quantity=2
    )
]

# Create an OFD transaction
transaction = client.create_ofd_transaction(
    amount=500000,  # Total amount in tiyins
    account="12345",
    ofd_items=ofd_items
)

# Pre-confirm and confirm as usual
# ...

Creating Multiple Transactions

# Create transaction objects
transactions = [
    Transaction(
        account="user_1",
        amount=50000,
        details="For service 1"
    ),
    Transaction(
        account="user_2",
        amount=100000,
        details="For service 2"
    )
]

# Create multiple transactions
result = client.create_multi_transaction(transactions)

# Get the transaction IDs
transaction_ids = result.transaction_id

# Pre-confirm the transactions
client.pre_confirm_multi_transaction(
    transaction_ids=transaction_ids,
    card_number="8600490744313347",
    expiry="2410"
)

# Confirm the transactions
result = client.confirm_multi_transaction(
    transaction_ids=transaction_ids,
    otp="111111"
)

Card Binding

# Request to bind a card
binding = client.request_card_binding(
    card_number="8600490744313347",
    expiry="2410",
    phone="+998901234567"
)

binding_id = binding["binding_id"]

# Confirm the binding with the OTP code
client.confirm_card_binding(
    binding_id=binding_id,
    otp="111111"
)

# Get bound cards
cards = client.get_bound_cards()
for card in cards:
    print(f"Card: {card.masked_pan}, Token: {card.token}")

# Use a bound card for payment
client.pre_confirm_transaction(
    transaction_id=transaction_id,
    card_token=cards[0].token
)

# For token payments, the OTP is always 111111
client.confirm_transaction(
    transaction_id=transaction_id,
    otp="111111"
)

Handling Callbacks

from atmos.utils import validate_callback_signature, create_callback_response
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/atmos/callback', methods=['POST'])
def atmos_callback():
    data = request.json

    # Validate the signature
    if not validate_callback_signature(data, api_key="your_api_key"):
        return jsonify(create_callback_response(False, "Invalid signature")), 400

    # Process the payment
    store_id = data["store_id"]
    transaction_id = data["transaction_id"]
    invoice = data["invoice"]
    amount = data["amount"]

    # Your payment processing logic here
    # ...

    # Return a success response
    return jsonify(create_callback_response(True, "Payment processed successfully"))

Payment Page Integration

# Create a transaction
transaction = client.create_transaction(
    amount=5000000,
    account="12345"
)

# Get the payment page URL
payment_url = client.get_payment_page_url(
    transaction_id=transaction.transaction_id,
    redirect_url="https://your-website.com/payment/success"
)

# Redirect the user to the payment page
# In a web framework like Flask:
# return redirect(payment_url)

Error Handling

from atmos import AtmosError, AtmosAPIError, AtmosAuthError

try:
    # Attempt to create a transaction
    transaction = client.create_transaction(
        amount=5000000,
        account="12345"
    )
except AtmosAuthError as e:
    print(f"Authentication error: {e}")
except AtmosAPIError as e:
    print(f"API error: {e.code} - {e.message}")
except AtmosError as e:
    print(f"General error: {e}")

Testing

The library includes support for test mode, which uses the Atmos test environment. In test mode, you can use the test cards provided by Atmos:

  • PAN: 8600490744313347 Expiry: 10/24
  • PAN: 8600332914249390 Expiry: 09/25
  • PAN: 8600492993407481 Expiry: 10/24
  • PAN: 8600312990314318 Expiry: 08/23
  • PAN: 9860090101431907 Expiry: 05/25

For testing error scenarios:

  • PAN: 8600312987000557 Expiry: 12/22 - Processing error
  • PAN: 8600493214116133 Expiry: 10/24 - SMS not connected
  • PAN: 8600492986215602 Expiry: 03/20 - Expired card
  • PAN: 8600312998546358 Expiry: 10/23 - Insufficient funds

The OTP code for all test cards is 111111.

License

MIT

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

atmos_payment-0.1.0.tar.gz (25.2 kB view details)

Uploaded Source

Built Distributions

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

atmos_payment-0.1.0-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

atmos_payment-0.1.0-py2.py3-none-any.whl (10.4 kB view details)

Uploaded Python 2Python 3

File details

Details for the file atmos_payment-0.1.0.tar.gz.

File metadata

  • Download URL: atmos_payment-0.1.0.tar.gz
  • Upload date:
  • Size: 25.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for atmos_payment-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f8dd6e0a0ff8e28d43c745a9d69d2f9c3a6034fffb73f7198cee77ef9c6f6dc2
MD5 c15690168a57456b9a48754d45c82537
BLAKE2b-256 c7d4462c6e197f5d94c7ae0aae310bc597416414f709ae2ef07376d2760bc7be

See more details on using hashes here.

File details

Details for the file atmos_payment-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: atmos_payment-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for atmos_payment-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 278f85da3559cce244136b95bf6e7d53caff9f7472978459a37d493d5abaa753
MD5 64a1a040e56d6e0f1abc48f86a7cfcaa
BLAKE2b-256 f93269ab9d0e6df7f222f421bde7e1759d915bb2a3d61264283378d3081d009b

See more details on using hashes here.

File details

Details for the file atmos_payment-0.1.0-py2.py3-none-any.whl.

File metadata

  • Download URL: atmos_payment-0.1.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.7

File hashes

Hashes for atmos_payment-0.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 de35117b6fd8004608e5c29678a2af17cdf7ae461bbc65ee054c1c82117c37ab
MD5 4df8209aeffa41a387d8081c5129a1dc
BLAKE2b-256 7ea160af435b947d84505e3810a750e18094a863efb3f2b2203d629c91114333

See more details on using hashes here.

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