شارژ كيف پول
متال استفاده از پي اكسا براي شارڑ كيف پول - پايتون/فلسك
دانلود ثبت شده
51
آخرین بروزرسانی
2026-09-25
حجم بسته
12.3 KB
منتشرکننده
مدیر ارشد سامانه
وضعیت نمایش
عمومی و فعال
در این صفحه بسته های آماده برای اتصال به سرویس پرداخت، افزونه های کمکی و مثال های اجرایی را مثل یک ریپازیتوری مرور می کنید: فایل ها را می بینید، README را می خوانید و کل بسته را با یک دانلود می گیرید.
CONTROLLED RELEASE
انتشار کنترل شده از پنل رسمی
هر بسته از مسیر مدیریتی رسمی پی اکسا منتشر می شود و قبل از دانلود، اطلاعات کلیدی آن به صورت شفاف نمایش داده می شود.
PRE-DOWNLOAD VISIBILITY
شفافیت محتوا پیش از دریافت
پیش نمایش README، مرور ساختار فایل و نمایش متادیتای بسته کمک می کند قبل از دانلود، ارزیابی دقیق تری از محتوا داشته باشید.
TRUST PROFILE
نمای رسمی تر برای انتخاب ابزار
صفحه بر پایه شفافیت انتشار، نمایش منبع README، تاریخ بروزرسانی و آمار دانلود چیده شده تا حس ارزیابی حرفه ای تری منتقل کند.
مرجع حقوقی و هویتی کنار دسترس
ساختار صفحه طوری چیده شده که اطلاعات انتشار، محتوای فایل ها و جزئیات هر بسته بدون شلوغی اضافه در دسترس باشند.
متال استفاده از پي اكسا براي شارڑ كيف پول - پايتون/فلسك
دانلود ثبت شده
51
آخرین بروزرسانی
2026-09-25
حجم بسته
12.3 KB
منتشرکننده
مدیر ارشد سامانه
وضعیت نمایش
عمومی و فعال
پوشه جاری را انتخاب کنید یا برای فایل های متنی پیش نمایش بگیرید.
| نام | نوع | اندازه |
|---|---|---|
| بازگشت به پوشه قبل | پوشه | - |
| templates | پوشه | - |
| __init__.py | قابل پیش نمایش | 1.3 KB |
| models.py | قابل پیش نمایش | 2.1 KB |
| payment_gateway.py | قابل پیش نمایش | 2.5 KB |
| routes.py | قابل پیش نمایش | 7.9 KB |
app/routes.py
from __future__ import annotations
import json
from datetime import datetime, timezone
from uuid import uuid4
from flask import Blueprint, current_app, flash, redirect, render_template, request, url_for
from .models import TopupOrder, Wallet, db
from .payment_gateway import PayexaGatewayClient
web_bp = Blueprint("web", __name__)
def _gateway_client() -> PayexaGatewayClient:
return PayexaGatewayClient(
base_url=current_app.config["PAYEXA_BASE_URL"],
api_key=current_app.config["PAYEXA_API_KEY"],
request_endpoint=current_app.config["PAYEXA_REQUEST_ENDPOINT"],
verify_endpoint=current_app.config["PAYEXA_VERIFY_ENDPOINT"],
timeout_seconds=current_app.config["PAYEXA_TIMEOUT_SECONDS"],
)
def _single_wallet() -> Wallet:
wallet = Wallet.query.first()
if wallet is None:
wallet = Wallet(owner_name="Demo User", balance=0)
db.session.add(wallet)
db.session.commit()
return wallet
@web_bp.get("/")
def index():
wallet = _single_wallet()
orders = TopupOrder.query.order_by(TopupOrder.created_at.desc()).limit(15).all()
return render_template(
"index.html",
wallet=wallet,
orders=orders,
badge_script_url=current_app.config.get("PAYEXA_BADGE_SCRIPT_URL", ""),
)
@web_bp.post("/wallet/charge")
def wallet_charge():
wallet = _single_wallet()
raw_amount = (request.form.get("amount") or "").strip()
if not raw_amount.isdigit() or int(raw_amount) <= 0:
flash("مبلغ نامعتبر است.", "error")
return redirect(url_for("web.index"))
amount = int(raw_amount)
order_ref = f"TOPUP-{uuid4().hex[:12].upper()}"
order = TopupOrder(
order_ref=order_ref,
amount=amount,
wallet_id=wallet.id,
status="pending",
)
db.session.add(order)
db.session.commit()
callback_url = request.url_root.rstrip("/") + current_app.config["PAYEXA_CALLBACK_PATH"]
gateway = _gateway_client()
response = gateway.request_payment(amount=amount, callback_url=callback_url, order_ref=order_ref)
if not response.ok:
order.status = "request_failed"
order.verify_response = json.dumps(response.data, ensure_ascii=False)
db.session.commit()
flash(
(
"خطا در ایجاد پرداخت. "
f"url={response.request_url} status={response.status_code} "
f"detail={response.error or response.data}"
),
"error",
)
return redirect(url_for("web.index"))
authority = (response.data.get("authority") or "").strip()
gateway_order_id = (response.data.get("order_id") or "").strip()
amount_unique = response.data.get("amount_unique")
if not authority:
order.status = "request_invalid_response"
order.verify_response = json.dumps(response.data, ensure_ascii=False)
db.session.commit()
flash("پاسخ درگاه authority نداشت.", "error")
return redirect(url_for("web.index"))
order.status = "requested"
order.authority = authority
order.gateway_order_id = gateway_order_id or None
if amount_unique is not None:
# In this gateway, verify token can be the unique charged amount.
order.gateway_token = str(amount_unique)
order.verify_response = json.dumps(response.data, ensure_ascii=False)
db.session.commit()
return redirect(gateway.build_start_pay_url(authority, current_app.config["PAYEXA_STARTPAY_PATH"]))
@web_bp.route("/payments/callback", methods=["GET", "POST"])
def payment_callback():
wallet = _single_wallet()
payload = _collect_callback_payload()
callback_status = (payload.get("status") or "").strip().upper()
authority = (payload.get("authority") or "").strip()
gateway_order_id = (payload.get("order_id") or "").strip()
token = str(payload.get("token") or "").strip()
if callback_status and callback_status != "OK":
return render_template(
"payment_result.html",
ok=False,
title="پرداخت ناموفق یا لغو شده",
message=f"وضعیت بازگشتی درگاه: {callback_status}",
wallet=wallet,
payload=payload,
)
order = None
if gateway_order_id:
order = TopupOrder.query.filter_by(gateway_order_id=gateway_order_id).first()
if order is None and authority:
order = TopupOrder.query.filter_by(authority=authority).first()
if order is None:
return render_template(
"payment_result.html",
ok=False,
title="سفارش پیدا نشد",
message="سفارش مرتبط با callback یافت نشد.",
wallet=wallet,
payload=payload,
)
if not gateway_order_id:
gateway_order_id = (order.gateway_order_id or "").strip()
if not token:
token = str(order.gateway_token or "").strip()
order.callback_payload = json.dumps(payload, ensure_ascii=False)
if token:
order.gateway_token = token
db.session.commit()
if order.credited:
return render_template(
"payment_result.html",
ok=True,
title="پرداخت قبلا ثبت شده",
message="این سفارش قبلا وریفای و به کیف پول اضافه شده است.",
wallet=wallet,
payload=payload,
)
if not gateway_order_id or not token:
order.status = "callback_invalid"
db.session.commit()
return render_template(
"payment_result.html",
ok=False,
title="callback ناقص",
message="order_id یا token در callback موجود نیست.",
wallet=wallet,
payload=payload,
)
verify_response = _gateway_client().verify_payment(order_id=gateway_order_id, token=token)
order.verify_status_code = verify_response.status_code
order.verify_response = json.dumps(verify_response.data, ensure_ascii=False)
if verify_response.status_code == 200 and not order.credited:
order.status = "verified"
order.credited = True
order.paid_at = datetime.now(timezone.utc)
wallet.balance += order.amount
db.session.commit()
return render_template(
"payment_result.html",
ok=True,
title="شارژ موفق کیف پول",
message=f"مبلغ {order.amount:,} با موفقیت به کیف پول اضافه شد.",
wallet=wallet,
payload=verify_response.data,
)
if verify_response.status_code == 201:
order.status = "already_verified"
db.session.commit()
return render_template(
"payment_result.html",
ok=True,
title="قبلا وریفای شده",
message="این پرداخت قبلا وریفای شده است و دوباره افزایش موجودی انجام نشد.",
wallet=wallet,
payload=verify_response.data,
)
order.status = "verify_failed"
db.session.commit()
return render_template(
"payment_result.html",
ok=False,
title="وریفای ناموفق",
message=f"در وریفای خطا رخ داد. status={verify_response.status_code}",
wallet=wallet,
payload=verify_response.data,
)
@web_bp.get("/orders/<order_ref>")
def order_status(order_ref: str):
wallet = _single_wallet()
order = TopupOrder.query.filter_by(order_ref=order_ref).first_or_404()
return render_template("order_status.html", wallet=wallet, order=order)
def _collect_callback_payload() -> dict:
if request.is_json:
body = request.get_json(silent=True)
if isinstance(body, dict):
return body
if request.form:
return request.form.to_dict(flat=True)
if request.args:
return request.args.to_dict(flat=True)
return {}
منبع: README.md
An example Flask project for wallet top-up using Payexa payment gateway.
This demo covers the complete server-side payment flow:
/v1/payment/request)/v1/payment/verify)credited flagrun.py: app entrypointapp/__init__.py: app factory and config loadingapp/models.py: database modelsapp/payment_gateway.py: Payexa HTTP clientapp/routes.py: web routes and payment flowapp/templates/: UI templatespython3 -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 URLPAYEXA_API_KEY: your merchant API keyflask --app run.py --debug run
Open http://127.0.0.1:5000/.
See .env.example for all options.
Important keys:
PAYEXA_BASE_URL=https://sandbox.pexn.ir (production: https://pay.pexn.ir)PAYEXA_STARTPAY_PATH=/startPayPAYEXA_REQUEST_ENDPOINT=/v1/payment/requestPAYEXA_VERIFY_ENDPOINT=/v1/payment/verifyPAYEXA_CALLBACK_PATH=/payments/callbackPAYEXA_BADGE_SCRIPT_URL=https://pexn.ir/merchant-badge.js?token=... (template already renders the required badge <div>)Before publishing this project as an example on your website or GitHub:
.env or any real API key..env.example.PAYEXA_BASE_URL to https://pay.pexn.ir.200 as success and 201 as already-verified.Use this project as an educational example. Add your preferred license before public release.
اين پروژه يک نمونه عملي براي يکپارچه سازي درگاه پرداخت Payexa در يک وب اپليکيشن Flask است.
جريان کامل پرداخت در اين دمو:
/v1/payment/request)/v1/payment/verify)creditedrun.py: نقطه شروع اجراي برنامهapp/__init__.py: بارگذاري تنظيمات و ساخت اپapp/models.py: مدل هاي پايگاه دادهapp/payment_gateway.py: لايه ارتباط با Payexaapp/routes.py: مسيرها و منطق جريان پرداختapp/templates/: قالب هاي رابط کاربريpython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
سپس مقادير واقعي را در .env قرار دهيد:
PAYEXA_BASE_URLPAYEXA_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/
verify با کد 201، افزايش موجودي مجدد انجام ندهيد..env و کليدهاي واقعي را commit نکنيد..env.example فقط مقادير نمونه نگه داريد.PAYEXA_BASE_URL=https://pay.pexn.ir استفاده کنيد.localhost (مثل badge) را با URL عمومي جايگزين کنيد.من دستیار پی اکسا هستم، شما را در تمام مسیر راهنمایی میکنم و اگر به من نیازی ندارید با ۲ بار کلیک خاموش میشوم.