prevailexcel / laravel-bani
一个用于处理 Bani 支付的 Laravel 扩展包
Requires
- guzzlehttp/guzzle: ^7.0.1
This package is auto-updated.
Last update: 2024-09-06 01:20:54 UTC
README
一个用于无缝处理 Bani 支付的 Laravel 扩展包。
此包还允许您接收来自 Bani 的 webhooks,它将为您验证并处理有效载荷。它还实现了 Bani Pop 支付小部件并处理了 laravel 的回调。您可以在几分钟内开始收集法定货币和加密货币支付。
安装
PHP 5.4+ 或 HHVM 3.3+,以及 Composer 是必需的。
要获取 Laravel Bani 的最新版本,只需要求它
composer require prevailexcel/laravel-bani
或者将以下行添加到您的 composer.json
文件的 require 块中。
"prevailexcel/laravel-bani": "1.0.*"
然后您需要运行 composer install
或 composer update
以下载它并更新自动加载器。
安装 Laravel Bani 后,您需要注册服务提供者。打开 config/app.php
并将以下内容添加到 providers
键中。
如果您使用 Laravel >= 5.5,您可以跳过此步骤,并转到
配置
'providers' => [ ... PrevailExcel\Bani\BaniServiceProvider::class, ... ]
同样,您可以注册 Facade,如下所示
'aliases' => [ ... 'Bani' => PrevailExcel\Bani\Facades\Bani::class, ... ]
配置
您可以使用此命令发布配置文件
php artisan vendor:publish --provider="PrevailExcel\Bani\BaniServiceProvider"
一个名为 bani.php
的配置文件,其中包含一些合理的默认值,将被放置在您的 config
目录中
<?php return [ /** * Tribe Account Ref Key From Bani Dashboard * */ 'tribeAccountRef' => getenv('BANI_TRIBE_ACCOUNT_REF'), /** * Public Key From Bani Dashboard * */ 'publicKey' => getenv('BANI_PUBLIC_KEY'), /** * Merchant Key From Bani Dashboard * */ 'merchantKey' => getenv('BANI_PRIVATE_KEY'), /** * Merchant Key From Bani Dashboard * */ 'accessToken' => getenv('BANI_ACCESS_TOKEN'), /** * You enviroment can either be live or stage. * Make sure to add the appropriate API key after changing the enviroment in .env * */ 'env' => env('BANI_ENV', 'stage'), /** * BANI Live URL * */ 'liveUrl' => env('BANI_LIVE_URL', "https://live.getbani.com/api/v1"), /** * BANI Stage URL * */ 'stageUrl' => env('BANI_STAGE_URL', "https://stage.getbani.com/api/v1"), ];
一般支付流程
这是支付流程应有的样子
1. 收集客户订单数据
您必须收集用户支付内容的信息和金额。这些通常包括电子邮件、金额、电话号码、名字和姓氏。您可以直接从您的 blade 表单(如果您正在构建一个网站)或通过请求从客户端应用程序中这样做。
2. 获取 Bani Pop 小部件或调用您想要的方法。
Bani 允许用户在离开您的网站或应用程序之前完成支付。因此,您可以调用 payWithWidget()
获取 Bani Pop 小部件,并让用户完成支付。
如果您想实现自己的 UI 或您正在构建一个 API,您可以使用各种流畅的方法来开始和完成支付。您可以使用 bankTransfer()
、mobileMoney()
、payWithCrypto()
、startPayWithOpay()
等更多方法。
3. 支付后为您提供服务
完成支付后,您必须确认支付。此包可以帮助轻松处理 webhook。如果您使用 pop 小部件,它还可以帮助您处理回调。
建议使用 webhook 响应,该响应由本包为您验证,然后标记订单为已支付,并将他们发送到感谢页面,发送电子邮件,或执行您想要执行的操作。
用法
打开您的 .env 文件并添加所有必要的键,如下所示
BANI_TRIBE_ACCOUNT_REF=**-************************** BANI_PUBLIC_KEY=***_****_********************* BANI_PRIVATE_KEY=********************** BANI_ACCESS_TOKEN=**************************************************** BANI_ENV=stage
如果您使用的是像 heroku 这样的托管服务,请确保将上述详细信息添加到您的配置变量中。 请记住,当您处于生产状态时,将 BANI_ENV 更改为 'live' 并更新密钥。
接下来,您必须设置您的路由。
您应该有 3 个路由来开始。
- 开始支付
- 设置回调(如果您想使用
payWithWidget()
)- Route::callback。 - 设置 webhook 并处理事件响应 - Route::webhook。
// Laravel 5.1.17 and above Route::post('/pay', 'PaymentController@createPayment')->name('pay'); Route::callback(PaymentController::class, 'handleGatewayCallback'); Route::webhook(WebhookController::class, 'handleWebhook');
或者
// Laravel 8 & 9 Route::post('/pay', [PaymentController::class, 'createPayment'])->name('pay'); Route::callback(PaymentController::class, 'handleGatewayCallback'); Route::webhook(WebhookController::class, 'handleWebhook');
现在使用小部件支付。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use PrevailExcel\Bani\Facades\Bani; class PaymentController extends Controller { /** * You collect data from your blade form * and this returns the Bani Pop Widget */ public function createPayment() { try { return Bani::payWithwidget(); } catch (\Exception $e) { return redirect()->back()->withMessage(['msg' => $e->getMessage(), 'type' => 'error']); } } public function handleGatewayCallback() { // verify transaction and get data $data = bani()->getPaymentData(); // Do anything you want dd($data); } }
这会打开小部件,并让用户完成支付。该程序将重定向到 handleGatewayCallback()
,该函数验证支付,然后您可以使用支付数据。
要测试银行转账,选择银行后,复制账户信息,前往 https://demo-checkout.getbani.com/test_bank/ 进行测试支付,然后返回您的网站并点击“我已经支付 {金额}”按钮。
现在使用银行转账支付。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use PrevailExcel\Bani\Facades\Bani; class PaymentController extends Controller { /** * You collect data from your blade form * and this returns the Account details for payment */ public function createPayment() { try { $data = [ "pay_amount" => 10000, "holder_account_type" => "temporary", "customer_ref" => "MC-69941173958782368244", "custom_data" => ["id" => 1, "color" => "white"], ]; // You can use the global helper bani()>method() or the Facade Bani:: method(). return bani()->bankTransfer($data); } catch (\Exception $e) { return redirect()->back()->withMessage(['msg' => $e->getMessage(), 'type' => 'error']); } } public function handleWebhook() { // verify webhook and get data bani()->getWebhookData()->proccessData(function ($data) { // Do something with $data logger($data); // If you have heavy operations, dispatch your queued jobs for them here // OrderJob::dispatch($data); }); // Acknowledge you received the response return http_response_code(200); } }
要获取客户引用,您可以通过创建带有用户详情的
bani()->createCustomer($userdata)
方法或通过电话bani()->customer("+2348011111111")
查找用户来获取用户详情。
这将返回包含账户详情的数据,您可以将这些数据显示或发送给用户以进行支付。您可以监听webhook并服务用户。将重操作写入 handleWebhook()
方法中。
该软件包建议使用队列作业处理webhook数据,特别是如果您处理像发送邮件这样的重操作。
webhook路由 Route::webhook(Controller::class, 'methodName')
是如何工作的?
在幕后,默认情况下,这将注册一个POST路由 'bani/webhook'
到您提供的控制器和方法。因为发送webhook的应用程序没有获取csrf-token的方式,您必须将该路由添加到 VerifyCsrfToken中间件的except数组中。
protected $except = [ 'bani/webhook', ];
一个示例表单看起来是这样的
<form method="POST" action="{{ route('pay') }}"> @csrf <div class="form-group" style="margin-bottom: 10px;"> <label for="phone-number">Phone Number</label> <input class="form-control" type="tel" name="phone" required /> </div> <div class="form-group" style="margin-bottom: 10px;"> <label for="email">Email</label> <input class="form-control" type="email" name="email" required /> </div> <div class="form-group" style="margin-bottom: 10px;"> <label for="amount">Amount</label> <input class="form-control" type="number" name="amount" required /> </div> <div class="form-group" style="margin-bottom: 10px;"> <label for="first-name">First Name</label> <input class="form-control" type="text" name="firstName" /> </div> <div class="form-group" style="margin-bottom: 10px;"> <label for="last-name">Last Name</label> <input class="form-control" type="text" name="lastName" /> </div> <div class="form-submit"> <button class="btn btn-primary btn-block" type="submit"> Pay </button> </div> </form>
当点击提交按钮时,客户将被重定向到弹出小部件。
所以现在客户在那里执行了一些操作(希望他或她已经支付了订单),现在该软件包将客户重定向到回调URL Route::callback()
。
我们必须验证重定向到我们网站的请求是否有效(我们不想冒名顶替者错误地放置未支付订单)。
在处理来自支付提供者的请求的控制器中,我们有
Bani::getPaymentData()
- 此函数调用 verifyTransaction()
方法并确保它是有效的交易,否则抛出异常。
此软件包提供的某些流畅方法在此列出。
客户
// For all methods, you can get data from request() /** * Check if the customer already exist * @returns array */ Bani::customer(?string $phone, ?string $ref); // Or request()->phone; bani()->customer(); /** * Create a customer object * @returns array */ Bani::createCustomer(); // Or bani()->createCustomer(); /** * Update a customer object * @returns array */ Bani::updateCustomer(); // Or bani()->updateCustomer(); /** * Fetch your customer delivery/billing address(es). */ Bani::listBillingAddress(); // Or bani()->listBillingAddress(); /** * Add customer delivery/billing address(es) * @returns array */ Bani::addBillingAddress(); // Or bani()->addBillingAddress(); /** * Uupdate customer's delivery/billing address * @returns array */ Bani::updateBillingAddress(); // Or bani()->updateBillingAddress(); /** * Delete customer's delivery/billing address * @returns array */ Bani::deleteBillingAddress(); // Or bani()->deleteBillingAddress();
收集支付
/** * Accept payments from customers via bank transfer * @returns array */ Bani::bankTransfer(); /** * Accept payments via mobile money from customers * @returns array */ Bani::mobileMoney(); /** * Accept payments from customers via crypto and get settled in fiat * @returns array */ Bani::payWithCrypto(); /** * generate a deposit address to accept strictly DLT payments * and get settled with the same currency */ Bani::getWalletAddress(); /** * Accept one-click payment from customers via bani shopper wallet * @returns array */ Bani::startPayWithBaniShopper(); /** * Complete 2nd step in payment from customers via bani shopper wallet * @returns array */ Bani::completePayWithBaniShopper();
验证
/** * The fastest and most secure way to verify mobile numbers using USSD instead of SMS OTPs. * @returns array */ Bani::verifyPhone(?string $phone); /** * This endpoint is used to confirmed if the customer phone number has been verified * @returns array */ Bani::checkUssdStatus(?string $verification_reference);
杂项
/** * This endpoint can be used to carry out a lookup on customer account * @returns array */ Bani::confirmEwallet($wallet, $tag, ?string $type);
待办事项
- 添加全面测试
- 添加对代理端点的支持
- 添加对更多杂项端点的支持
- 添加对账单支付端点的支持
- 添加对支付端点的支持
贡献
请随意fork此软件包,通过提交拉取请求来贡献以提高功能。
如何感谢你?
为什么不给github存储库加星?我渴望关注!为什么不分享这个存储库的链接到Twitter或HackerNews?传播消息!
别忘了在 Twitter上关注我!也请在 LinkedIn上关注我!
还可以查看我在medium上的页面,了解关于Laravel的文章和教程 在medium上关注我!
谢谢!Chimeremeze Prevail Ejimadu。
许可证
MIT许可证(MIT)。有关更多信息,请参阅 许可证文件。