В этом проекте подробно рассматривается, как выполнять массовые передачи на панели управления Rave. Вы можете найти сайт здесь, а также скачать стартовые файлы для этого проекта здесь.
Необходимые требования - это:
- Знание ООП PHP
- Ваш счет Rave должен быть пополнен для подачи заявки на перевод. Вы можете прочитать об этом здесь".
- Аккаунт Пушер
- Тест вебхука сайт. Чтобы протестировать вебхук, который будет возвращен с рейва
Цель
- Узнайте, как использовать PHP SDK Rave в вашем PHP-проекте
- Узнайте, как обрабатывать веб-хуки в вашем проекте PHP
- Узнайте, как использовать Pusher для отправки уведомлений приложений в реальном времени.
- Узнайте, как перевести деньги с помощью Rave.
Итак, в первую очередь скачиваем официальный PHP SDK из репозитория Flutterwave Github. Этот репозиторий содержит PHP-оболочку для Flutterwave API, которую мы будем использовать в этом проекте.
Как скачать репозиторий — мы можем скачать проект одним из 3-х способов следующим образом:
- С помощью 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"} }
Это ответ вебхука, зарегистрированного в консоли.
Из результата мы видим, что наш перевод не удался, потому что у нас недостаточно средств.
Спасибо за чтение