مرکز ابزارها، افزونه ها و مثال های اتصال

در این صفحه بسته های آماده برای اتصال به سرویس پرداخت، افزونه های کمکی و مثال های اجرایی را مثل یک ریپازیتوری مرور می کنید: فایل ها را می بینید، README را می خوانید و کل بسته را با یک دانلود می گیرید.

CONTROLLED RELEASE

انتشار کنترل شده از پنل رسمی

هر بسته از مسیر مدیریتی رسمی پی اکسا منتشر می شود و قبل از دانلود، اطلاعات کلیدی آن به صورت شفاف نمایش داده می شود.

PRE-DOWNLOAD VISIBILITY

شفافیت محتوا پیش از دریافت

پیش نمایش README، مرور ساختار فایل و نمایش متادیتای بسته کمک می کند قبل از دانلود، ارزیابی دقیق تری از محتوا داشته باشید.

TRUST PROFILE

نمای رسمی تر برای انتخاب ابزار

صفحه بر پایه شفافیت انتشار، نمایش منبع README، تاریخ بروزرسانی و آمار دانلود چیده شده تا حس ارزیابی حرفه ای تری منتقل کند.

مرجع حقوقی و هویتی کنار دسترس

ساختار صفحه طوری چیده شده که اطلاعات انتشار، محتوای فایل ها و جزئیات هر بسته بدون شلوغی اضافه در دسترس باشند.

مثال repository / wallet-top-up-web

شارژ كيف پول

متال استفاده از پي اكسا براي شارڑ كيف پول - پايتون/فلسك

دانلود بسته
12 فایل payexa-wallet-demo-install.zip README: README.md

دانلود ثبت شده

50

آخرین بروزرسانی

2026-09-25

حجم بسته

12.3 KB

منتشرکننده

مدیر ارشد سامانه

وضعیت نمایش

عمومی و فعال

پیش نمایش فایل

app/models.py

from datetime import datetime, timezone from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Wallet(db.Model): __tablename__ = "wallets" id = db.Column(db.Integer, primary_key=True) owner_name = db.Column(db.String(100), nullable=False) balance = db.Column(db.BigInteger, nullable=False, default=0) created_at = db.Column(db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) updated_at = db.Column( db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), ) orders = db.relationship("TopupOrder", back_populates="wallet", lazy="dynamic") class TopupOrder(db.Model): __tablename__ = "topup_orders" id = db.Column(db.Integer, primary_key=True) order_ref = db.Column(db.String(50), nullable=False, unique=True, index=True) amount = db.Column(db.BigInteger, nullable=False) status = db.Column(db.String(40), nullable=False, default="pending", index=True) credited = db.Column(db.Boolean, nullable=False, default=False) authority = db.Column(db.String(128), nullable=True, unique=True) gateway_order_id = db.Column(db.String(128), nullable=True, unique=True, index=True) gateway_token = db.Column(db.String(128), nullable=True) callback_payload = db.Column(db.Text, nullable=True) verify_status_code = db.Column(db.Integer, nullable=True) verify_response = db.Column(db.Text, nullable=True) paid_at = db.Column(db.DateTime, nullable=True) created_at = db.Column(db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) updated_at = db.Column( db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), ) wallet_id = db.Column(db.Integer, db.ForeignKey("wallets.id"), nullable=False) wallet = db.relationship("Wallet", back_populates="orders") def init_default_wallet() -> None: existing = Wallet.query.first() if existing: return wallet = Wallet(owner_name="Demo User", balance=0) db.session.add(wallet) db.session.commit()

README / توضیحات

منبع: README.md

Payexa Wallet Demo (Flask)

An example Flask project for wallet top-up using Payexa payment gateway.

This demo covers the complete server-side payment flow:

  1. Create top-up order in local database
  2. Request payment from Payexa (/v1/payment/request)
  3. Redirect user to Payexa start pay page
  4. Receive callback in your app
  5. Verify payment with Payexa (/v1/payment/verify)
  6. Credit wallet only on successful verify (idempotent)

Features

  • Flask + SQLAlchemy (SQLite)
  • Wallet and top-up order models
  • Full order lifecycle statuses
  • Server-side verify before crediting balance
  • Idempotent crediting using credited flag
  • Stores callback payload and verify response for debugging

Project Structure

  • run.py: app entrypoint
  • app/__init__.py: app factory and config loading
  • app/models.py: database models
  • app/payment_gateway.py: Payexa HTTP client
  • app/routes.py: web routes and payment flow
  • app/templates/: UI templates

Local Setup

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

Then set real values in .env:

  • PAYEXA_BASE_URL: sandbox or production URL
  • PAYEXA_API_KEY: your merchant API key

Run

flask --app run.py --debug run

Open http://127.0.0.1:5000/.

Environment Variables

See .env.example for all options.

