В этом проекте подробно рассматривается, как выполнять массовые передачи на панели управления Rave. Вы можете найти сайт здесь, а также скачать стартовые файлы для этого проекта здесь.

Необходимые требования - это:

  • Знание ООП PHP
  • Ваш счет Rave должен быть пополнен для подачи заявки на перевод. Вы можете прочитать об этом здесь".
  • Аккаунт Пушер
  • Тест вебхука сайт. Чтобы протестировать вебхук, который будет возвращен с рейва

Цель

  • Узнайте, как использовать PHP SDK Rave в вашем PHP-проекте
  • Узнайте, как обрабатывать веб-хуки в вашем проекте PHP
  • Узнайте, как использовать Pusher для отправки уведомлений приложений в реальном времени.
  • Узнайте, как перевести деньги с помощью Rave.

Итак, в первую очередь скачиваем официальный PHP SDK из репозитория Flutterwave Github. Этот репозиторий содержит PHP-оболочку для Flutterwave API, которую мы будем использовать в этом проекте.

Как скачать репозиторий — мы можем скачать проект одним из 3-х способов следующим образом:

  1. С помощью git-клона
git clone https://github.com/ezdevelopers/Flutterwave-Rave-PHP-SDK

2. С помощью композитора

composer require flutterwave-php-sdk

3. Вручную загрузив проект git здесь

Когда наша загрузка будет завершена. Добавьте Flutterwave PHP SDK в наши стартовые файлы следующим образом:

Переименуйте файл .env.example в .env . Добавьте свой открытый ключ, секретный ключ, среду и secret_hash (позже мы будем использовать секретный хэш для настройки веб-перехватчика), вот так

PUBLIC_KEY = "****YOUR**PUBLIC**KEY****"
SECRET_KEY = "****YOUR**SECRET**KEY****"
ENV = "staging or live"
SECRET_HASH = "****YOUR**SECRET_HASH**FOR****WEBHOOKS"

Затем мы открываем файл class.api.php, в котором мы будем выполнять вызовы API, и включаем коды для извлечения файлов API из нашего PHP SDK, например:

require_once('Flutterwave/api/Transfer.php'); 
use Flutterwave\Transfer;

Для этого проекта нам понадобится только файл API передачи для осуществления передачи в нашем приложении.

Настройка массовой передачи

Когда мы открываем наше приложение, оно извлекает доступный баланс и баланс бухгалтерской книги из рейв-счета, который соответствует public key and secret key добавленному в (.env) файле.

Ниже приведено изображение, показывающее, как мы инициируем массовый перевод. Прежде всего, мы создаем группу, которая может быть командой в организации.

Затем мы добавляем членов команды в эту группу, включая имена, зарплату, банковский счет и так далее.

Массовый перевод предполагает отправку денег нескольким лицам. Мы настроили пустую функцию (bulkTransfer) в файле class.api.php, которая будет использоваться для вызовов API передачи flutterwave. Чтобы инициировать массовую передачу, мы добавляем следующий код в пустую функцию, которая вызывает функцию (bulkTransfer) в rave PHP SDK.

//arrange bulk_data in array
foreach ($members as $member) {
$bulk_data[] = array (
'Bank' => $member['staffbank'],
'Account Number' => $member['staffacctno'],
'Amount' => $member['amount'],
'Narration' => 'Something goes here',
'currency' => 'NGN',
'reference' => 'rave-'.time()
);
}
$data["seckey"] = $_ENV['SECRET_KEY'];
$data["title"] = "My staff salary";
$data["bulk_data"] = $bulk_data;
$bulk = new Transfer();
$result = $bulk->bulkTransfer($data);
$trx = json_decode($result, true);
return $trx;

Мы передаем переменную ($data) в функцию (bulkTransfer). Переменная содержит массив, первый индекс которого — это secret_key, второй индекс — это название перевода, а третий индекс — это массив ( $bulk_data ), содержащий значения членов, которым мы хотим перевести деньги. Цикл (foreach) выше перебирает переменную ($member), которая представляет собой массив элементов, извлеченных из нашей базы данных, и добавляет каждый элемент вместе с данными, связанными с этим элементом (такими как название банка, номер счета, сумма) в индекс в $bulk_data

Результаты одного переноса

Мы настроили пушер для отправки оповещений через наше приложение и воспользуемся этой функцией в этом разделе. Вы можете зарегистрировать собственный пушер-аккаунт здесь и настроить его. Мы будем регистрировать все наши ответы в консоли с помощью pusher, но pusher способен на гораздо большее.

API возвращает следующие результаты

{
    "status": "success",
    "message": "BULK-TRANSFER-CREATED",
    "data": {
        "id": 21,
        "uuid": 21,
        "date_created": "2018-05-17T08:39:54.000Z",
        "approver": "N/A"
    }
}

