Файл: monst/Xsolla.php
Строк: 124
<?
//error_reporting(-1);
//ini_set('display_errors', 1);
$HOME = $_SERVER['DOCUMENT_ROOT'];
include $HOME . '/core/in/conf.php';
include $HOME . '/core/in/fnct.php';
include $HOME . '/core/in/db.php';
include $HOME . '/Xsolla/xsolla-autoloader.php';
use XsollaSDKWebhookWebhookServer;
use XsollaSDKWebhookMessageMessage;
use XsollaSDKExceptionWebhookXsollaWebhookException;
use XsollaSDKExceptionWebhookInvalidUserException;
$callback = function (Message $message) {
    global $HOME, $_users, $_payment, $_not;
    switch ($message->getNotificationType()) {
        case Message::USER_VALIDATION:
            /** @var XsollaSDKWebhookMessageUserValidationMessage $message */
            // TODO if user not found, you should throw XsollaSDKExceptionWebhookInvalidUserException
            $name = $message -> getUserId();
            $name = null_html($name);
            $user = $_users -> findOne(
                [
                    'name' => $name
                ]
            );
            if ( !$user ) {
                throw new InvalidUserException('User ID not found');
            }
            break;
        case Message::PAYMENT:
            /** @var XsollaSDKWebhookMessagePaymentMessage $message */
            // TODO if the payment delivery fails for some reason, you should throw XsollaSDKExceptionWebhookXsollaWebhookException
            $name = $message -> getUserId();
            $name = null_html($name);
            $user = $_users -> findOne(
                [
                    'name' => $name
                ]
            );
            if ( !$user ) {
                exit;
            }
            $data = $message -> toArray();
            $xsolla_id = $data['transaction']['id'];
            $gold = $data['purchase']['virtual_currency']['quantity'];
            $gold = $gold * 2;
//            $sum = $data['payment_details']['payment']['amount'];
//            $currency = $data['payment_details']['payment']['currency'];
//            $payout = $data['payment_details']['payout']['amount'];
//            $method = $data['transaction']['payment_method'];
//            $ip = $data['user']['ip'];
//            $phone = $data['user']['phone'];
//            $email = $data['user']['email'];
//            $country = $data['user']['country'];
            $payment_id = new_id('_payment');
            $_payment -> insert(
                [
                    'id'=> $payment_id,
                    'time' => time(),
                    'user_id' => $user['id'],
                    'xsolla_id' => $xsolla_id,
                    'data' => $data,
                    'cancel' => 0
                ]
            );
            $_users -> update(
                [
                    'id' => $user['id']
                ],
                [
                    '$set' => [
                        'gold' => $user['gold'] + $gold
                    ]
                ]
            );
            // not
            $not_text = '+' . $gold . ' gold added.<br/>Xsolla';
            $not_id = new_id('_not');
            $_not -> insert(
                [
                    'id' => $not_id,
                    'user_id' => $user['id'],
                    'time' => time(),
                    'text' => $not_text
                ]
            );
            // quest
            include $HOME . '/core/content/daily.php';
            $daily_db = $user['daily'];
            $daily = $DAILY;
            foreach ( $daily as $q ) {
                $daily[$q['id']]['count'] = $daily_db[$q['id']]['count'];
                $daily[$q['id']]['end'] = $daily_db[$q['id']]['end'];
            }
            foreach ( $daily as $q ) {
                if ( $q['type'] == 'buy_gold' ) {
                    $daily_db[$q['id']]['count'] += $gold;
                    $_users -> update(
                        [
                            'id' => $user['id']
                        ],
                        [
                            '$set' => [
                                'daily' => $daily_db
                            ]
                        ]
                    );
                }
            }
            break;
        case Message::REFUND:
            /** @var XsollaSDKWebhookMessageRefundMessage $message */
            // TODO if you cannot handle the refund, you should throw XsollaSDKExceptionWebhookXsollaWebhookException
                $name = $message -> getUserId();
                $name = null_html($name);
                $user = $_users -> findOne(
                    [
                        'name' => $name
                    ]
                );
                if ( !$user ) {
                    exit;
                }
                $data = $message -> toArray();
                $xsolla_id = $data['transaction']['id'];
                $gold = $data['purchase']['virtual_currency']['quantity'];
                $gold = $gold * 2;
                $_payment -> update(
                    [
                        'xsolla_id'=> $xsolla_id,
                        'user_id' => $user['id'],
                    ],
                    [
                        '$set' => [
                            'cancel' => 1
                        ]
                    ]
                );
                $_users -> update(
                    [
                        'id' => $user['id']
                    ],
                    [
                        '$set' => [
                            'gold' => $user['gold'] - $gold
                        ]
                    ]
                );
            break;
        default:
            throw new XsollaWebhookException('Notification type not implemented');
    }
};
$webhookServer = WebhookServer::create($callback, $Xsolla['project_key']);
$webhookServer->start();