Table of Contents
To set up Razorpay, log in to the Razorpay Dashboard, navigate to API Keys under the Settings tab, and generate your Key_ID and Secret_Key for integration.
To generate a Razorpay Order ID, create a function in your backend. Use cURL to call Razorpay's REST API endpoint /orders with the required parameters: amount, currency, and receipt. Parse the response to extract the Order ID, save it along with relevant data in your database for further processing.
function generateOrderID($amount, $ReceiptNo, $courseName, $register_id): string { $curl = curl_init(); $key_id = 'rzp_test_xxxxxxxxxxxxx'; $secret_key = 'xxxxxxxxxxxxxxxxxxx'; curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.razorpay.com/v1/orders', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode([ "amount" => $amount * 100, // Amount in paise "currency" => "INR", "receipt" => $ReceiptNo, "notes" => [ "notes_key_1" => $courseName, "notes_key_2" => "" ] ]), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Basic ' . base64_encode($key_id . ':' . $secret_key) ], )); $response = curl_exec($curl); curl_close($curl); $resArr = json_decode($response, true); if ($resArr['status'] == 'created') { $payModel = new PaymentModel(); $paymentData = [ 'register_id' => $register_id, 'order_id' => $resArr['id'], 'payment_status' => $resArr['status'], 'currency' => 'INR', 'reciept' => $resArr['receipt'], 'attempts' => $resArr['attempts'], 'amount' => $amount, 'amount_paid' => $resArr['amount_paid'], 'response' => $response, 'created_at' => date('Y-m-d H:i:s'), ]; $payModel->insert($paymentData); return $resArr['id']; } else { log_message('error', 'Razorpay Order Creation Failed: ' . json_encode($resArr)); return ''; } }
In the controller, generate the Razorpay Order ID and pass it to the view. On the frontend, create a form and use Razorpay's Checkout.js to display the payment button. On form submission, pass the Order ID to Razorpay and handle the payment process, submitting the payment ID to the backend for verification.
var options = { "key": "rzp_test_xxxxxxxxxxxxx", "amount": $selectedCourseSellingPrice * 100 , "currency": "INR", "name": "", "description": " $selectedCourseName", "image": "site_url('assets/img/techthaastu-logo.webp')", "order_id": " $orderID", "callback_url": " site_url('thank-you')", "handler": function(response) { var selectedCourseSellingPrice = $selectedCourseSellingPrice ; var paymentData = { razorpay_payment_id: response.razorpay_payment_id, razorpay_order_id: response.razorpay_order_id, razorpay_signature: response.razorpay_signature, response: response, amount: selectedCourseSellingPrice }; $.ajax({ url: " site_url('verify-payment') ", type: 'POST', data: paymentData, success: function(response) { console.log('Payment verification success: ', response); if (response.status === 'success') { window.location.href = "site_url('thank-you') "; } else { window.location.href = "site_url('register') "; } }, error: function(xhr, status, error) { console.log('Request failed: ' + error); } }); }, "prefill": { "name": "$formData['name'] ", "email": " $formData['email'] ", "contact": "+91 $formData['phone'] " }, "notes": { "address": "" }, "theme": { "color": "#3399cc" } }; var rzp1 = new Razorpay(options); rzp1.open(); rzp1.on('payment.failed', function(response) { const faileddata = { fulldata: response.error, error_code: response.error.code, description: response.error.description, source: response.error.source, step: response.error.step, reason: response.error.reason, order_id: response.error.metadata.order_id, payment_id: response.error.metadata.payment_id }; $.ajax({ url: " site_url('payment-failed') ", type: 'POST', contentType: 'application/json', data: JSON.stringify(faileddata), success: function(response) { console.log(response); window.location.href = "site_url('register') "; }, error: function(xhr, status, error) { console.log('Request failed: ' + error); } }); });
Create a backend endpoint to verify payment by validating the payment signature using Razorpay's API. Capture the payment ID and order ID from the frontend, then send a request to Razorpay's /payment/verify endpoint. Compare the generated signature with the one sent from the frontend for successful verification.
public function verifyPayment() { $paymentId = $this->request->getPost('razorpay_payment_id'); $orderId = $this->request->getPost('razorpay_order_id'); $signature = $this->request->getPost('razorpay_signature'); $amount = $this->request->getPost('amount'); $secret = ''xxxxxxxxxxxxx '; $generated_signature = hash_hmac('sha256', $orderId . '|' . $paymentId, $secret); if ($generated_signature === $signature) { $payModel = new PaymentModel(); $payModel->updatePaymentStatus([ 'payment_id' => $paymentId, 'order_id' => $orderId, 'payment_status' => 'success', 'amount_paid' => $amount, 'created_at' => date('Y-m-d H:i:s'), ]); return $this->response->setJSON(['status' => 'success', 'message' => 'Payment verification successful']); } else { log_message('error', 'Signature mismatch'); return $this->response->setJSON(['status' => 'error', 'message' => 'Signature mismatch']); } }
After verifying the payment status, handle success and failure scenarios in the callback function. If the payment is successful, redirect the user to the "Thank You" page. For failures, redirect them to the "Registration" page.
public function updatePaymentStatus(array $data) { return $this->where('order_id', $data['order_id']) ->set([ 'payment_status' => $data['payment_status'], 'payment_id' => $data['payment_id'], 'created_at' => $data['created_at'], 'amount_paid' => $data['amount_paid'], ]) ->update(); }
After verifying the payment status, handle success and failure scenarios in the callback function. If the payment is successful, redirect the user to the "Thank You" page. For failures, redirect them to the "Registration" page.
public function Paymentfailed() { $input = $this->request->getBody(); $data = json_decode($input, true); log_message('debug', 'Received payment data: ' . json_encode($data)); $paymentId = $data['payment_id'] ?? null; $orderId = $data['order_id'] ?? null; $errorCode = $data['error_code'] ?? null; $errorDescription = $data['description'] ?? null; $errorReason = $data['reason'] ?? null; $fulldata = $data['fulldata'] ?? null; $payModel = new PaymentModel(); $paymentFailureData = [ 'payment_id' => $paymentId, 'order_id' => $orderId, 'error_code' => $errorCode, 'amount_paid' => 0, 'error_reason' => $errorReason, 'response' => json_encode($fulldata), 'payment_status' => 'failed', 'created_at' => date('Y-m-d H:i:s') ]; // pr($paymentFailureData,true); $payModel->updatePaymentStatus($paymentFailureData); }
Techthaastu Support Team 1
Typically replies within an hour
Techthaastu Support Team 2
Typically replies within an hour