Razorpay Subscription

64 Views Asked by At

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>
0

There are 0 best solutions below