devinweb / laravel-hyperpay
Laravel MENA支付网关Hyperpay的包。
Requires
- php: ^7.3|^8.0
- guzzlehttp/guzzle: ^7.0
Requires (Dev)
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.3
README
Laravel HyperPay
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\User
或App\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_data
和hyperpay_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软件包的集成。