Integrate Razorpay Standard Web Checkout into this codebase.

=== CREDENTIALS ===

RAZORPAY_KEY_ID: rzp_test_TWMxuLsAyJey9M
RAZORPAY_KEY_SECRET: HGOI8fqR09OdjKdxzg3xp2Ir

=== TASK ===

Detect the project stack and implement Razorpay Standard Checkout with:
1. Backend endpoint to create orders
2. Frontend checkout button with payment modal
3. Backend endpoint to verify payment signature

=== IMPLEMENTATION DETAILS ===

STEP 1: BACKEND – Create Order
– Endpoint: POST /api/create-order (or framework equivalent)
– Call Razorpay API: POST https://api.razorpay.com/v1/orders
– Request: { amount (paise), currency, receipt }
– Return: { order_id, amount, currency }
– Minimum amount: 100 paise

STEP 2: FRONTEND – Checkout
– Script: <script src=”https://checkout.razorpay.com/v1/checkout.js”></script>
– On button click: call create-order, then open Razorpay modal with order_id
– On success: receive razorpay_payment_id, razorpay_order_id, razorpay_signature
– Send all three to verify endpoint

STEP 3: BACKEND – Verify Signature
– Endpoint: POST /api/verify-payment (or framework equivalent)
– Algorithm: HMAC-SHA256(order_id + “|” + payment_id, KEY_SECRET)
– Compare generated signature with razorpay_signature
– Return success only if signatures match

=== ENVIRONMENT SETUP ===

Create .env file:
RAZORPAY_KEY_ID=rzp_test_TWMxuLsAyJey9M
RAZORPAY_KEY_SECRET=HGOI8fqR09OdjKdxzg3xp2Ir

Frontend framework prefixes (KEY_ID only, never KEY_SECRET):
– Next.js: NEXT_PUBLIC_RAZORPAY_KEY_ID
– Vite: VITE_RAZORPAY_KEY_ID
– CRA: REACT_APP_RAZORPAY_KEY_ID

Add .env to .gitignore.

=== SDK INSTALLATION ===

Node.js: npm install razorpay
Python: pip install razorpay
PHP: composer require razorpay/razorpay
Ruby: gem install razorpay
Go: go get github.com/razorpay/razorpay-go

=== OPERATION ORDER ===

Execute in this sequence:
1. Install dependencies first
2. Create .env file
3. Create or modify code files
4. Verify setup

=== ERROR HANDLING ===

Backend – Create Order:
– Validate amount >= 100 paise
– Handle Razorpay API errors (return 500)
– Handle auth failures (return 401)

Backend – Verify Signature:
– Signature mismatch: return 400, do NOT mark as paid
– Missing fields: return 400

Frontend:
– Handle modal dismiss (user cancelled)
– Handle payment.failed event
– Show error messages to user

=== EDGE CASES ===

If no backend framework detected:
– Stop and explain that Razorpay requires a backend for order creation
– Suggest serverless functions (Vercel/Netlify) or Razorpay Payment Links

If Razorpay already integrated:
– Do not duplicate code
– Only fix or complete missing parts

If static site only:
– Suggest adding serverless API routes
– Or suggest Razorpay Payment Links as alternative

=== REQUIREMENTS ===

– Never hardcode credentials in source files
– KEY_SECRET must never reach frontend code
– Use environment variables everywhere
– Follow existing code style in the project
– Do not create database tables unless project already has a database

=== REFERENCE ===

Documentation: https://razorpay.com/docs/payments/payment-gateway/web-integration/standard/integration-steps/

=== OUTPUT ===

After completing integration:
1. List files created or modified
2. Explain how to test (e.g., start server, click pay button)
3. Note any manual steps required

Begin integration now.