jayboss/paystack

这是一个与 Laravel 集成的 paystack 支付网关整合

v1.0.2 2023-03-13 23:15 UTC

This package is auto-updated.

Last update: 2024-09-16 17:32:19 UTC


README

一个无缝工作于 Paystack 的 Laravel 包

安装

需要 PHP 8.0.2+ 和 Composer

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

composer require jayboss/paystack

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

"jayboss/paystack": "1.0.2"

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

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

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

配置

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

php artisan vendor:publish --provider="Jayboss\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=mayeconcept@gmail.com

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

注意:请确保您已将 /payment/callback 在 Paystack Dashboard 中注册 https://dashboard.paystack.co/#/settings/developer,如下所示

payment-callback

// Laravel 10.x and above
//import PaymentController class at the top
Route::post('/pay', [PaymentController::class, 'redirectToGateway'])->name('pay');
Route::get('/payment/callback', [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 Jayboss\Paystack\Paystack;

class PaymentController extends Controller
{

    /**
     * Redirect the User to Paystack Payment Page
     * @return Url
     */
    public function redirectToGateway()
    {
        try{
            $paystack = new Paystack();

            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()
    {
         $paystack = new Paystack();
        $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
    }
}
/**
 *  In the case where you need to pass the data from your 
 *  controller instead of a form
 *  Make sure to send:
 *  required: email, amount, reference, orderID(probably)
 *  optionally: currency, description, metadata
 *  e.g:
 *  
 */
$data = array(
        "amount" => 700 * 100,
        "reference" => '4g4g5485g8545jg8gj',
        "email" => 'user@mail.com',
        "currency" => "NGN",
        "orderID" => 23456,
    );

return $paystack->getAuthorizationUrl($data)->redirectNow();

将支付参考从控制器传递到视图中,如下所示

    public function test()
    {
        $paystack = new Paystack();
        $ref = $paystack->genTranxRef();
        return view('welcome',compact('ref'));
    }

一个示例表单看起来如下所示

<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="{{ $ref }}"> {{-- 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() - 此函数调用验证方法并确保它是有效的交易,否则会抛出异常。

许可证

MIT 许可证 (MIT)。