daaner / laravel-unitpay
UnitPay payments for Laravel
Requires
- php: >=7.1.3
- guzzlehttp/guzzle: >=6.4
- laravel/framework: >=5.5
Requires (Dev)
- orchestra/testbench: >=3.0
- phpunit/phpunit: >=8.0
This package is auto-updated.
Last update: 2024-10-14 20:32:16 UTC
README
Accept payments via UnitPay (unitpay.ru) using this Laravel framework package (Laravel).
Based on ActionM
- receive payments, adding just the two callbacks
- receive payment notifications via your email or Slack
You can accept payments with Unitpay via Yandex.Money, QIWI, WebMoney, PayPal, credit cards etc.
Laravel 5.5+, PHP >= 7.1+
Installation
You can install the package through Composer:
composer require daaner/laravel-unitpay
Add the service provider to the providers
array in config/app.php
:
'providers' => [ Daaner\UnitPay\UnitPayServiceProvider::class, ]
Add the UnitPay
facade to your facades array:
'UnitPay' => Daaner\UnitPay\Facades\UnitPay::class,
Publish the configuration file and views
php artisan vendor:publish --provider="Daaner\UnitPay\UnitPayServiceProvider"
Publish only the configuration file
php artisan vendor:publish --provider="Daaner\UnitPay\UnitPayServiceProvider" --tag=config
Publish only the views
php artisan vendor:publish --provider="Daaner\UnitPay\UnitPayServiceProvider" --tag=views
Configuration
Once you have published the configuration files, please edit the config file in config/unitpay.php
.
- Create an account on unitpay.ru
- Add your project, copy the
PUBLIC KEY
andSECRET KEY
params and paste intoconfig/unitpay.php
- After the configuration has been published, edit
config/unitpay.php
- Set the callback static function for
searchOrderFilter
andpaidOrderFilter
- Set notification channels (email and/or Slack) and Slack
webhook_url
Usage
- Generate an HTML payment form with enabled payment methods:
$payment_amount = Order amount $payment_no = Unique order ID in your project $user_email = User email $item_name = Name of your order item $currency = 'RUB' or 'UAH','BYR','EUR','USD'
UnitPay::generatePaymentForm($payment_amount, $payment_no, $user_email, $item_name, $currency);
Customize the HTML payment form in the published view:
app/resources/views/vendor/unitpay/payment_form.blade.php
- Process the request from UnitPay:
UnitPay::payOrderFromGate(Request $request)
Important
You must define callbacks in config/unitpay.php
to search the order and save the paid order.
'searchOrderFilter' => null // ExampleController:searchOrderFilter($request)
'paidOrderFilter' => null // ExampleController::paidOrderFilter($request,$order)
Example
The process scheme:
- The request comes from
unitpay.ru
GET
http://yourproject.com/unitpay/result
(with params). - The function
ExampleController@payOrderFromGate
runs the validation process (auto-validation request params). - The static function
searchOrderFilter
will be called (seeconfig/unitpay.php
searchOrderFilter
) to search the order by the unique id. - If the current order status is NOT
paid
in your database, the static functionpaidOrderFilter
will be called (seeconfig/unitpay.php
paidOrderFilter
).
Add the route to routes/web.php
:
Route::get('/unitpay/result', 'ExampleController@payOrderFromGate');
Note: don't forget to save your full route url (e.g. http://example.com/unitpay/result ) for your project on unitpay.ru.
Create the following controller: /app/Http/Controllers/ExampleController.php
:
class ExampleController extends Controller { /** * Search the order if the request from unitpay is received. * Return the order with required details for the unitpay request verification. * * @param Request $request * @param $order_id * @return mixed */ public static function searchOrderFilter(Request $request, $order_id) { // If the order with the unique order ID exists in the database $order = Order::where('unique_id', $order_id)->first(); if ($order) { $order['UNITPAY_orderSum'] = $order->amount; // from your database $order['UNITPAY_orderCurrency'] = 'RUB'; // from your database // if the current_order is already paid in your database, return strict "paid"; // if not, return something else $order['UNITPAY_orderStatus'] = $order->order_status; // from your database return $order; } return false; } /** * When the payment of the order is received from unitpay, you can process the paid order. * !Important: don't forget to set the order status as "paid" in your database. * * @param Request $request * @param $order * @return bool */ public static function paidOrderFilter(Request $request, $order) { // Your code should be here: YourOrderController::saveOrderAsPaid($order); // Return TRUE if the order is saved as "paid" in the database or FALSE if some error occurs. // If you return FALSE, then you can repeat the failed paid requests on the unitpay website manually. return true; } /** * Process the request from the UnitPay route. * searchOrderFilter is called to search the order. * If the order is paid for the first time, paidOrderFilter is called to set the order status. * If searchOrderFilter returns the "paid" order status, then paidOrderFilter will not be called. * * @param Request $request * @return mixed */ public function payOrderFromGate(Request $request) { return UnitPay::payOrderFromGate($request); }
Changelog
Please see CHANGELOG for more information on what has changed recently.
Testing
$ composer test
Contributing
Please see CONTRIBUTING for details.
Credits
License
The MIT License (MIT). Please see License File for more information.