devinweb/laravel-hyperpay

Laravel MENA支付网关Hyperpay的包。

v1.2.1 2022-10-10 20:53 UTC

This package is auto-updated.

Last update: 2024-09-11 01:26:14 UTC


README

Laravel Hyperpay

Laravel HyperPay

tests StyleCI Shield Latest Version on Packagist Total Downloads

Laravel HyperPay提供了一个简单的方式来处理所有不同状态的交易。

安装

您可以通过composer安装此包

composer require devinweb/laravel-hyperpay

数据库迁移

Laravel-hyperpay提供迁移来处理自己的交易,安装后不要忘记发布迁移

php artisan vendor:publish --tag="hyperpay-migrations"

然后进行迁移

php artisan migrate

此迁移有一个名为Transaction的模型,如果您的应用使用多租户,您可以根据hyperpay transaction模型创建一个新的交易模型。

use Hyn\Tenancy\Traits\UsesTenantConnection;
use Devinweb\LaravelHyperpay\Models\Transaction as ModelsTransaction;

class Transaction extends ModelsTransaction
{
    use UsesTenantConnection;
}

然后不要忘记在配置文件app/hyperpay.php中更新transaction_model路径

<?php

return [
    //
    "transaction_model" => 'YOUR_NEW_TRANSACTION_MODEL_NAMESPACE',
    //
];

设置和配置

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

php artisan vendor:publish --tag="hyperpay-config"

之后,您可以在app/hyperpay.php中看到文件

在开始使用Laravel-hyperpay之前,将ManageUserTransaction特质添加到您的User模型中,此特质提供了多个任务,允许您从给定的用户执行交易过程。

use Devinweb\LaravelHyperpay\Traits\ManageUserTransactions;

class User extends Authenticatable
{
    use ManageUserTransactions;
}

此包使用User模型,默认为App\UserApp\Models\User,否则您可以使用.env定义自己的用户模型

PAYMENT_MODEL=App\Models\User

HyperPay密钥

接下来,您应该在应用配置文件.env中配置Hyperpay环境

SANDBOX_MODE=true
ACCESS_TOKEN=
ENTITY_ID_MADA=
ENTITY_ID=
# default SAR
CURRENCY=

创建交易

要使用此包在Hyperpay中创建交易,我们需要准备结账然后生成表单。

准备结账

use Devinweb\LaravelHyperpay\Facades\LaravelHyperpay;

class PaymentController extends  Controller
{
    public function prepareCheckout(Request $request)
    {
        $trackable = [
            'product_id'=> 'bc842310-371f-49d1-b479-ad4b387f6630',
            'product_type' => 't-shirt'
        ];
        $user = User::first();
        $amount = 10;
        $brand = 'VISA' // MASTER OR MADA

        return LaravelHyperpay::checkout($trackable_data, $user, $amount, $brand, $request);
    }
}

您还可以通过使用此命令创建账单类来将账单数据附加到结账,所有账单文件您都可以在app/Billing文件夹中找到。

php artisan make:billing HyperPayBilling

然后使用

use Devinweb\LaravelHyperpay\Facades\LaravelHyperpay;
use App\Billing\HyperPayBilling

LaravelHyperpay::addBilling(new HyperPayBilling())->checkout($trackable_data, $user, $amount, $brand, $request);

您还可以通过使用addMerchantTransactionId($id)生成自己的商户交易ID,并告诉包使用它

use Illuminate\Support\Str;

$id = Str::random('64');

LaravelHyperpay::addMerchantTransactionId($id)->addBilling(new HyperPayBilling())->checkout($trackable_data, $user, $amount, $brand, $request);

接下来是prepareCheckout操作返回的响应

{
    "buildNumber": "",
    "id": "RANDOME_ID.uat01-vm-tx04",
    "message": "successfully created checkout",
    "ndc": "RANDOME_ID.uat01-vm-tx04",
    "result": {
        "code": "000.200.100",
        "description": "successfully created checkout"
    },
    "script_url": "https://test.oppwa.com/v1/paymentWidgets.js?checkoutId=RANDOME_ID.uat01-vm-tx04",
    "shopperResultUrl": "shopperResultUrl",
    "status": "200",
    "timestamp": "2021-04-05 11:16:50+0000"
}

要创建支付表单,您只需要将以下HTML/JavaScript代码行添加到您的页面上。

<script src="{{ script_url }}"></script>
<form
    action="{{shopperResultUrl}}"
    class="paymentWidgets"
    data-brands="VISA MASTER"
></form>

支付状态

交易过程完成后,Hyperpay会使用您可以在配置文件app/hyperpay.php中配置的shopperResultUrl将用户重定向到商户页面,通过更新redirect_url值。

// app/hyperpay.php

return [
    //
    "redirect_url" => "/hyperpay/finalize",
    //
]

您还可以通过使用addRedirectUrl($url)动态添加redirect_url,这可以覆盖默认配置redirect_url,如果您想要添加动态URL,例如,如果您使用多租户或向重定向URL添加一些参数。

$redirect_url = $req->headers->get('origin'). '/finalize';

LaravelHyperpay::addRedirectUrl($redirect_url)->addBilling(new HyperPayBilling())->checkout($trackable_data, $user, $amount, $brand, $request);

重定向后,您可以使用一个操作来处理最终步骤

use Devinweb\LaravelHyperpay\Facades\LaravelHyperpay;

class PaymentController extends Controller
{
    public function paymentStatus(Request $request)
    {
        $resourcePath = $request->get('resourcePath');
        $checkout_id = $request->get('id');
        return LaravelHyperpay::paymentStatus($resourcePath, $checkout_id);
    }
}

事件处理器

Laravel-hyperpay在交易过程中提供两个事件,在最终确定后,此包会触发成功交易事件

每个事件都包含用于准备结账的trackable_datahyperpay_data

监听器示例

首先,我们使用以下命令创建一个新的监听器

php artisan make:listener TransactionSuccessListener

之后,转到app/Providers/EventServiceProvider并使用您的监听器注册事件

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
         'Devinweb\LaravelHyperpay\Events\SuccessTransaction' => [
            'App\Listeners\TransactionSuccessListener',
        ],
    ];

    //
}

在每个成功交易中,laravel-hyperpay包都会触发一个包含必要数据的带有事件的操作,请参阅我们的TransactionSuccessListener类。

<?php

namespace App\Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;

class TransactionSuccessListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle($event)
    {
       $hyperpay_data =  $event->transaction['hyperpay_data'];

       $trackable_data =  $event->transaction['trackable_data'];
    }
}

您可以用同样的方式处理Devinweb\LaravelHyperpay\Events\FailTransaction事件。

测试

composer test

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

贡献

请参阅CONTRIBUTING获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件imad@devinweb.com联系,而不是使用问题跟踪器。

致谢

许可证

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

Laravel hyperpay样板

您可以使用此存储库来检查laravel-hyperpay-boilerplate软件包的集成。