Accept payments via UnitPay (unitpay.ru) using this Laravel framework package (Laravel).
- 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.
You can install the package through Composer:
composer require actionm/laravel-unitpayAdd the service provider to the providers array in config/app.php:
'providers' => [
    ActionM\UnitPay\UnitPayServiceProvider::class,
    
]Add the UnitPay facade to your facades array:
    'UnitPay' => ActionM\UnitPay\Facades\UnitPay::class,Publish the configuration file and views
php artisan vendor:publish --provider="ActionM\UnitPay\UnitPayServiceProvider" Publish only the configuration file
php artisan vendor:publish --provider="ActionM\UnitPay\UnitPayServiceProvider" --tag=config Publish only the views
php artisan vendor:publish --provider="ActionM\UnitPay\UnitPayServiceProvider" --tag=views 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 KEYandSECRET KEYparams and paste intoconfig/unitpay.php
- After the configuration has been published, edit config/unitpay.php
- Set the callback static function for searchOrderFilterandpaidOrderFilter
- Set notification channels (email and/or Slack) and Slack webhook_url
- 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)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)The process scheme:
- The request comes from unitpay.ruGEThttp://yourproject.com/unitpay/result(with params).
- The functionExampleController@payOrderFromGateruns the validation process (auto-validation request params).
- The static function searchOrderFilterwill be called (seeconfig/unitpay.phpsearchOrderFilter) to search the order by the unique id.
- If the current order status is NOT paidin your database, the static functionpaidOrderFilterwill be called (seeconfig/unitpay.phppaidOrderFilter).
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);
    }Please see CHANGELOG for more information on what has changed recently.
$ composer testPlease see CONTRIBUTING for details.
If you discover any security related issues, please send me an email at actionmanager@gmail.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.
