triverla/laravel-monnify
Monnify的Laravel包
Requires
- php: ^7.2|^8.0|^8.1
- ext-json: *
- guzzlehttp/guzzle: ~6|~7|~8|~9
- illuminate/support: ~6|~7|~8|~9|^10.0
Requires (Dev)
- mockery/mockery: 1.*
- orchestra/testbench: ^5.0|^6.0
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-10-01 00:25:54 UTC
README
安装
需要PHP 7.4+或HHVM 3.3+,以及Composer。
要获取Laravel Monnify的最新版本,只需要求它
composer require triverla/laravel-monnify
或者将以下行添加到您的composer.json
文件的require块中。
"triverla/laravel-monnify": "1.0.*"
然后您需要运行composer install
或composer update
来下载它并更新自动加载器。
一旦安装了Laravel Monnify,您需要注册服务提供者。打开config/app.php
,并将以下内容添加到providers
键中。
'providers' => [ ... Triverla\LaravelMonnify\MonnifyServiceProvider::class, ... ]
如果您使用的是Laravel >= 5.5,您可以跳过此步骤并转到
配置
Triverla\LaravelMonnify\MonnifyServiceProvider::class
同时,注册外观如下
'aliases' => [ ... 'Monnify' => Triverla\LaravelMonnify\Facades\Monnify::class, ... ]
配置
您可以使用此命令发布配置文件
php artisan vendor:publish --provider="Triverla\LaravelMonnify\MonnifyServiceProvider"
将包含一些合理默认值的配置文件monnify.php
将放置在您的config
目录中,如下所示
<?php return [ 'base_url' => env('MONNIFY_BASE_URL', 'https://sandbox.monnify.com'), 'api_key' => env('MONNIFY_API_KEY', ''), 'secret_key' => env('MONNIFY_SECRET_KEY', ''), 'contract_code' => env('MONNIFY_CONTRACT_CODE', ''), 'source_account_number' => env('MONNIFY_SOURCE_ACCOUNT_NUMBER', ''), 'default_split_percentage' => env('MONNIFY_DEFAULT_SPLIT_PERCENTAGE', 20), 'default_currency_code' => env('MONNIFY_DEFAULT_CURRENCY_CODE', 'NGN'), 'redirect_url' => env('MONNIFY_DEFAULT_REDIRECT_URL', env('APP_URL')), ];
一般支付流程
尽管有多种支付订单的方式,但大多数支付网关都要求您在结账过程中遵循以下流程
1. 客户被重定向到支付提供商
在客户完成结账过程并准备好支付后,客户必须被重定向到支付提供商的网站。
重定向是通过提交包含一些隐藏字段的表单来完成的。表单必须向支付提供商的网站发送POST请求。隐藏字段至少指定了必须支付的金额、客户的姓名、电子邮件和参考。
参考由支付提供商用作支付参考,并可用于验证交易。
2. 客户在支付提供商的网站上支付
客户访问支付提供商的网站,并根据请求选择支付方式。支付订单所需的所有步骤都由支付提供商负责。
3. 客户被重定向回您的网站
支付订单后,客户将被重定向回。在重定向请求到网站时,会返回一些值。这些值通常是paymentReference或transactionReference。
支付参考从请求中获取,并用于验证交易是否有效且来自支付提供商。务必仔细检查此参考。
用法
打开您的.env文件,并添加以下键。您可以在https://app.monnify.com/developer)
MONNIFY_BASE_URL=https://sandbox.monnify.com MONNIFY_API_KEY=xxxxxxxxxx MONNIFY_SECRET_KEY=xxxxxxxxxx MONNIFY_CONTRACT_CODE=xxxxxxxxxx MONNIFY_SOURCE_ACCOUNT_NUMBER=xxxxxxxxxx MONNIFY_DEFAULT_SPLIT_PERCENTAGE=20 MONNIFY_DEFAULT_CURRENCY_CODE=NGN MONNIFY_DEFAULT_REDIRECT_URL=http://:8000/payment/callback
设置路由和控制方法如下
注意:确保您已将/payment/callback
添加到支付请求中的redirect_url
示例
<input type="hidden" name="redirect_url" value="https://:8000/payment/callback">
或
$data = [ 'redirectUrl' => 'https://:8000/payment/callback' ];
Route::post('/pay', [ 'uses' => 'PaymentController@redirectToMonnifyGateway', 'as' => 'pay' ]);
或者
// Laravel 8+ Route::post('/pay', [App\Http\Controllers\PaymentController::class, 'redirectToMonnifyGateway'])->name('pay');
// Laravel 5.0+ Route::get('payment/callback', [ 'uses' => 'PaymentController@handlePaymentCallback' ]);
或者
// Laravel 8+ Route::get('/payment/callback', [App\Http\Controllers\PaymentController::class, 'handlePaymentCallback']);
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Redirect; use Triverla\LaravelMonnify\Facades\Monnify; class PaymentController extends Controller { /** * Redirect the Customer to Monnify Payment Page * @return Url */ public function redirectToMonnifyGateway() { try{ return Monnify::payment()->makePaymentRequest()->redirectNow(); }catch(\Exception $e) { return Redirect::back()->withMessage(['message'=>'The Monnify token has expired. Please refresh the page and try again.', 'type'=>'error']); } } /** * Get payment information * @return void */ public function handleGatewayCallback() { $paymentDetails = Monnify::payment()->getPaymentData(); dd($paymentDetails); // Now you have the payment details, // you can then redirect or do whatever you want } }
或者,
/** * In the case where you need to pass the data from your * controller instead of a form * Make sure to send: * required: name, email, amount, reference, description * optionally: currency, redirect_url, payment_methods * e.g: * */ $data = array( "amount" => 1000, "customerName" => 'John Doe', "customerEmail" => 'john.doe@mail.com', "paymentReference" => 'abcd12345678efghi', "paymentDescription" => 'Payment for goods & services', "currencyCode" => "NGN", "redirectUrl" => 'https://:8000/payment/callback', "paymentMethods" => ['CARD', 'ACCOUNT_TRANSFER'] ); return Monnify::payment()->makePaymentRequest($data)->redirectNow();
<form method="POST" action="{{ route('pay') }}" accept-charset="UTF-8" class="form-horizontal" role="form"> {{ csrf_field() }} {{-- or @csrf--}} <div class="flex flex-col items-center mt-8"> <div class="mb-4"> Roasted Corn ₦ 550 </div> <input type="hidden" name="customer_email" value="john.doe@gmail.com"> {{-- required --}} <input type="hidden" name="customer_name" value="John Doe"> {{-- required --}} <input type="hidden" name="amount" value="550"> {{-- required --}} <input type="hidden" name="currency" value="NGN"> <input type="hidden" name="description" value="Bill Payment"> {{-- required --}} <input type="hidden" name="reference" value="{{ Monnify::genTransactionReference() }}"> {{-- required --}} <input type="hidden" name="redirect_url" value="https://:8000/payment/callback">{{-- optional if you intend to use default redirect url from .env --}} <button class="bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded-lg" type="submit" value="Pay"> <i class="fa fa-plus-circle fa-lg"></i> Proceed to Payment </button> </div> </form>
用法
- 使用以下导入语句导入Monnify外观;
- 同时导入FailedRequestException,该异常处理失败的请求抛出的异常。此异常返回相应的Monnify错误消息和代码了解更多信息
... use Triverla\LaravelMonnify\Facades\Monnify; use Triverla\LaravelMonnify\Exceptions\FailedRequestException; ...
其他方法包括
use Triverla\LaravelMonnify\Facades\Monnify; //Banks $response = Monnify::bank()->getBanks(); $response = Monnify::bank()->getBanksWithUSSDShortCode(); $response = Monnify::bank()->validateBankAccount(BankAccount $bankAccount); //Reserved Accounts $response = Monnify::reservedAccount()->getAllTransactions(array $queryParams); $response = Monnify::reservedAccount()->reserveAccount(string $accountReference, string $accountName, string $customerEmail, string $customerName = null, string $customerBvn = null, string $currencyCode = null, bool $restrictPaymentSource = false, AllowedPaymentSources $allowedPaymentSources = null, IncomeSplitConfig $incomeSplitConfig = null); $response = Monnify::reservedAccount()->getAccountDetails(string $accountReference); $response = Monnify::reservedAccount()->updateSplitConfig(string $accountReference, IncomeSplitConfig $incomeSplitConfig); //Disbursements $response = Monnify::disbursement()->initiateTransferSingle(float $amount, string $reference, string $narration, BankAccount $bankAccount, string $currencyCode = null); $response = Monnify::disbursement()->initiateTransferSingleWithMonnifyTransaction(Tranx $tranx); $response = Monnify::disbursement()->initiateTransferBulk(string $title, string $batchReference, string $narration, OnFailureValidate $onFailureValidate, int $notificationInterval, TranxList $tranxList); $response = Monnify::disbursement()->authorizeTransfer2FA(string $authorizationCode, string $reference, string $path); //Invoices $response = Monnify::invoice()->getAllInvoices(); $response = Monnify::invoice()->createAnInvoice(float $amount, $expiryDateTime, string $customerName, string $customerEmail, string $invoiceReference, string $invoiceDescription, string $redirectUrl, PaymentMethods $paymentMethods, IncomeSplitConfig $incomeSplitConfig = null, string $currencyCode = null); $response = Monnify::invoice()->viewInvoiceDetails(string $invoiceReference); $response = Monnify::invoice()->cancelInvoice(); $response = Monnify::invoice()->reservedAccountInvoicing(string $accountName, string $customerName, string $customerEmail, string $accountReference, string $currencyCode = null); $response = Monnify::invoice()->attachReservedAccountToInvoice(float $amount, $expiryDateTime, string $customerName, string $customerEmail, string $invoiceReference, string $accountReference, string $invoiceDescription, IncomeSplitConfig $incomeSplitConfig = null, string $currencyCode = null); //SubAccounts $response = Monnify::subAccount()->createSubAccount(string $bankCode, string $accountNumber, string $email, string $currencyCode = null, string $splitPercentage = null); $response = Monnify::subAccount()->createSubAccounts(array $accounts); $response = Monnify::subAccount()->getSubAccounts(); $response = Monnify::subAccount()->deleteSubAccount(string $subAccountCode); //Refunds $response = Monnify::refund()->initiateRefund(string $transactionReference, string $refundReference, float $refundAmount, string $refundReason, string $customerNote, string $destinationAccountNumber, string $destinationAccountBankCode); $response = Monnify::refund()->getRefundStatus(string $refundReference); $response = Monnify::refund()->getAllRefunds(int $pageNo = 0, int $pageSize = 10); //Transactions $response = Monnify::transaction()->getAllTransactions(array $queryParams); $response = Monnify::transaction()->initializeTransaction(float $amount, string $customerName, string $customerEmail, string $paymentReference, string $paymentDescription, string $redirectUrl, PaymentMethods $paymentMethods, IncomeSplitConfig $incomeSplitConfig = null, string $currencyCode = null); $response = Monnify::transaction()->calculateHash(string $paymentReference, $amountPaid, string $paidOn, string $transactionReference); $response = Monnify::transaction()->getTransactionStatus(string $transactionReference); $response = Monnify::transaction()->getTransactionStatusByPaymentReference(string $paymentReference); $response = Monnify::transaction()->payWithBankTransfer(string $transactionReference, string $bankCode); //Verification APIs $response = Monnify::verify()->bvn(string $bvnNo, string $accountName, string $dateOfBirth, string $mobileNo); $response = Monnify::verify()->bvnAccountMatch(string $bvnNo, string $accountNumber, string $bankCode); $response = Monnify::verify()->validateBankAccount(string $accountNumber, string $bankCode); // and many more
测试
composer test
待办事项
- 添加更多测试
贡献
请随意分支此包,通过提交拉取请求来增强功能。
错误与问题
如果您发现此包有任何错误或问题,请在此创建问题 问题
安全
如果您发现任何安全相关的问题,请通过电子邮件联系 yusufbenaiah@gmail.com。
我该如何感谢您呢?
为什么不给 GitHub 仓库点星,并在 Twitter 或其他社交平台上分享此仓库的链接。
别忘了在 Twitter 上关注我!
谢谢!Benaiah Yusuf
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。