triverlalaravel-monnify

Monnify的Laravel包

v1.0.2 2023-08-02 00:03 UTC

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 installcomposer 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)。有关更多信息,请参阅 许可证文件