درود و خداقوت
زماني که کاربر ميخواد به صفحه پرداخت منتقل بشه ، با ارور مواجه ميشه:
views:
import time
from django.contrib.auth.decorators import login_required
from django.http import HttpRequest, JsonResponse, HttpResponse
from django.urls import reverse
from product_module.models import Product
from .models import Order, OrderDetail
from django.shortcuts import redirect, render
import requests
import json
from django.conf import settings
# Create your views here.
if settings.SANDBOX:
sandbox = 'sandbox'
else:
sandbox = 'www'
ZP_API_REQUEST = f"https://{sandbox}.zarinpal.com/pg/rest/WebGate/PaymentRequest.json"
ZP_API_VERIFY = f"https://{sandbox}.zarinpal.com/pg/rest/WebGate/PaymentVerification.json"
ZP_API_STARTPAY = f"https://{sandbox}.zarinpal.com/pg/StartPay/"
amount = 11000 # Rial / Required
description = "نهایی کردن خرید شما از سایت ما" # Required
email = '' # Optional
phone = '' # Optional
# Important: need to edit for realy server.
CallbackURL = 'http://127.0.0.1:8000/order/verify-payment/'
def add_product_to_order(request: HttpRequest):
product_id = int(request.GET.get('product_id'))
count = int(request.GET.get('count'))
if count < 1:
# count = 1
return JsonResponse({
'status': 'invalid_count',
'text': 'مقدار وارد شده معتبر نمی باشد',
'confirm_button_text': 'مرسی از شما',
'icon': 'warning'
})
if request.user.is_authenticated:
product = Product.objects.filter(id=product_id, is_active=True, is_delete=False).first()
if product is not None:
current_order, created = Order.objects.get_or_create(is_paid=False, user_id=request.user.id)
current_order_detail = current_order.orderdetail_set.filter(product_id=product_id).first()
if current_order_detail is not None:
current_order_detail.count += count
current_order_detail.save()
else:
new_detail = OrderDetail(order_id=current_order.id, product_id=product_id, count=count)
new_detail.save()
return JsonResponse({
'status': 'success',
'text': 'محصول مورد نظر با موفقیت به سبد خرید شما اضافه شد',
'confirm_button_text': 'باشه ممنونم',
'icon': 'success'
})
else:
return JsonResponse({
'status': 'not_found',
'text': 'محصول مورد نظر یافت نشد',
'confirm_button_text': 'مرسییییی',
'icon': 'error'
})
else:
return JsonResponse({
'status': 'not_auth',
'text': 'برای افزودن محصول به سبد خرید ابتدا می بایست وارد سایت شوید',
'confirm_button_text': 'ورود به سایت',
'icon': 'error'
})
@login_required
def request_payment(request: HttpRequest):
current_order, created = Order.objects.get_or_create(is_paid=False, user_id=request.user.id)
total_price = current_order.calculate_total_price()
if total_price == 0:
return redirect(reverse('user_basket_page'))
data = {
"MerchantID": settings.MERCHANT,
"Amount": total_price * 10,
"Description": description,
"Phone": phone,
"CallbackURL": CallbackURL,
}
data = json.dumps(data)
# set content length by data
headers = {'content-type': 'application/json', 'content-length': str(len(data))}
try:
response = requests.post(ZP_API_REQUEST, data=data, headers=headers, timeout=10)
if response.status_code == 200:
response = response.json()
if response['Status'] == 100:
return {'status': True, 'url': ZP_API_STARTPAY + str(response['Authority']),
'authority': response['Authority']}
else:
return {'status': False, 'code': str(response['Status'])}
return response
except requests.exceptions.Timeout:
return {'status': False, 'code': 'timeout'}
except requests.exceptions.ConnectionError:
return {'status': False, 'code': 'connection error'}
@login_required
def verify_payment(request: HttpRequest):
current_order, created = Order.objects.get_or_create(is_paid=False, user_id=request.user.id)
total_price = current_order.calculate_total_price()
data = {
"MerchantID": settings.MERCHANT,
"Amount": total_price * 10,
"Authority": authority,
}
data = json.dumps(data)
# set content length by data
headers = {'content-type': 'application/json', 'content-length': str(len(data)) }
response = requests.post(ZP_API_VERIFY, data=data,headers=headers)
if response.status_code == 200:
response = response.json()
if response['Status'] == 100:
current_order.is_paid = True
current_order.payment_date = time.time()
current_order.save()
return {'status': True, 'RefID': response['RefID']}
else:
return {'status': False, 'code': str(response['Status'])}
return responseتوي فايل setting هم MERCHANT و SANDBOX رو قرار دادم و SANDBOX در حالت True يا False هم چک کردم بازم همين ارور رو ميده
urls:
from django.urls import path
from . import views
urlpatterns = [
path('add-to-order', views.add_product_to_order, name='add_product_to_order'),
path('request-payment/', views.request_payment, name='request_payment'),
path('verify-payment/', views.verify_payment, name='verify_payment')
]

سلام دوست من
کدهاتون رو با کدهای اموزش مقایسه کنین
البته داخل سایت رسمی داکیومنت قرار داده شده دوست من
با سلام
طبق آموزش پیش رفتم و به درستی به نتیجه رسیدم.
ممنون از شما استاد گرامی
خواهش میکنم دوست من
موفق باشین :)