Multiple orders, getting created one with 'paid' status and another one 'created' status, and the subscription is not getting activated.
I am able to create the subscription in Razor pay, but the problem is that double orders are being created in Razor pay, one of which has the status of paid and the latest order has the status of created and the subscription is not getting activated after creation.
views.py
@login_required
def process_payment(request, membership_id):
membership = get_object_or_404(Membership, id=membership_id)
amount = membership.price * 100 # Amount in paise
if request.method == 'POST':
# Process the payment
data = request.POST
razorpay_order_id = data['razorpay_order_id']
razorpay_payment_id = data['razorpay_payment_id']
# Update the UserMembership with the new membership
user_membership = UserMembership.objects.get(user=request.user)
user_membership.membership = membership
user_membership.save()
messages.success(request, 'Payment successful!')
return render(request, 'membership/payment_success.html')
else:
# Create a Razorpay order
order = razorpay_client.order.create({
'amount': amount,
'currency': 'INR',
'payment_capture': '1'
})
return render(request, 'membership/process_payment.html', {'order': order, 'membership': membership, 'razorpay_key': settings.RAZORPAY_KEY})
@csrf_exempt
def payment_success(request):
if request.method == 'POST':
print(request.method)
data = request.POST
razorpay_order_id = data['razorpay_order_id']
razorpay_payment_id = data['razorpay_payment_id']
# Retrieve the membership associated with the Razorpay order
membership_id = int(data['membership_id'])
membership = Membership.objects.get(id=membership_id)
# Update or create a Subscription record
user_membership = UserMembership.objects.get(user=request.user)
subscribe, created = LocalSubscription.objects.get_or_create(user_membership=user_membership)
response = razorpay_client.payment.fetch(razorpay_payment_id)
payment_status = response['status']
if payment_status == 'captured':
subscription_data = {
"plan_id": membership.razorpay_plan_id, # Replace with your plan ID
"customer_id": user_membership.razorpay_customer_id, # Replace with your customer ID
"customer_notify": 1,
"total_count": 2,
}
# Create the subscription
subscription = razorpay_client.subscription.create(data=subscription_data)
# Update subscription details
subscribe.razorpay_subscription_id = subscription['id']
subscribe.active = True # Set to True if the payment is successful
# Save changes to the Subscription record
subscribe.save()
# Update UserMembership with the new membership
user_membership.membership = membership
user_membership.save()
messages.success(request, 'Payment successful!')
return redirect("index")
# If payment_status is not 'captured', you may want to handle this case as well
return HttpResponse("Invalid request or payment not captured")
html page to process the payment
<form id="payment-form" action="{% url 'payment_success' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<script src="https://checkout.razorpay.com/v1/checkout.js"
data-key="{{ razorpay_key }}"
data-amount="{{ membership.amount }}"
data-currency="INR"
data-order_id="{{ order.id }}"
data-buttontext="Pay with Razorpay"
data-name="RHHS INDIA REAL ESTATE PRIVATE LIMITED"
data-description="Payment For {{ membership.membership_type }} Membership Plan"
data-image="{% static 'assets/img/logo.png' %}"
data-prefill.name="{{ user.first_name }}"
data-prefill.email="{{ user.email }}"
data-theme.color="#1266e3"
data-config='{
"display": {
"blocks": {
"banks": {
"name": "All payment methods",
"instruments": [
{"method": "upi"},
{"method": "card"},
{"method": "netbanking"}
]
}
},
"sequence": ["block.banks"],
"preferences": {
"show_default_blocks": false
}
}
}'
data-handler="handler">
</script>
<input type="hidden" value="{{ order.id }}" name="razorpay_order_id">
<input type="hidden" value="{{ membership.id }}" name="membership_id">
</form>
<script>
function handler(response) {
// retrieve the 'razorpay_payment_id' value from the response object
var razorpay_payment_id = response.razorpay_payment_id;
// create a hidden input field in your form to store the 'razorpay_payment_id' value
var paymentIdInput = document.createElement('input');
paymentIdInput.type = 'hidden';
paymentIdInput.name = 'razorpay_payment_id';
paymentIdInput.value = razorpay_payment_id;
// append the hidden input field to your form
document.getElementById('payment-form').appendChild(paymentIdInput);
// submit the form
document.getElementById('payment-form').submit();
}
</script>