thereza/laravel-paystack

适用于Paystack的Laravel包

1.0.7 2021-06-18 16:05 UTC

This package is auto-updated.

Last update: 2024-09-07 21:00:58 UTC


README

Latest Stable Version License Build Status Quality Score Total Downloads

一个用于无缝使用Paystack的Laravel包

安装

需要PHP 5.4+或HHVM 3.3+以及Composer。

要获取Laravel Paystack的最新版本,只需要求它

composer require unicodeveloper/laravel-paystack

或者在您的composer.json文件的require块中添加以下行。

"unicodeveloper/laravel-paystack": "1.0.*"

然后您需要运行composer installcomposer update来下载它并更新自动加载器。

一旦安装了Laravel Paystack,您需要注册服务提供者。打开config/app.php,并在providers键中添加以下内容。

'providers' => [
    ...
    Unicodeveloper\Paystack\PaystackServiceProvider::class,
    ...
]

如果您使用的是Laravel >= 5.5,您可以跳过此步骤,直接进入配置

  • Unicodeveloper\Paystack\PaystackServiceProvider::class

此外,您可以这样注册门面

'aliases' => [
    ...
    'Paystack' => Unicodeveloper\Paystack\Facades\Paystack::class,
    ...
]

配置

您可以使用此命令发布配置文件

php artisan vendor:publish --provider="Unicodeveloper\Paystack\PaystackServiceProvider"

将名为paystack.php的配置文件(包含一些合理的默认值)放置在您的config目录中

<?php

return [

    /**
     * Public Key From Paystack Dashboard
     *
     */
    'publicKey' => getenv('PAYSTACK_PUBLIC_KEY'),

    /**
     * Secret Key From Paystack Dashboard
     *
     */
    'secretKey' => getenv('PAYSTACK_SECRET_KEY'),

    /**
     * Paystack Payment URL
     *
     */
    'paymentUrl' => getenv('PAYSTACK_PAYMENT_URL'),

    /**
     * Optional email address of the merchant
     *
     */
    'merchantEmail' => getenv('MERCHANT_EMAIL'),

];

一般支付流程

尽管有多种支付订单的方法,但大多数支付网关都希望您在结账过程中遵循以下流程

1. 客户被重定向到支付提供者

在客户完成结账流程并准备支付后,客户必须被重定向到支付提供者的网站。

通过提交包含一些隐藏字段的表单来实现重定向。该表单必须向支付提供者的网站发送POST请求。隐藏字段至少指定必须支付的金额、订单ID和一个散列值。

散列值是通过隐藏表单字段和一个非公开的秘密计算得出的。支付提供者使用的散列值用于验证请求是否有效。

2. 客户在支付提供者的网站上支付

客户到达支付提供者的网站,并可以选择支付方式。支付订单所需的全部步骤都由支付提供者负责。

3. 客户被重定向回您的网站

客户支付订单后,将被重定向回。在重定向到商店网站的请求中,返回一些值。这些值通常是订单ID、支付结果和一个散列值。

散列值是通过返回的字段和一些非公开的秘密值计算得出的。此散列值用于验证请求是否有效且来自支付提供者。检查此散列值至关重要。

用法

打开您的.env文件,并添加您的公钥、私钥、商户电子邮件和支付URL,如下所示

PAYSTACK_PUBLIC_KEY=xxxxxxxxxxxxx
PAYSTACK_SECRET_KEY=xxxxxxxxxxxxx
PAYSTACK_PAYMENT_URL=https://api.paystack.co
MERCHANT_EMAIL=unicodeveloper@gmail.com

如果您使用的是像Heroku这样的托管服务,请确保将上述详细信息添加到您的配置变量中。

设置路由和控制器方法如下所示

注意:确保您已在Paystack仪表板中注册了/payment/callback,如下所示https://dashboard.paystack.co/#/settings/developer

payment-callback

// Laravel 5.1.17 and above
Route::post('/pay', 'PaymentController@redirectToGateway')->name('pay');

或者

Route::post('/pay', [
    'uses' => 'PaymentController@redirectToGateway',
    'as' => 'pay'
]);

或者

// Laravel 8
Route::post('/pay', [App\Http\Controllers\PaymentController::class, 'redirectToGateway'])->name('pay');
Route::get('/payment/callback', 'PaymentController@handleGatewayCallback');

或者

// Laravel 5.0
Route::get('payment/callback', [
    'uses' => 'PaymentController@handleGatewayCallback'
]);

或者

// Laravel 8
Route::get('/payment/callback', [App\Http\Controllers\PaymentController::class, 'handleGatewayCallback']);
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redirect;
use Paystack;

class PaymentController extends Controller
{

    /**
     * Redirect the User to Paystack Payment Page
     * @return Url
     */
    public function redirectToGateway()
    {
        try{
            return Paystack::getAuthorizationUrl()->redirectNow();
        }catch(\Exception $e) {
            return Redirect::back()->withMessage(['msg'=>'The paystack token has expired. Please refresh the page and try again.', 'type'=>'error']);
        }        
    }

    /**
     * Obtain Paystack payment information
     * @return void
     */
    public function handleGatewayCallback()
    {
        $paymentDetails = Paystack::getPaymentData();

        dd($paymentDetails);
        // Now you have the payment details,
        // you can store the authorization_code in your db to allow for recurrent subscriptions
        // you can then redirect or do whatever you want
    }
}

让我在这里解释一下这个包提供的流式方法。

/**
 *  This fluent method does all the dirty work of sending a POST request with the form data
 *  to Paystack Api, then it gets the authorization Url and redirects the user to Paystack
 *  Payment Page. We've abstracted all of it, so you don't have to worry about that.
 *  Just eat your cookies while coding!
 */
Paystack::getAuthorizationUrl()->redirectNow();

