Skip to content
Code-Schnipsel Gruppen Projekte
Events.php 3,88 KiB
Newer Older
Patrick Müller's avatar
Patrick Müller committed
<?php

namespace QUI\ERP\Payments\Amazon;

use QUI;
use QUI\ERP\Accounting\Payments\Gateway\Gateway;
use AmazonPay\IpnHandler;
use QUI\ERP\Order\Handler as OrderHandler;
Patrick Müller's avatar
Patrick Müller committed
use QUI\ERP\Payments\Amazon\Payment as AmazonPayment;
Patrick Müller's avatar
Patrick Müller committed

/**
 * Class Events
 *
 * Global Event Handler for quiqqer/payment-amazon
 */
class Events
{
    /**
     * quiqqer/payments: onPaymentsGatewayReadRequest
     *
     * Read request to the central payment gateway and check
     * if it is an Amazon Pay request
     *
     * @param Gateway $Gateway
     * @return void
     */
    public static function onPaymentsGatewayReadRequest(Gateway $Gateway)
    {
        if (!Provider::isIpnHandlingActivated()) {
            return;
        }

Patrick Müller's avatar
Patrick Müller committed
        $headers = getallheaders();
        $body    = file_get_contents('php://input');

        try {
            $IpnHandler = new IpnHandler($headers, $body);
        } catch (\Exception $Exception) {
            // request is not an Amazon IPN request and can be safely ignored
            return;
        }

        $ipnData         = $IpnHandler->toArray();
        $orderIdentifier = false;

        if (!empty($ipnData['AuthorizationDetails']['AuthorizationReferenceId'])) {
Patrick Müller's avatar
Patrick Müller committed
            // do not work with asynchronous Authorize requests
            return;
        }

        if (!empty($ipnData['CaptureDetails']['CaptureReferenceId'])) {
            $orderIdentifier = $ipnData['CaptureDetails']['CaptureReferenceId'];
Patrick Müller's avatar
Patrick Müller committed
        }

        if (!$orderIdentifier) {
            QUI\System\Log::addDebug(
Patrick Müller's avatar
Patrick Müller committed
                'Amazon Pay :: Could not parse AuthorizationReferenceId or CaptureReferenceId from IPN request.'
                . ' IPN request data: ' . $IpnHandler->toJson()
            );

            return;
        }

        // parse Order ID from AuthorizationReferenceId
        $orderIdentifier = explode('_', $orderIdentifier);
Patrick Müller's avatar
Patrick Müller committed
        $Orders          = OrderHandler::getInstance();
Patrick Müller's avatar
Patrick Müller committed

        try {
Patrick Müller's avatar
Patrick Müller committed
            $Order = $Orders->getOrderById($orderIdentifier[1]);
Patrick Müller's avatar
Patrick Müller committed
        } catch (\Exception $Exception) {
            QUI\System\Log::addError(
                'Amazon Pay :: Could not load Order from IPN request. Parsed Order ID: ' . $orderIdentifier[1]
Patrick Müller's avatar
Patrick Müller committed
            );

            return;
        }

        $Gateway->setOrder($Order);
        $Gateway->enableGatewayPayment();

        // now the Gateway can call \QUI\ERP\Payments\Amazon->executeGatewayPayment()
Patrick Müller's avatar
Patrick Müller committed
    }

    /**
     * quiqqer/order: onQuiqqerOrderSuccessful
     *
     * Check if funds have to be captured as soon as the order is successful
     *
     * @param QUI\ERP\Order\AbstractOrder $Order
     * @return void
Patrick Müller's avatar
Patrick Müller committed
     *
     * @throws QUI\ERP\Accounting\Payments\Exception
Patrick Müller's avatar
Patrick Müller committed
     */
    public static function onQuiqqerOrderSuccessful(QUI\ERP\Order\AbstractOrder $Order)
    {
        $OrderPayment = $Order->getPayment();

        if (is_null($OrderPayment)) {
            return;
        }

        if (!($OrderPayment->getPaymentType() instanceof AmazonPayment)) {
Patrick Müller's avatar
Patrick Müller committed
        // determine if payment has to be captured now or later
        $articleType = Provider::getPaymentSetting('article_type');
        $capture     = false;

        switch ($articleType) {
            case Payment::SETTING_ARTICLE_TYPE_PHYSICAL:
                // later
                break;
            case Payment::SETTING_ARTICLE_TYPE_DIGITAL:
                // now
                $capture = true;
                break;

            default:
                $capture = true;
            // determine by order article type
            // @todo
        }

        if (!$capture) {
            return;
        }

        try {
            $Payment = new Payment();
            $Payment->capturePayment($Order);
        } catch (AmazonPayException $Exception) {
            // nothing, capturePayment() marks Order as problematic
Patrick Müller's avatar
Patrick Müller committed
        } catch (\Exception $Exception) {
            QUI\System\Log::writeException($Exception);
Patrick Müller's avatar
Patrick Müller committed
        }
    }
}