Laravel PhonePe Integration Example

Laravel PhonePe Integration Example

Laravel PhonePe Integration Example

In this post, we will cover the integration of PhonePe in a Laravel application, including generating a payment request and verifying the payment status.

Step 1: Set Up Your PhonePe Account

Before starting the integration, you must set up a PhonePe merchant account. Obtain your merchant ID, API key, and other necessary credentials.

Step 2: Install Required Libraries

Ensure your Laravel project is set up correctly. You might need to use packages like guzzlehttp/guzzle for making API requests:

composer require guzzlehttp/guzzle

Step 3: Configuring Your .env File

Add your PhonePe credentials to the .env file:


PHONEPE_MERCHANT_ID=your_merchant_id
PHONEPE_API_KEY=your_api_key
PHONEPE_SALT_KEY=your_salt_key
PHONEPE_BASE_URL=https://api.phonepe.com
  

Step 4: Creating the Payment Request

Create a controller to handle the payment request:


<?php

namespace App\\Http\\Controllers;

use Illuminate\\Http\\Request;
use GuzzleHttp\\Client;

class PhonePeController extends Controller
{
    public function initiatePayment(Request $request)
    {
        $amount = $request->amount * 100; // Convert to paise
        $merchantId = env('PHONEPE_MERCHANT_ID');
        $apiKey = env('PHONEPE_API_KEY');
        $saltKey = env('PHONEPE_SALT_KEY');
        $baseUrl = env('PHONEPE_BASE_URL');

        $payload = [
            'merchantId' => $merchantId,
            'transactionId' => uniqid(), // Unique transaction ID
            'amount' => $amount,
            'currency' => 'INR',
            'redirectUrl' => route('payment.callback'),
            'validity' => time() + 600, // Payment validity in seconds
        ];

        $data = json_encode($payload);
        $hashedData = hash_hmac('sha256', $data, $saltKey);

        $client = new Client();
        $response = $client->post($baseUrl . '/v3/transaction/initiate', [
            'headers' => [
                'Content-Type' => 'application/json',
                'X-VERIFY' => $hashedData . '###' . $apiKey,
            ],
            'body' => $data,
        ]);

        return response()->json(json_decode($response->getBody(), true));
    }
}
  

Step 5: Payment Callback

Create a method to handle the callback from PhonePe and verify the payment status:


<?php

namespace App\\Http\\Controllers;

use Illuminate\\Http\\Request;
use GuzzleHttp\\Client;

class PhonePeController extends Controller
{
    public function paymentCallback(Request $request)
    {
        $transactionId = $request->transactionId;
        $merchantId = env('PHONEPE_MERCHANT_ID');
        $apiKey = env('PHONEPE_API_KEY');
        $saltKey = env('PHONEPE_SALT_KEY');
        $baseUrl = env('PHONEPE_BASE_URL');

        $url = $baseUrl . "/v3/transaction/$merchantId/$transactionId/status";
        $hashedData = hash_hmac('sha256', $url, $saltKey);

        $client = new Client();
        $response = $client->get($url, [
            'headers' => [
                'X-VERIFY' => $hashedData . '###' . $apiKey,
            ],
        ]);

        $statusResponse = json_decode($response->getBody(), true);

        if ($statusResponse['success']) {
            // Payment successful
            // Update your order status or take necessary action
        } else {
            // Payment failed
        }

        return response()->json($statusResponse);
    }
}
  

Step 6: Testing

Make sure to thoroughly test the integration using test credentials provided by PhonePe. Once everything is working as expected, you can switch to live mode.

With this setup, your Laravel application can handle PhonePe payments effectively!

No comments:

Post a Comment