razorpay_client = razorpay.Client(auth=(settings.RAZOR_KEY_ID, settings.RAZOR_KEY_SECRET))
def selectMemberType(slug,user):
if slug == 'nurse':
return Nurse.objects.get(user=user)
elif slug == 'student':
return Student.objects.get(user=user)
elif slug == 'faculty':
return Faculty.objects.get(user=user)
elif slug == 'other':
return Other.objects.get(user=user)
@login_required
def payment_page(request, slug):
try:
member_type = get_object_or_404(MembershipType, slug=slug)
amount = member_type.price
currency = 'INR'
product_name = str(slug).capitalize()
if request.user.is_anonymous:
messages.error(request, "Welcome to UNA Community!")
return redirect('login')
user_obj = request.user
razorpay_order = razorpay_client.order.create(dict(
amount=amount * 100,
currency=currency,
payment_capture='0'
))
razorpay_order_id = razorpay_order['id']
profile_obj = selectMemberType(slug, request.user)
full_path = settings.SITE_URL + '/payments/payment-handler/'
context = {
'razorpay_order_id': razorpay_order_id,
'razorpay_merchant_key': settings.RAZOR_KEY_ID,
'razorpay_name': product_name,
'razorpay_amount': amount * 100,
'currency': currency,
'email': user_obj.email,
'phone': profile_obj.mobile,
'url_path': full_path,
"callback_url": settings.SITE_URL + "/payments/callback/",
}
payment = Payment.objects.create(
payment_order_id=razorpay_order_id,
amount=amount,
user=user_obj,
name=product_name,
)
payment.save()
return render(request, 'payment-page.html', context)
except Exception as e:
# Handle exceptions here, log them, and return an appropriate response.
# You can customize this based on the specific exceptions you expect.
context = {
'error_message' : str(e),
}
return render(request, 'payment_failure.html', context)
@csrf_exempt
def callback(request):
def verify_signature(response_data):
client = razorpay.Client(auth=(settings.RAZOR_KEY_ID, settings.RAZOR_KEY_SECRET))
return client.utility.verify_payment_signature(response_data)
try:
if "razorpay_signature" in request.POST:
payment_id = request.POST.get("razorpay_payment_id", "")
provider_order_id = request.POST.get("razorpay_order_id", "")
signature_id = request.POST.get("razorpay_signature", "")
payment = Payment.objects.get(payment_order_id=provider_order_id)
payment.payment_id = payment_id
payment.signature_id = signature_id
payment.save()
if verify_signature(request.POST):
payment.status = True
payment.save()
user = request.user
user.is_paid = True
profile = selectMemberType(user.type, user)
profile.is_paid = True
user.save()
profile.save()
try:
# email section
def send_email():
html_template = get_template('email_temp.html')
context = {'profile': profile, 'user': user}
subject, from_email, to = 'UNA Membership Confirmation', settings.EMAIL_HOST_USER, user.email
html_content = html_template.render(context)
text_content = F"You are successfully registered as {user.type}"
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
transaction.on_commit(send_email)
user.mail_sent = True
user.save()
except Exception as e:
print(e)
profile_url = reverse('profile', kwargs={'user_id': user.id})
messages.success(request, "Welcome to UNA Community!")
return redirect(profile_url)
else:
payment.status = False
payment.save()
error_message = "Payment verification failed. Please try again."
context = {
'error_message' : error_message
}
return render(request, 'something_wrong.html', context)
else:
# Handle error case where 'razorpay_signature' is not in request.POST
error_metadata = json.loads(request.POST.get("error[metadata]"))
payment_id = error_metadata.get("payment_id")
provider_order_id = error_metadata.get("order_id")
payment = Payment.objects.get(payment_order_id=provider_order_id)
payment.payment_id = payment_id
payment.status = False
payment.save()
# Additional error handling logic here
error_metadata_str = json.dumps(error_metadata)
# return redirect('error_view', error_message=error_metadata_str)
context = {
'error_message' : error_metadata_str
}
return render(request, 'something_wrong.html', context)
except Payment.DoesNotExist:
error_message = 'failed'
# return redirect('error_view', error_message=error_message)
context = {
'error_message' : error_message
}
return render(request, 'something_wrong.html', context)
except Exception as e:
error_message = str(e)
# messages.error(request, f"An error occurred: {str(e)}")
# return redirect('error_view', error_message=error_message)
context = {
'error_message' : error_message
}
return render(request, 'something_wrong.html', context)
What is wrong or not working that you believe should be “optimized” or improved?