Skip to content

limkhysok/pybakong

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pybakong

Python SDK for Cambodia Bakong Open API — handmade, no third-party Bakong dependencies.

Built for learning purposes only.


Installation

pip install pybakong python-dotenv qrcode[pil]

Setup

Create a .env file in your project root:

BAKONG_TOKEN=your_token_here

Token Management

from pybakong import BakongClient, BakongAPIError

client = BakongClient()

# Step 1: Request a verification code to your email
client.request_token("your@email.com", "MyOrg", "MyProject")

# Step 2: Verify the code and get a token
token = client.verify_token("12345678901234567890")  # 20-char code from email
print(token)

# Step 3: Renew token when it expires
token = client.renew_token("your@email.com")

Generate KHQR

from pybakong import generate_khqr, generate_md5
import qrcode

# Generate a KHQR string
qr_string = generate_khqr(
    bank_account="username@bank",   # your Bakong account ID
    merchant_name="Your Name",
    merchant_city="Phnom Penh",
    amount=0.10,                    # fixed amount (omit for open amount)
    currency="USD",                 # "USD" or "KHR"
    expiration=1,                   # QR expires in 1 minute
)

# Get MD5 hash (used to check payment status)
md5 = generate_md5(qr_string)
print("MD5:", md5)

# Save as scannable image
qrcode.make(qr_string).save("qr.png")

Check Transaction Status

import os
from dotenv import load_dotenv
from pybakong import BakongClient, BakongAPIError

load_dotenv()
client = BakongClient()
client.token = os.environ["BAKONG_TOKEN"]

# Check by MD5 (from generate_md5)
result = client.check_transaction_md5("d60f3db96913029a2af979a1662c1e72")

# Check by full hash (64-char hex)
result = client.check_transaction_hash("8465d722d7d5065f2886f0a474a4d34dc6a785...")

# Check by short hash (first 8 chars of hash) + amount + currency
result = client.check_transaction_short("8465d722", amount=0.10, currency="USD")

print(result)
# {
#   "hash": "8465d722...",
#   "fromAccountId": "sender@bank",
#   "toAccountId": "receiver@bank",
#   "currency": "USD",
#   "amount": 0.10,
#   "description": "..."
# }

Generate Deeplink

deeplink = client.generate_deeplink(
    qr=qr_string,
    app_icon_url="https://example.com/icon.png",
    app_name="MyApp",
    app_deep_link_callback="myapp://payment/callback"
)
print(deeplink)  # https://bakong.page.link/xxxxx

Check Bakong Account

result = client.check_bakong_account("username@bank")
print(result)
# {
#   "fullName": "John Doe",
#   "accountStatus": "ACTIVATED",
#   "canReceive": True,
#   ...
# }

Run Tests

pip install pytest python-dotenv
pytest tests/ -v

Unit tests run without a token. Live integration tests require BAKONG_TOKEN in .env.

Releases

No releases published

Packages

 
 
 

Contributors

Languages