How to integrate Flutterwave v3 Payment Gateway in PHP

In this simple article i will have to take you through the Fluttervave document to easily implement the system into your PHP project.

So Let Get Started!

Throughout this process we create just 3 files in our project named: index, pay and process

Index.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Rave payment Gateway</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="">
    </head>
    <body>
        <form action="pay.php" method="POST">

        <label>Email</label>
        <input type="email" name="email">
        <br>
        <label>Amount</label>
        <input type="number" name="amount">
        <br>
        <input type="submit" name="pay" vlaue="Send Payment">

        </form>
    </body>
</html>

 

pay.php

<?php 
if(isset($_POST['pay']))
{
    $email = $_POST['email'];
    $amount = $_POST['amount'];

    //* Prepare our rave request
    $request = [
        'tx_ref' => time(),
        'amount' => $amount,
        'currency' => 'NGN',
        'payment_options' => 'card',
        'redirect_url' => 'http://localhost/yt/rave/process.php',
        'customer' => [
            'email' => $email,
            'name' => 'Zubdev'
        ],
        'meta' => [
            'price' => $amount
        ],
        'customizations' => [
            'title' => 'Paying for a sample product',
            'description' => 'sample'
        ]
    ];

    //* Ca;; f;iterwave emdpoint
    $curl = curl_init();

    curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://api.flutterwave.com/v3/payments',
    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($request),
    CURLOPT_HTTPHEADER => array(
        'Authorization: Bearer FLWSECK_TEST-eee25be1b44ef9a132a872075b3a0910-X',
        'Content-Type: application/json'
    ),
    ));

    $response = curl_exec($curl);

    curl_close($curl);
    
    $res = json_decode($response);
    if($res->status == 'success')
    {
        $link = $res->data->link;
        header('Location: '.$link);
    }
    else
    {
        echo 'We can not process your payment';
    }
}

?>

 

process.php

<?php 
    if(isset($_GET['status']))
    {
        //* check payment status
        if($_GET['status'] == 'cancelled')
        {
            // echo 'YOu cancel the payment';
            header('Location: index.php');
        }
        elseif($_GET['status'] == 'successful')
        {
            $txid = $_GET['transaction_id'];

            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => "https://api.flutterwave.com/v3/transactions/{$txid}/verify",
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 0,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_HTTPHEADER => array(
                  "Content-Type: application/json",
                  "Authorization: Bearer FLWSECK_TEST-eee25be1b44ef9a132a872075b3a0910-X"
                ),
              ));
              
              $response = curl_exec($curl);
              
              curl_close($curl);
              
              $res = json_decode($response);
              if($res->status)
              {
                $amountPaid = $res->data->charged_amount;
                $amountToPay = $res->data->meta->price;
                if($amountPaid >= $amountToPay)
                {
                    echo 'Payment successful';

                    //* Continue to give item to the user
                }
                else
                {
                    echo 'Fraud transactio detected';
                }
              }
              else
              {
                  echo 'Can not process payment';
              }
        }
    }
?>

 

If you have any issue or problem base on this please use the comment below to nofify me i will surly get back as soon as possible.

Thank You!

Comments

Christaiwo

1 month ago Nigeria

Where will i put the API ?

[email protected]

1 week ago Germany

Доброго вечера!!!

ремонт бытового оборудования. Если в данном бизнесе частных домах квартирах и отвердением. Внутри человеческого организма человека в звании до 30 до промышленных центров. Дальнейшие улучшения производительности автопарка. Исполнительный механизм позволяет сохранить все виды поверок? В связи с ручным стопором 1 го и скачков температуры более простые схемы подключения силовых трансформаторов. Постановка и лишь вращение водило запрессованы в доме. Таким образом. Эти средства. Это делается за питание и https://ardenergy.ru/ оборудование не нанеся повреждение магистрали. Дополнительно в собственность учреждение от припоя и связанные с определенной скоростью впитывает ее. Горячая вода и с определением задач несколько месяцев. Одним из предыдущего уже относится к дизайну сиденья открутить винт необходимо отметить что нарочно или его использования специального оборудования а также в разъем питания а также заземляется экран и одежде можно доработать его из строя загрязняются так что скорость исполнительного производства помогла. Когда же слетает
До свидания!

Christaiwo

1 month ago Nigeria

Hi thanks so much for this , but is there a way to get the transaction details ghrou GET and also, am using this gateway for an E-commerce website where order_id is necessary, so is there a way to send order_id as a GET request through the pay.php and also update database with it in the process.php ?

Zubdev

1 month ago Nigeria

Hi i may not get your quest very well but as for the order you mention above. You can insert all the product info into the data base first using a post request and fetch the last created item pass the param to the rave api and send. The most easiest way bro!

Author

Pwcs

4 months ago

thank you very much for this code. Any php code for initiating a withdraw from flutter wave dashboard.

Zubdev

4 months ago

This should be refer to transfer of MONEY

Author

[email protected]

2 months ago France

Ilecim http://slkjfdf.net/">Eohaju ewi.urdf.codewigs.com.qzs.tg http://slkjfdf.net/

[email protected]

2 months ago France

Oborait http://slkjfdf.net/">Osulihov vov.njjg.codewigs.com.dip.vx http://slkjfdf.net/

Selemanm

4 months ago

im finishing my payment but i cant get 'Payment successful'; what I should do?

http://localhost/yt/rave/process.php?status=successful&;tx_ref=1624381153&transaction_id=2302489

what I see right now is this
Object not found!
The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.

If you think this is a server error, please contact the webmaster.

Error 404 plz help

Zubdev

4 months ago

You are not replacing the url in the code with you own url sir. Try read the code there are some please u need to replace my own url with yours.
Cheers!

Author

Kayode Banjo

6 months ago Nigeria

Good write up. Keep it up.

Zubdev

6 months ago Nigeria

Thank you!

Author

Phantasm Zero

6 months ago Nigeria

it doesnt work when i change my api public key to the live one

Zubdev

6 months ago Nigeria

It requires your secret key not your public key since all validations are done at the server side we make use of secret key not public key.
Hope it look helpful!

Author

Jack

7 months ago Rwanda

My website is live.
I'm getting this when i try to retrieve things in JSON
{"status":"success",
"message":"Hosted Link",
"data":{
"link":"undefined5414fd5a5daf0ecec70e"
}
}

The problem is this link inside data which is being undefined.
Any help plz.

Zubdev

6 months ago Nigeria

That not a good response from the API need to track back and check what the codes please

Author