dammyammy / lara-pay-ng
为Laravel 5提供的支付解决方案(针对尼日利亚特定服务提供商,例如GTPay、SimplePay、CashEnvoy、VoguePay、WebPay)
Requires
- php: >=5.5.9
- guzzlehttp/guzzle: ~5.0
- illuminate/support: 5.1.*
- nesbot/carbon: ~1.19
This package is not auto-updated.
Last update: 2024-09-28 17:43:53 UTC
README
支持使用单个API方法集成多个网关,这意味着代码中的集成是统一的。
注意:请勿在生产环境中使用,目前正在开发中,以兼容Laravel的最新版本。
目标是尽可能多地集成支付网关。
要求
当前支持
- VoguePay
- GTPay
- CashEnvoy
- SimplePay
正在开发的网关
- WebPay
安装
简单运行
composer require dammyammy/lara-pay-ng
接下来,将服务提供者添加到config/app.php中的 Providers 数组中
'providers' => [ /* * Laravel Framework Service Providers... */ 'Illuminate\Foundation\Providers\ArtisanServiceProvider', 'Illuminate\Auth\AuthServiceProvider', .... 'LaraPayNG\Providers\LaraPayNGServiceProvider', ],
接下来发布所有包文件
php artisan vendor:publish
这将创建以下内容
- 在app/Http/Controllers/PaymentController.php中创建一个PaymentController
- 注意:这是一个工作示例,您可能需要更改命名空间以匹配您的项目命名空间
- 迁移将被发布到数据库/migrations文件夹
- 4个视图,与控制器匹配
- 一个带有模拟结账按钮的视图
- 一个是付款页面(立即付款按钮)
- 一个是成功通知URL,显示成功交易
- 一个是失败通知URL,显示失败交易
接下来,将以下内容添加到您的app/Http/routes.php路由页面中,并根据需要编辑,但请确保指定的值与您的配置文件匹配
Route::get('orders', [ 'as' => 'orders', 'uses' => 'PaymentController@orders' ]); Route::get('checkout', [ 'as' => 'checkout', 'uses' => 'PaymentController@checkout' ]); $successUrl = config('lara-pay-ng.gateways.routes.success_route'); $successName = config('lara-pay-ng.gateways.routes.success_route_name'); $failureUrl = config('lara-pay-ng.gateways.routes.failure_route'); $failureName = config('lara-pay-ng.gateways.routes.failure_route_name'); Route::post('/' . $successUrl . '/{mert_id}', [ 'as' => $successName, 'uses' => 'PaymentController@success' ]); Route::post('/' . $failureUrl . '/{mert_id}', [ 'as' => $failureName, 'uses' => 'PaymentController@failed' ]); Route::post('/payment-notification/{mert_id}', [ 'as' => 'payment-notification', 'uses' => 'PaymentController@notification' ]);
请记住,对于支付路由,不要允许CSRF令牌验证
这可能是在您绝对需要这样做的情况下的一种用例。如果这样做,当交易ID被发送回时,您的网站将抛出TokenMismatchException,因为网关提供商正在回发,并且没有从您的应用程序生成令牌。
如果您更改了默认名称和URL,请使用适当的路由端点。
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'transaction-failed/*', 'transaction-successful/*', 'payment-notification/*', ]; }
接下来迁移包表。
php artisan migrate
接下来,通过访问/Orders测试默认控制器。
需要注意的是,要将支付功能注入到控制器中,您只需将PaymentGatewayManager类注入到该控制器中即可,这样您就可以立即访问以下外观提供的所有方法。
use LaraPayNG\Exceptions\UnknownPaymentGatewayException; use LaraPayNG\Managers\PaymentGatewayManager; class PaymentController extends Controller { /** * @var PaymentGateway */ private $paymentGateway; /** * @param PaymentGatewayManager $paymentGateway */ public function __construct(PaymentGatewayManager $paymentGateway) { $this->paymentGateway = $paymentGateway; } .... }
外观
通过外观/ PaymentGatewayManager 注入可用的方法
事件
抛出这些事件是可选的,但有助于作为您处理完成交易的钩子。在以下示例场景中,您可能会这样做:
- 向客户发送电子邮件,通知他们最近的交易状态。
- 在成功交易后,您想将某人的账户设置为活动状态。
- 您想将付款客户添加到付款客户邮件列表中。
可能性是无限的,您只需将\ LaraPayNG Traits DetermineTransactionStatus特征拉入您的控制器,并在控制器中调用dispatchAppropriateEvents($result);方法。例如:
public function notification($mert_id, Request $request) { $result = $this->handleTransactionResponse($mert_id, $request); $this->dispatchAppropriateEvents($result); return $this->determineViewToPresent($result); }
然后,在app/Providers/EventServiceProvider.php中创建事件监听器
<?php namespace App\Providers; use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'LaraPayNG\Events\TransactionSuccessful' => [ // 'App\Listeners\SendEmailForSuccessfulTransactions', // 'App\Listeners\ActivateUser', ], 'LaraPayNG\Events\TransactionUnsuccessful' => [ // 'App\Listeners\DeactivateUser', ], ]; .... }
最后,创建您的监听器实现,了解您有权访问包含所需值的数组。以下是一个示例实现
文件:app/Listeners/ActivateUser.php
<?php namespace App\Listeners; use LaraPayNG\Events\TransactionSuccessful; use App\User; class ActivateUser { /** * Handle the event. * * @param ActivateUser $event * @return void */ public function handle(ActivateUser $event) { // All Values Below are available // $event['status'], // $event['items'], // $event['transaction_id'], // $event['merchant_ref'], // $event['amount'], // $event['customer_id'], // $event['payer_id'], $user = User::find($event['customer_id']); $user->activate = true; $user->save(); return true; } }
异常
所有异常都位于此命名空间下;
namespace \LaraPayNG\Exceptions;
命令
有一个命令可以帮助清除在指定天数内记录的陈旧记录。要使用它,请在终端中键入
# php artisan lara-pay-ng:purge-database gatewayname --days=3 --with-failed=false
php artisan lara-pay-ng:purge-database
您可以将网关名称属性传递给命令,例如gtpay、voguepay。这对于多网关设置特别有用。
如果没有传递此选项,将使用配置中设置的默认网关驱动程序。
还可以传递一个--with-failed选项,该选项接受true/false。true表示所有失败的交易都应该包括在删除中,以及一个--days选项,指定数据被视为旧数据的天数。
提示
将这些方法添加到您的Helpers.php文件中,然后在composer.json中自动加载。
public function generateTransactionData($dessert, $transactionId) { return 'name=' . $dessert->present()->name . ';pre=' . $dessert->present()->buyPrice . ';buyer=' . currentUserName() . '; transactionId=' . $transactionId; } public function generateTransactionMemo($product) { return 'Name: ' . $product->name . '; Price: ' . $product->price . '; Buyer: ' . Auth::user()->email; }
然后您就可以轻松地进行操作了
$product = Product::get('2'); $transactionData = [ 'ce_amount' => $product->price, 'ce_memo' => generateTransactionMemo($product), ... ]; CashEnvoy::button($product->id, $transactionData, 'btn btn-success', '<i class="fa fa-currency"></i> Pay');
待办事项
- 重构代码
- 从开始到结束处理交易的能力
- 用测试来备份一切。