Important keys:

  • PAYEXA_BASE_URL=https://sandbox.pexn.ir (production: https://pay.pexn.ir)
  • PAYEXA_STARTPAY_PATH=/startPay
  • PAYEXA_REQUEST_ENDPOINT=/v1/payment/request
  • PAYEXA_VERIFY_ENDPOINT=/v1/payment/verify
  • PAYEXA_CALLBACK_PATH=/payments/callback
  • PAYEXA_BADGE_SCRIPT_URL=https://pexn.ir/merchant-badge.js?token=... (template already renders the required badge <div>)

Publish Checklist

Before publishing this project as an example on your website or GitHub:

  1. Do not commit .env or any real API key.
  2. Keep only placeholder values in .env.example.
  3. Set production PAYEXA_BASE_URL to https://pay.pexn.ir.
  4. Use a public HTTPS domain for callback URL.
  5. Disable debug mode in production runtime.
  6. Replace any localhost-only scripts (for example trust badge scripts) with public URL.
  7. Use a production-grade DB (PostgreSQL/MySQL) instead of SQLite if needed.

Payment Safety Notes

  • Never credit wallet balance directly from callback status alone.
  • Always verify transaction server-to-server with Payexa.
  • Handle verify 200 as success and 201 as already-verified.
  • Keep idempotency guard to prevent duplicate balance increase.

License

Use this project as an educational example. Add your preferred license before public release.


نسخه رسمي فارسي

معرفي پروژه

اين پروژه يک نمونه عملي براي يکپارچه سازي درگاه پرداخت Payexa در يک وب اپليکيشن Flask است.

جريان کامل پرداخت در اين دمو:

  1. ايجاد سفارش شارژ در پايگاه داده محلي
  2. ارسال درخواست پرداخت به Payexa (/v1/payment/request)
  3. هدايت کاربر به صفحه پرداخت Payexa
  4. دريافت callback در اپليکيشن
  5. وريفاي تراکنش با Payexa (/v1/payment/verify)
  6. افزايش موجودي کيف پول فقط بعد از وريفاي موفق (idempotent)

ويژگي ها

  • پياده سازي با Flask و SQLAlchemy
  • مدل کيف پول و سفارش شارژ
  • مديريت چرخه کامل وضعيت سفارش
  • اعتبارسنجي نهايي سمت سرور قبل از افزايش موجودي
  • جلوگيري از افزايش تکراري موجودي با credited
  • ذخيره payload هاي callback و verify براي تحليل و خطايابي

ساختار پروژه

  • run.py: نقطه شروع اجراي برنامه
  • app/__init__.py: بارگذاري تنظيمات و ساخت اپ
  • app/models.py: مدل هاي پايگاه داده
  • app/payment_gateway.py: لايه ارتباط با Payexa
  • app/routes.py: مسيرها و منطق جريان پرداخت
  • app/templates/: قالب هاي رابط کاربري

راه اندازي محلي

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

سپس مقادير واقعي را در .env قرار دهيد:

  • PAYEXA_BASE_URL
  • PAYEXA_API_KEY

نمونه تنظيمات مهم:

PAYEXA_BASE_URL=https://sandbox.pexn.ir
PAYEXA_API_KEY=YOUR_API_KEY
PAYEXA_STARTPAY_PATH=/startPay
PAYEXA_REQUEST_ENDPOINT=/v1/payment/request
PAYEXA_VERIFY_ENDPOINT=/v1/payment/verify
PAYEXA_CALLBACK_PATH=/payments/callback
PAYEXA_TIMEOUT_SECONDS=12
PAYEXA_BADGE_SCRIPT_URL=https://pexn.ir/merchant-badge.js?token=YOUR_BADGE_TOKEN

اجرا

flask --app run.py --debug run

آدرس برنامه:

http://127.0.0.1:5000/

نکات امنيتي و عملياتي

  • کليد API را فقط در سمت سرور نگه داريد.
  • صرف callback را ملاک افزايش موجودي قرار ندهيد.
  • افزايش موجودي فقط بعد از verify موفق انجام شود.
  • براي verify با کد 201، افزايش موجودي مجدد انجام ندهيد.

چک ليست انتشار عمومي

  1. فايل .env و کليدهاي واقعي را commit نکنيد.
  2. در .env.example فقط مقادير نمونه نگه داريد.
  3. در محيط production از PAYEXA_BASE_URL=https://pay.pexn.ir استفاده کنيد.
  4. آدرس callback را روي دامنه عمومي HTTPS تنظيم کنيد.
  5. حالت debug را در production خاموش کنيد.
  6. اسکریپت هاي وابسته به localhost (مثل badge) را با URL عمومي جايگزين کنيد.
  7. در انتشار واقعي، به جاي SQLite از PostgreSQL/MySQL استفاده کنيد.
PAYEXA ASSISTANT

من دستیار پی اکسا هستم، شما را در تمام مسیر راهنمایی می‌کنم و اگر به من نیازی ندارید با ۲ بار کلیک خاموش می‌شوم.