• 1403/07/19

تنظیمات مناسب زرین پال مهر 1403 :

با سلام و عرض احترام خدمت دوستان گرامی و استاد عزیز اردوخانی؛ نمیدونم آیا اینجا محل مناسبی هست برای این کار یا خیر اما میخواستم مدل صحیح زرین پال رو خدمتتون ارائه بدم چرا که طی گذر زمان تغیراتی داشته و باعث میشه اون مدلی که استاد اردوخانی در زمان ظبط اموزش انجام دادن الان کار نکنه، جالب اینه مدلی که همین الان زرین پال به عنوان نمونه جنگو ارائه داده هم کار نمیکنه.

 

1- اولین پیش نیاز نصب کتابخانه ی requests هست که با کد زیر میتونید اون رو نصب کنید:

pip install requests

 

2- بعدش در فایل settings.py این تنظیمات رو قرار بدین:

# Zarinpal Settings in settings.py
MERCHANT = "00000000-0000-0000-0000-000000000000"
SANDBOX = True

در متغیر MERCHANT شما باید کد 36 رقمی که بعد از احراز هویت زرین پال بهتون تحویل میده رو قرار بدین اما در حالت توسعه میتونید از همین کد فیک استفاده کنید، اما حتما پرش کنید چون خطا میده.

متغییر SANDBOX هم همون کنترل بروی حالت واقعی یا حالت توسعه هست. زمانی که در حال طراحی هستین اونو True قرار بدین تا بتونید منطق لازم رو پیاده سازی کنید و وقتی پروژه پابلیش شد اونو False کنید.

 

3- قدم بعد ثبت url های لازم برای زرین پال در فایل urls.py هستش:

# urls.py
urlpatterns = [
    path('request/', views.request_payment, name='request_payment'),
    path('verify/', views.verify_payment, name='verify_payment')
]

 

4- اما view های مورد نیاز ما! دوستان توجه فرمایید که این حالت کلی هستش و شما بسته به نوع نیاز و طراحیتون باید تغیراتی در منطق و اطلاعات انجام بدین:

# views.py
import json
import requests
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import redirect, render

if settings.SANDBOX:
    sandbox = 'sandbox'
else:
    sandbox = 'payment'

ZP_API_REQUEST = f"https://{sandbox}.zarinpal.com/pg/v4/payment/request.json"
ZP_API_STARTPAY = f"https://{sandbox}.zarinpal.com/pg/StartPay/"
ZP_API_VERIFY = f"https://{sandbox}.zarinpal.com/pg/v4/payment/verify.json"

description = "نهایی کردن خرید شما از سایت ما" # it's only an example

price = 100000 # it's only an example
CallbackURL = 'http://localhost:8000/verify/' # you should customize it

این تنظیمات باعث داینامیک شدن ادرس های مورد نیاز ما میشه که بسته به حالت واقعی یا توسعه بودن پروژه، ادرس ها تولید میشن. همچنین توجه فرمایید متغیر price فقط جهت پیش بردن مثال قرار داده شده و شما باید اونو نسبت به مدل و منطق پروژتون داخل view ها قرار بدین. همچنین توجه فرمایید CallbackURL منطبق با پروژه یا دامنه ی شما باشه.

 

# views.py
def request_payment(request):
    data = {
        "merchant_id": settings.MERCHANT,
        "amount": price,
        "description": description,
        "callback_url": CallbackURL,
    }
    data = json.dumps(data)

    headers = {'content-type': 'application/json', 'content-length': str(len(data))}

    response = requests.post(ZP_API_REQUEST, data=data, headers=headers)

    if response.status_code == 200:
        response = response.json()

        if response["data"]['code'] == 100:
            url = f"{ZP_API_STARTPAY}{response["data"]['authority']}"
            return redirect(url)

        else:
            return HttpResponse(str(response['errors']))

    else:
        return HttpResponse("مشکلی پیش آمد.")

یکی از موارد عجیب نام گذاری متغیرهای Json هست که باید دقت بشه.

باز هم تکرار میکنم عزیزان شما باید اینو بسته به نوع پروژتون تغییر بدین از جمله amount و پاسخ های سرور. در مرحله بعد تایید نهایی توسط  view زیر ارسال و دریافت میشه:

# views.py
def verify(request):
    status = request.GET.get('Status')
    authority = request.GET['Authority']

    if status == "OK":
        data = {
            "merchant_id": settings.MERCHANT,
            "amount": price,
            "authority": authority
        }
        data = json.dumps(data)

        headers = {'content-type': 'application/json', 'Accept': 'application/json'}

        response = requests.post(ZP_API_VERIFY, data=data, headers=headers)

        if response.status_code == 200:
            response = response.json()
            if response['data']['code'] == 100:
                # put your logic here
                return HttpResponse("خرید شما با موفقیت انجام شد.")

            elif response['data']['code'] == 101:
                return HttpResponse("این پرداخت قبلا انجام شده است.")

            else:
                return HttpResponse("پرداخت شما ناموفق بود.")

        else:
            return HttpResponse("پرداخت شما ناموفق بود.")

    else:
        return HttpResponse("پرداخت شما ناموفق بود.")

 

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

  • 1403/07/19
  • ساعت 21:59

سلام خدمت شما دوست عزیز

ممنونم از شما


logo-samandehi