Python SDK for Cambodia Bakong Open API — handmade, no third-party Bakong dependencies.
Built for learning purposes only.
pip install pybakong python-dotenv qrcode[pil]Create a .env file in your project root:
BAKONG_TOKEN=your_token_here
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")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")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": "..."
# }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/xxxxxresult = client.check_bakong_account("username@bank")
print(result)
# {
# "fullName": "John Doe",
# "accountStatus": "ACTIVATED",
# "canReceive": True,
# ...
# }pip install pytest python-dotenv
pytest tests/ -vUnit tests run without a token. Live integration tests require BAKONG_TOKEN in .env.