Мы зарегистрировали результаты API в консоли. Это стало возможным благодаря использованию толкателя, который мы уже настроили.

Возвращенный результат не означает, что процесс завершен, есть дальнейшие шаги для завершения процесса, которые включают настройку веб-перехватчика и функции обратного вызова.

Реализация веб-перехватчика для разовой передачи

Концепция WebHook проста. WebHook — это обратный вызов HTTP: HTTP POST, который происходит, когда что-то происходит; простое уведомление о событии через HTTP POST.

Веб-приложение, реализующее WebHooks, отправит сообщение на URL-адрес, когда произойдут определенные вещи. Чтобы реализовать веб-перехватчик для получения уведомлений о ходе нашего перевода, нам нужно настроить нашу восторженную учетную запись для веб-перехватчиков. Войдите в свою учетную запись rave и перейдите в раздел веб-хуков на странице настроек.

Добавьте свой секретный хеш и URL (ссылку на сценарий обратного вызова, который будет обрабатывать ответы от вашего восторженного аккаунта). Теперь мы настроим нашу функцию обратного вызова.

Мы добавили скрипт (webhook.php). Здесь мы будем обрабатывать ответы с нашей восторженной панели. URL-адрес размещенной версии этого файла будет URL-адресом нашего веб-перехватчика. Вы также можете использовать этот веб-сайт для проверки своих веб-хуков, скопировав и вставив URL-адрес в свою панель управления рейвом.

Добавьте следующую функцию в файл webhook следующим образом:

<?php 
require __DIR__.'/vendor/autoload.php'; // Uncomment this autoloader if you need it
$dotenv = new Dotenv\Dotenv(__DIR__.'/include/classes/Flutterwave');
$dotenv->load();
 $options = array(
    'cluster' => 'eu',
    'encrypted' => true
  );
  
  $pusher = new Pusher\Pusher(
    '084259e4e356fb9a0622',
    'bfb407e2dc876b7fe5a3',
    '636291',
    $options
  );
  
// Retrieve the request's body
$body = @file_get_contents("php://input");
// retrieve the signature sent in the reques header's.
$signature = (isset($_SERVER['HTTP_VERIF_HASH']) ? $_SERVER['HTTP_VERIF_HASH'] : '');
/* It is a good idea to log all events received. Add code *
 * here to log the signature and body to db or file       */
if (!$signature) {
    // only a post with rave signature header gets our attention
    exit();
}
// Store the same signature on your server as an env variable and check against what was sent in the headers
$local_signature = $_ENV['SECRET_HASH'];
// confirm the event's signature
if( $signature !== $local_signature ){
  // silently forget this ever happened
  exit();
}
http_response_code(200); // PHP 5.4 or greater
// parse event (which is json string) as object
// Give value to your customer but don't give any output
// Remember that this is a call from rave's servers and 
// Your customer is not seeing the response here at all
$response = json_decode($body);
if (isset($response)) {
  $data['message'] = $response;
  $pusher->trigger('my-channel', 'my-event', $data);
  
  echo '<script src="https://js.pusher.com/4.3/pusher.min.js"></script>';
  echo'<script>
        Pusher.logToConsole = true;
        var pusher = new Pusher("084259e4e356fb9a0622", {
        cluster: "eu",
        forceTLS: true
        });
        var channel = pusher.subscribe("my-channel");
        channel.bind("my-event", function(data) {
        console.log(data);
        });
      });
    </script>';
  
  
}else{
 $data['message'] = $response;
  $pusher->trigger('my-channel', 'my-event',$data);
  echo '<script src="https://js.pusher.com/4.3/pusher.min.js"></script>';
    echo'<script>
        Pusher.logToConsole = true;
        var pusher = new Pusher("084259e4e356fb9a0622", {
        cluster: "eu",
        forceTLS: true
        });
        var channel = pusher.subscribe("my-channel");
        channel.bind("my-event", function(data) {
        console.log(data);
        });
      });
    </script>';
  
}
exit();
?>

Веб-перехватчик возвращает следующий ответ, который можно записать в консоль.

{
"event.type":"Transfer",
"transfer":{
"id":3168,
"account_number":"0690000031",
"bank_code":"044",
"fullname":"Forrest Green",
"date_created":"2018-11-02T16:31:45.000Z",
"currency":"NGN",
"debit_currency":null,
"amount":4000,
"fee":45,
"status":"FAILED",
"reference":null,
"meta":null,
"narration":"Something goes here",
"approver":null,
"complete_message":"DISBURSE FAILED: Insufficient funds",
"requires_approval":0,
"is_approved":1,
"bank_name":"ACCESS BANK NIGERIA"}
}

Это ответ вебхука, зарегистрированного в консоли.

Из результата мы видим, что наш перевод не удался, потому что у нас недостаточно средств.

Спасибо за чтение