shetabit/payment
最新稳定版本:v6.3.0
Composer 安装命令:
composer require shetabit/payment
包简介
Laravel Payment Gateway Integration Package
关键字:
README 文档
README
Laravel Payment Gateway
This is a Laravel Package for Payment Gateway Integration. This package supports Laravel 5.8+.
Donate me if you like this package 😎 ![]()
For PHP integration you can use shetabit/multipay package.
This packages works with multiple drivers, and you can create custom drivers if you can't find them in the current drivers list (below list).
List of contents
List of available drivers
- asanpardakht ✔️
- aqayepardakht ✔️
- atipay ✔️
- azkiVam (Installment payment) ✔️
- behpardakht (mellat) ✔️
- bitpay ✔️
- digipay ✔️
- etebarino (Installment payment) ✔️
- fanavacard ✔️
- irankish ✔️
- local ✔️
- jibit ✔️
- nextpay ✔️
- omidpay ✔️
- parsian ✔️
- pasargad ✔️
- payfa ✔️
- paypal (will be added soon in next version)
- payping ✔️
- paystar ✔️
- poolam ✔️
- rayanpay ✔️
- sadad (melli) ✔️
- saman ✔️
- sep (saman electronic payment) Keshavarzi & Saderat ✔️
- sepehr (saderat) ✔️
- sepordeh ✔️
- sizpay ✔️
- toman ✔️
- vandar ✔️
- yekpay ✔️
- zarinpal ✔️
- zibal ✔️
- Others are under way.
Help me to add the gateways below by creating pull requests
- stripe
- authorize
- 2checkout
- braintree
- skrill
- payU
- amazon payments
- wepay
- payoneer
- paysimple
you can create your own custom drivers if it does not exist in the list, read the
Create custom driverssection.
Install
Via Composer
composer require shetabit/payment
Publish Vendor Files
- publish configuration files:
php artisan vendor:publish --tag=payment-config
- publish views for customization:
php artisan vendor:publish --tag=payment-views
Configure
If you are using Laravel 5.5 or higher then you don't need to add the provider and alias. (Skip to b)
a. In your config/app.php file add these two lines.
// In your providers array. 'providers' => [ ... Shetabit\Payment\Provider\PaymentServiceProvider::class, ], // In your aliases array. 'aliases' => [ ... 'Payment' => Shetabit\Payment\Facade\Payment::class, ],
b. In the config file you can set the default driver to use for all your payments. But you can also change the driver at runtime.
Choose what gateway you would like to use in your application. Then make that as default driver so that you don't have to specify that everywhere. But, you can also use multiple gateways in a project.
// Eg. if you want to use zarinpal. 'default' => 'zarinpal',
Then fill the credentials for that gateway in the drivers array.
'drivers' => [ 'zarinpal' => [ // Fill in the credentials here. 'apiPurchaseUrl' => 'https://www.zarinpal.com/pg/rest/WebGate/PaymentRequest.json', 'apiPaymentUrl' => 'https://www.zarinpal.com/pg/StartPay/', 'apiVerificationUrl' => 'https://www.zarinpal.com/pg/rest/WebGate/PaymentVerification.json', 'merchantId' => '', 'callbackUrl' => 'http://yoursite.com/path/to', 'description' => 'payment in '.config('app.name'), ], ... ]
How to use
your Invoice holds your payment details, so initially we'll talk about Invoice class.
Working with invoices
before doing any thing you need to use Invoice class to create an invoice.
In your code, use it like the below:
// At the top of the file. use Shetabit\Multipay\Invoice; ... // Create new invoice. $invoice = new Invoice; // Set invoice amount. $invoice->amount(1000); // Add invoice details: There are 4 syntax available for this. // 1 $invoice->detail(['detailName' => 'your detail goes here']); // 2 $invoice->detail('detailName','your detail goes here'); // 3 $invoice->detail(['name1' => 'detail1','name2' => 'detail2']); // 4 $invoice->detail('detailName1','your detail1 goes here') ->detail('detailName2','your detail2 goes here');
available methods:
uuid: set the invoice unique idgetUuid: retrieve the invoice current unique iddetail: attach some custom details into invoicegetDetails: retrieve all custom detailsamount: set the invoice amountgetAmount: retrieve invoice amounttransactionId: set invoice payment transaction idgetTransactionId: retrieve payment transaction idvia: set a driver we use to pay the invoicegetDriver: retrieve the driver
Purchase invoice
In order to pay the invoice, we need the payment transactionId. We purchase the invoice to retrieve transaction id:
// At the top of the file. use Shetabit\Multipay\Invoice; use Shetabit\Payment\Facade\Payment; ... // Create new invoice. $invoice = (new Invoice)->amount(1000); // Purchase the given invoice. Payment::purchase($invoice,function($driver, $transactionId) { // We can store $transactionId in database. }); // Purchase method accepts a callback function. Payment::purchase($invoice, function($driver, $transactionId) { // We can store $transactionId in database. }); // You can specify callbackUrl Payment::callbackUrl('http://yoursite.com/verify')->purchase( $invoice, function($driver, $transactionId) { // We can store $transactionId in database. } );
Pay invoice
After purchasing the invoice, we can redirect the user to the bank payment page:
// At the top of the file. use Shetabit\Multipay\Invoice; use Shetabit\Payment\Facade\Payment; ... // Create new invoice. $invoice = (new Invoice)->amount(1000); // Purchase and pay the given invoice. // You should use return statement to redirect user to the bank page. return Payment::purchase($invoice, function($driver, $transactionId) { // Store transactionId in database as we need it to verify payment in the future. })->pay()->render(); // Do all things together in a single line. return Payment::purchase( (new Invoice)->amount(1000), function($driver, $transactionId) { // Store transactionId in database. // We need the transactionId to verify payment in the future. } )->pay()->render(); // Retrieve json format of Redirection (in this case you can handle redirection to bank gateway) return Payment::purchase( (new Invoice)->amount(1000), function($driver, $transactionId) { // Store transactionId in database. // We need the transactionId to verify payment in the future. } )->pay()->toJson();
Verify payment
When user has completed the payment, the bank redirects them to your website, then you need to verify your payment in order to ensure the invoice has been paid.
// At the top of the file. use Shetabit\Payment\Facade\Payment; use Shetabit\Multipay\Exceptions\InvalidPaymentException; ... // You need to verify the payment to ensure the invoice has been paid successfully. // We use transaction id to verify payments // It is a good practice to add invoice amount as well. try { $receipt = Payment::amount(1000)->transactionId($transaction_id)->verify(); // You can show payment referenceId to the user. echo $receipt->getReferenceId(); ... } catch (InvalidPaymentException $exception) { /** when payment is not verified, it will throw an exception. We can catch the exception to handle invalid payments. getMessage method, returns a suitable message that can be used in user interface. **/ echo $exception->getMessage(); }
Useful methods
-
callbackUrl: can be used to change callbackUrl on the runtime.// At the top of the file. use Shetabit\Multipay\Invoice; use Shetabit\Payment\Facade\Payment; ... // Create new invoice. $invoice = (new Invoice)->amount(1000); // Purchase the given invoice. Payment::callbackUrl($url)->purchase( $invoice, function($driver, $transactionId) { // We can store $transactionId in database. } );
-
amount: you can set the invoice amount directly// At the top of the file. use Shetabit\Multipay\Invoice; use Shetabit\Payment\Facade\Payment; ... // Purchase (we set invoice to null). Payment::callbackUrl($url)->amount(1000)->purchase( null, function($driver, $transactionId) { // We can store $transactionId in database. } );
-
via: change driver on the fly// At the top of the file. use Shetabit\Multipay\Invoice; use Shetabit\Payment\Facade\Payment; ... // Create new invoice. $invoice = (new Invoice)->amount(1000); // Purchase the given invoice. Payment::via('driverName')->purchase( $invoice, function($driver, $transactionId) { // We can store $transactionId in database. } );
-
config: set driver configs on the fly// At the top of the file. use Shetabit\Multipay\Invoice; use Shetabit\Payment\Facade\Payment; ... // Create new invoice. $invoice = (new Invoice)->amount(1000); // Purchase the given invoice with custom driver configs. Payment::config('mechandId', 'your mechand id')->purchase( $invoice, function($driver, $transactionId) { // We can store $transactionId in database. } ); // Also we can change multiple configs at the same time. Payment::config(['key1' => 'value1', 'key2' => 'value2'])->purchase( $invoice, function($driver, $transactionId) { // We can store $transactionId in database. } );
Create custom drivers:
First you have to add the name of your driver, in the drivers array and also you can specify any config parameters you want.
'drivers' => [ 'zarinpal' => [...], 'my_driver' => [ ... // Your Config Params here. ] ]
Now you have to create a Driver Map Class that will be used to pay invoices.
In your driver, You just have to extend Shetabit\Payment\Abstracts\Driver.
Eg. You created a class: App\Packages\PaymentDriver\MyDriver.
namespace App\Packages\PaymentDriver; use Shetabit\Multipay\Abstracts\Driver; use Shetabit\Multipay\Exceptions\InvalidPaymentException; use Shetabit\Multipay\{Contracts\ReceiptInterface, Invoice, Receipt}; class MyDriver extends Driver { protected $invoice; // Invoice. protected $settings; // Driver settings. public function __construct(Invoice $invoice, $settings) { $this->invoice($invoice); // Set the invoice. $this->settings = (object) $settings; // Set settings. } // Purchase the invoice, save its transactionId and finaly return it. public function purchase() { // Request for a payment transaction id. ... $this->invoice->transactionId($transId); return $transId; } // Redirect into bank using transactionId, to complete the payment. public function pay() { // It is better to set bankApiUrl in config/payment.php and retrieve it here: $bankUrl = $this->settings->bankApiUrl; // bankApiUrl is the config name. // Prepare payment url. $payUrl = $bankUrl.$this->invoice->getTransactionId(); // Redirect to the bank. return redirect()->to($payUrl); } // Verify the payment (we must verify to ensure that user has paid the invoice). public function verify(): ReceiptInterface { $verifyPayment = $this->settings->verifyApiUrl; $verifyUrl = $verifyPayment.$this->invoice->getTransactionId(); ... /** Then we send a request to $verifyUrl and if payment is not valid we throw an InvalidPaymentException with a suitable message. **/ throw new InvalidPaymentException('a suitable message'); /** We create a receipt for this payment if everything goes normally. **/ return new Receipt('driverName', 'payment_receipt_number'); } }
Once you create that class you have to specify it in the payment.php config file map section.
'map' => [ ... 'my_driver' => App\Packages\PaymentDriver\MyDriver::class, ]
Note:- You have to make sure that the key of the map array is identical to the key of the drivers array.
Events
You can listen for 2 events
- InvoicePurchasedEvent: Occurs when an invoice is purchased (after purchasing invoice is done successfully).
- InvoiceVerifiedEvent: Occurs when an invoice is verified successfully.
Change log
Please see CHANGELOG for more information on what has been changed recently.
Contributing
Please see CONTRIBUTING and CONDUCT for details.
Security
If you discover any security related issues, please email khanzadimahdi@gmail.com instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.
Star History
shetabit/payment 适用场景与选型建议
shetabit/payment 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 318.51k 次下载、GitHub Stars 达 929, 最近一次更新时间为 2019 年 02 月 13 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「payment」 「pay」 「gateway」 「paypal」 「Bank」 「payment gateway」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 shetabit/payment 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 shetabit/payment 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 shetabit/payment 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
repository php library
Payyo Gateway for the Omnipay payment processing library
Библиотека для приема платежей через Альфабанк.
Some pre-defined rules for validation in Omnipay payment processing library.
BluePay gateway for the Omnipay payment processing library
支付宝接口扩展包
统计信息
- 总下载量: 318.51k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 933
- 点击次数: 39
- 依赖项目数: 11
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-02-13