/**
 * Alternatively, use the helper.
 */
paystack()->getAuthorizationUrl()->redirectNow();

/**
 * This fluent method does all the dirty work of verifying that the just concluded transaction was actually valid,
 * It verifies the transaction reference with Paystack Api and then grabs the data returned from Paystack.
 * In that data, we have a lot of good stuff, especially the `authorization_code` that you can save in your db
 * to allow for easy recurrent subscription.
 */
Paystack::getPaymentData();

/**
 * Alternatively, use the helper.
 */
paystack()->getPaymentData();

/**
 * This method gets all the customers that have performed transactions on your platform with Paystack
 * @returns array
 */
Paystack::getAllCustomers();

/**
 * Alternatively, use the helper.
 */
paystack()->getAllCustomers();


/**
 * This method gets all the plans that you have registered on Paystack
 * @returns array
 */
Paystack::getAllPlans();

/**
 * Alternatively, use the helper.
 */
paystack()->getAllPlans();


/**
 * This method gets all the transactions that have occurred
 * @returns array
 */
Paystack::getAllTransactions();

/**
 * Alternatively, use the helper.
 */
paystack()->getAllTransactions();

/**
 * This method generates a unique super secure cryptographic hash token to use as transaction reference
 * @returns string
 */
Paystack::genTranxRef();

/**
 * Alternatively, use the helper.
 */
paystack()->genTranxRef();


/**
* This method creates a subaccount to be used for split payments
* @return array
*/
Paystack::createSubAccount();

/**
 * Alternatively, use the helper.
 */
paystack()->createSubAccount();


/**
* This method fetches the details of a subaccount
* @return array
*/
Paystack::fetchSubAccount();

/**
 * Alternatively, use the helper.
 */
paystack()->fetchSubAccount();


/**
* This method lists the subaccounts associated with your paystack account
* @return array
*/
Paystack::listSubAccounts();

/**
 * Alternatively, use the helper.
 */
paystack()->listSubAccounts();


/**
* This method Updates a subaccount to be used for split payments
* @return array
*/
Paystack::updateSubAccount();

/**
 * Alternatively, use the helper.
 */
paystack()->updateSubAccount();

一个示例表单看起来是这样的

<?php
// more details https://paystack.com/docs/payments/multi-split-payments/#dynamic-splits

$split = [
   "type" => "percentage",
   "currency" => "KES",
   "subaccounts" => [
    [ "subaccount" => "ACCT_li4p6kte2dolodo", "share" => 10 ],
    [ "subaccount" => "ACCT_li4p6kte2dolodo", "share" => 30 ],
   ],
   "bearer_type" => "all",
   "main_account_share" => 70
];
?>
<form method="POST" action="{{ route('pay') }}" accept-charset="UTF-8" class="form-horizontal" role="form">
    <div class="row" style="margin-bottom:40px;">
        <div class="col-md-8 col-md-offset-2">
            <p>
                <div>
                    Lagos Eyo Print Tee Shirt
                    ₦ 2,950
                </div>
            </p>
            <input type="hidden" name="email" value="otemuyiwa@gmail.com"> {{-- required --}}
            <input type="hidden" name="orderID" value="345">
            <input type="hidden" name="amount" value="800"> {{-- required in kobo --}}
            <input type="hidden" name="quantity" value="3">
            <input type="hidden" name="currency" value="NGN">
            <input type="hidden" name="metadata" value="{{ json_encode($array = ['key_name' => 'value',]) }}" > {{-- For other necessary things you want to add to your payload. it is optional though --}}
            <input type="hidden" name="reference" value="{{ Paystack::genTranxRef() }}"> {{-- required --}}
            
            <input type="hidden" name="split_code" value="SPL_EgunGUnBeCareful"> {{-- to support transaction split. more details https://paystack.com/docs/payments/multi-split-payments/#using-transaction-splits-with-payments --}}
            <input type="hidden" name="split" value="{{ json_encode($split) }}"> {{-- to support dynamic transaction split. More details https://paystack.com/docs/payments/multi-split-payments/#dynamic-splits --}}
            {{ csrf_field() }} {{-- works only when using laravel 5.1, 5.2 --}}

            <input type="hidden" name="_token" value="{{ csrf_token() }}"> {{-- employ this in place of csrf_field only in laravel 5.0 --}}

            <p>
                <button class="btn btn-success btn-lg btn-block" type="submit" value="Pay Now!">
                    <i class="fa fa-plus-circle fa-lg"></i> Pay Now!
                </button>
            </p>
        </div>
    </div>
</form>

点击提交按钮后,客户会被重定向到Paystack网站。

因此,我们现在已经将客户重定向到Paystack。客户在那里执行了一些操作(希望他们已经支付了订单)并现在被重定向回我们的商店网站。

Paystack会将客户重定向到Paystack仪表板上Web Hooks部分的回调URL中指定的路由URL。

我们必须验证重定向到我们网站的是否是一个有效请求(我们不希望冒充者错误地放置未支付的订单)。

在处理来自支付提供商的请求的控制器中,我们有

Paystack::getPaymentData() - 此函数调用验证方法并确保这是一笔有效交易,否则会抛出异常。

您可以使用以下详细信息进行测试

Card Number: 4123450131001381
Expiry Date: any date in the future
CVV: 883

待办事项

  • 重新收费客户
  • 添加综合测试
  • 实现交易仪表板以查看laravel应用程序中的所有交易

贡献

请随时fork这个包并通过提交拉取请求来贡献,以增强功能。

我该如何感谢你呢?

为什么不星标GitHub仓库呢?我非常希望得到关注!为什么不分享这个仓库的链接到Twitter或HackerNews?传播消息!

别忘了在Twitter上关注我

谢谢!Prosper Otemuyiwa。

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。