نمونه کد پایتون

کیت پایتون فینوپال برای اتصال درگاه در پروژه‌های سمت سرور است. مبلغ‌ها به ریال و حداقل ۱۰۰۰ ریال هستند.

زبان
Python 3.9+
بسته
finopal-py-sdk
وابستگی
requests

نصب

پیش‌نیاز: Python نسخه ۳.۹ یا بالاتر و pip.

تا زمان انتشار روی PyPI، بسته را از مسیر محلی نصب کنید. بعد از انتشار:

pip install finopal-py-sdk

معادل: pip3 install finopal-py-sdk

پیکربندی

مرچنت‌کد را از پنل کاربری بردارید. برای محیط آزمایشی sandbox را true بگذارید. میزبان واقعی https://payment.finopal.ir و سندباکس https://sandbox.finopal.ir است.

from finopal import FinoPal, Config

finopal = FinoPal(Config(
    merchant_id="fino-xxxx-xxxx-xxxx-xxxx",
    sandbox=False,
))

درخواست پرداخت

order_id و description الزامی‌اند. توضیحات حداکثر ۲۵۵ کاراکتر و شماره سفارش حداکثر ۱۰۰ کاراکتر است. کاربر را به payment_url بفرستید.

payment = finopal.payments.create({
    "amount": 10000,
    "callback_url": "https://shop.example/callback",
    "description": "سفارش ۱۲۳۴۵",
    "order_id": "ORD-12345",
    "mobile": "09123456789",
    "email": "customer@example.com",
})

url = payment.payment_url or finopal.payments.generate_payment_url(payment.authority)

تأیید پرداخت

فقط وقتی Status=OK است (در سندباکس Status=0) تأیید کنید. مبلغ باید همان مبلغ درخواست باشد. کد ۱۰۰ تازه تأییدشده و کد ۱۰۱ قبلاً تأییدشده است.

from finopal import parse_callback

cb = parse_callback(request.args)
if cb.is_success:
    result = finopal.verifications.verify({
        "amount": order_amount_rial,
        "authority": cb.authority,
    })
    print(result.ref_id)

استعلام تراکنش

استعلام وضعیت را عوض نمی‌کند. اگر verify به‌خاطر قطع شبکه نامعلوم ماند، به‌جای ساخت پرداخت تازه استعلام بگیرید. وضعیت‌ها: pending، successful، failed، cancelled، refunded و callback.

status = finopal.inquiries.inquire({"authority": authority})
print(status.status, status.is_paid)

ریورس تراکنش

فقط روی تراکنش تأییدشده و در بازه کوتاه پس از تأیید.

finopal.reversals.reverse({"authority": authority})

محاسبه کارمزد

fee_type برابر Merchant یعنی کارمزد روی پذیرنده و Payer یعنی روی خریدار است.

fee = finopal.fees.calculate({"amount": 1000000})
print(fee.fee, fee.fee_type)

خطا

کلاسمعنی
ValidationErrorورودی نامعتبر؛ درخواستی ارسال نشده
FinoPalExceptionگیت‌وی درخواست را رد کرده و کد خطا دارد
TransportErrorشبکه یا پاسخ نامعتبر. نتیجه نامعلوم است؛ استعلام بگیرید

کدهای پرکاربرد: ۱۰۰ و ۱۰۱ موفق، ۹− اعتبارسنجی، ۱۱− درگاه یا تراکنش پیدا نشد، ۱۴− دامنه بازگشت با دامنه ثبت‌شده یکی نیست، ۵۰− مبلغ تأیید با مبلغ درخواست فرق دارد.