dammyammy/lara-pay-ng

为Laravel 5提供的支付解决方案(针对尼日利亚特定服务提供商,例如GTPay、SimplePay、CashEnvoy、VoguePay、WebPay)

dev-master 2015-07-29 04:56 UTC

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

这将创建以下内容

  1. app/Http/Controllers/PaymentController.php中创建一个PaymentController
  • 注意:这是一个工作示例,您可能需要更改命名空间以匹配您的项目命名空间
  1. 迁移将被发布到数据库/migrations文件夹
  2. 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 注入可用的方法

事件

抛出这些事件是可选的,但有助于作为您处理完成交易的钩子。在以下示例场景中,您可能会这样做:

  1. 向客户发送电子邮件,通知他们最近的交易状态。
  2. 在成功交易后,您想将某人的账户设置为活动状态。
  3. 您想将付款客户添加到付款客户邮件列表中。

可能性是无限的,您只需将\ 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');

待办事项

  • 重构代码
  • 从开始到结束处理交易的能力
  • 用测试来备份一切。