Skip to content
Code-Schnipsel Gruppen Projekte
PaymentDisplay.js 14,4 KiB
Newer Older
Patrick Müller's avatar
Patrick Müller committed
/**
 * PaymentDisplay for Amazon Pay
 *
 * @author Patrick Müller (www.pcsg.de)
 */
define('package/quiqqer/payment-amazon/bin/controls/PaymentDisplay', [

    'qui/controls/Control',
    'qui/controls/buttons/Button',

Patrick Müller's avatar
Patrick Müller committed
    'utils/Controls',

Patrick Müller's avatar
Patrick Müller committed
    'Ajax',
    'Locale'

Patrick Müller's avatar
Patrick Müller committed
], function (QUIControl, QUIButton, QUIControlUtils, QUIAjax, QUILocale) {
Patrick Müller's avatar
Patrick Müller committed
    "use strict";

    var pkg = 'quiqqer/payment-amazon';

    return new Class({

        Extends: QUIControl,
        Type   : 'package/quiqqer/payment-amazon/bin/controls/PaymentDisplay',

        Binds: [
            '$onImport',
Patrick Müller's avatar
Patrick Müller committed
            '$showAmazonPayBtn',
Patrick Müller's avatar
Patrick Müller committed
            '$onAmazonLoginReady',
            '$showAmazonWallet',
Patrick Müller's avatar
Patrick Müller committed
            '$showErrorMsg',
            '$onPayBtnClick'
Patrick Müller's avatar
Patrick Müller committed
        ],

        options: {
            sandbox   : true,
            sellerid  : '',
            clientid  : '',
            orderhash : '',
            successful: false
Patrick Müller's avatar
Patrick Müller committed
        },

        initialize: function (options) {
            this.parent(options);

            this.$orderReferenceId = false;
            this.$AuthBtnElm       = null;
            this.$WalletElm        = null;
            this.$PayBtn           = null;
            this.$MsgElm           = null;
Patrick Müller's avatar
Patrick Müller committed
            this.$OrderProcess     = null;
Patrick Müller's avatar
Patrick Müller committed

            this.addEvents({
                onImport: this.$onImport
            });
        },

        /**
         * Event: onImport
         */
        $onImport: function () {
Patrick Müller's avatar
Patrick Müller committed
            var self = this;
            var Elm  = this.getElm();
Patrick Müller's avatar
Patrick Müller committed

            if (Elm.getElement('.message-error')) {
                (function () {
                    self.fireEvent('processingError', [self]);
                }).delay(2000);
                return;
            }

            if (Elm.getElement('.message-error')) {
Patrick Müller's avatar
Patrick Müller committed
            this.$MsgElm     = Elm.getElement('.quiqqer-payment-amazon-message');
            this.$AuthBtnElm = Elm.getElement('#quiqqer-payment-amazon-btn');
            this.$WalletElm  = Elm.getElement('#quiqqer-payment-amazon-wallet');

Patrick Müller's avatar
Patrick Müller committed
            this.$showMsg(
                QUILocale.get(pkg, 'controls.PaymentDisplay.info')
            );
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
            QUIControlUtils.getControlByElement(
                Elm.getParent('[data-qui="package/quiqqer/order/bin/frontend/controls/OrderProcess"]')
            ).then(function (OrderProcess) {
                self.$OrderProcess = OrderProcess;

                if (self.getAttribute('successful')) {
Patrick Müller's avatar
Patrick Müller committed
                    OrderProcess.next();
                    return;
                }

                self.$loadAmazonWidgets();
            });
        },
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
        /**
         * Load Amazon Pay widgets
         */
        $loadAmazonWidgets: function () {
Patrick Müller's avatar
Patrick Müller committed
            var widgetUrl = "https://static-eu.payments-amazon.com/OffAmazonPayments/eur/sandbox/lpa/js/Widgets.js";

            if (!this.getAttributes('sandbox')) {
                widgetUrl = 'https://static-eu.payments-amazon.com/OffAmazonPayments/eur/lpa/js/Widgets.js';
Patrick Müller's avatar
Patrick Müller committed
            }

            if (typeof amazon !== 'undefined') {
Patrick Müller's avatar
Patrick Müller committed
                this.$showAmazonPayBtn();
Patrick Müller's avatar
Patrick Müller committed
                return;
            }

Patrick Müller's avatar
Patrick Müller committed
            this.$OrderProcess.Loader.show();

            if (typeof window.onAmazonPaymentsReady === 'undefined') {
                window.onAmazonPaymentsReady = this.$showAmazonPayBtn;
            }

            if (typeof window.onAmazonLoginReady === 'undefined') {
                window.onAmazonLoginReady = this.$onAmazonLoginReady;
            }

Patrick Müller's avatar
Patrick Müller committed
            new Element('script', {
                async: "async",
                src  : widgetUrl
            }).inject(document.body);
        },

        /**
         * Execute if Amazon Login has loaded
         */
        $onAmazonLoginReady: function () {
            amazon.Login.setClientId(this.getAttribute('clientid'));
        },

        /**
Patrick Müller's avatar
Patrick Müller committed
         * Show Amazon Pay authentication widget (btn)
Patrick Müller's avatar
Patrick Müller committed
         */
Patrick Müller's avatar
Patrick Müller committed
        $showAmazonPayBtn: function () {
Patrick Müller's avatar
Patrick Müller committed
            var self = this;

Patrick Müller's avatar
Patrick Müller committed
            this.$OrderProcess.Loader.hide();

            // re-display if button was previously rendered and hidden
            this.$AuthBtnElm.removeClass('quiqqer-payment-amazon__hidden');
Patrick Müller's avatar
Patrick Müller committed

            OffAmazonPayments.Button(
                'quiqqer-payment-amazon-btn',
                this.getAttribute('sellerid'),
                {
                    type : 'PwA',
                    color: this.$AuthBtnElm.get('data-color'),
                    size : this.$AuthBtnElm.get('data-size'),
Patrick Müller's avatar
Patrick Müller committed

                    authorization: function () {
Patrick Müller's avatar
Patrick Müller committed
                        amazon.Login.authorize({
Patrick Müller's avatar
Patrick Müller committed
                            popup: true,
                            scope: 'payments:widget'
                        }, function (Response) {
                            if (Response.error) {
Patrick Müller's avatar
Patrick Müller committed
                                self.$showErrorMsg(
                                    QUILocale.get(pkg, 'controls.PaymentDisplay.login_error')
                                );
Patrick Müller's avatar
Patrick Müller committed

                                self.fireEvent('processingError', [self]);
Patrick Müller's avatar
Patrick Müller committed
                                return;
                            }

                            self.$accessToken = Response.access_token;
Patrick Müller's avatar
Patrick Müller committed

                            self.$AuthBtnElm.addClass('quiqqer-payment-amazon__hidden');
                            self.$showAmazonWallet(true);
Patrick Müller's avatar
Patrick Müller committed
                        });
Patrick Müller's avatar
Patrick Müller committed
                    },

                    onError: function (Error) {
                        switch (Error.getErrorCode()) {
                            // handle errors on the shop side (most likely misconfiguration)
                            case 'InvalidAccountStatus':
                            case 'InvalidSellerId':
                            case 'InvalidParameterValue':
                            case 'MissingParameter':
                            case 'UnknownError':
                                self.$AuthBtnElm.addClass('quiqqer-payment-amazon__hidden');

                                self.$showErrorMsg(
                                    QUILocale.get(pkg, 'controls.PaymentDisplay.configuration_error')
                                );

                                self.$logError(Error);
                                break;

                            default:
                                self.$showErrorMsg(
                                    QUILocale.get(pkg, 'controls.PaymentDisplay.login_error')
                                );
                        }

                        self.fireEvent('processingError', [self]);
Patrick Müller's avatar
Patrick Müller committed
                    }
                }
            );
        },

        /**
         * Show Amazon Pay Wallet widget
Patrick Müller's avatar
Patrick Müller committed
         *
         * @param {Boolean} [showInfoMessage] - Show info message
Patrick Müller's avatar
Patrick Müller committed
         */
Patrick Müller's avatar
Patrick Müller committed
        $showAmazonWallet: function (showInfoMessage) {
Patrick Müller's avatar
Patrick Müller committed
            var self = this;

Patrick Müller's avatar
Patrick Müller committed
            if (showInfoMessage) {
                this.$showMsg(
                    QUILocale.get(pkg, 'controls.PaymentDisplay.wallet_info')
                );
            }

            this.$WalletElm.set('html', '');
            this.$WalletElm.removeClass('quiqqer-payment-amazon__hidden');

            this.$OrderProcess.resize();
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
            var Options = {
                sellerId       : this.getAttribute('sellerid'),
                design         : {
                    designMode: 'responsive'
                },
                onPaymentSelect: function () {
                    self.$OrderProcess.resize();
Patrick Müller's avatar
Patrick Müller committed
                    self.$PayBtn.enable();
                },
Patrick Müller's avatar
Patrick Müller committed
                onError        : function (Error) {
                    switch (Error.getErrorCode()) {
                        // handle errors on the shop side (most likely misconfiguration)
                        case 'InvalidAccountStatus':
                        case 'InvalidSellerId':
                        case 'InvalidParameterValue':
                        case 'MissingParameter':
                        case 'UnknownError':
                            self.$showErrorMsg(
                                QUILocale.get(pkg, 'controls.PaymentDisplay.configuration_error')
                            );

                            self.$logError(Error);
                            break;

                        case 'AddressNotModifiable':
                        case 'BuyerNotAssociated':
                        case 'BuyerSessionExpired':
                        case 'PaymentMethodNotModifiable':
                        case 'StaleOrderReference':
                            self.$AuthBtnElm.removeClass('quiqqer-payment-amazon__hidden');
Patrick Müller's avatar
Patrick Müller committed
                            self.$orderReferenceId = false;
Patrick Müller's avatar
Patrick Müller committed
                            self.$showErrorMsg(Error.getErrorMessage());
                            break;

                        default:
                            self.$showErrorMsg(
                                QUILocale.get(pkg, 'controls.PaymentDisplay.wallet_error')
                            );
                    }

                    self.fireEvent('processingError', [self]);
Patrick Müller's avatar
Patrick Müller committed
                }
            };

            if (!this.$orderReferenceId) {
                Options.onOrderReferenceCreate = function (orderReference) {
                    self.$orderReferenceId = orderReference.getAmazonOrderReferenceId();
                }
            } else {
                Options.amazonOrderReferenceId = this.$orderReferenceId;
            }

            if (!this.$PayBtn) {
                var PayBtnElm = this.getElm().getElement('#quiqqer-payment-amazon-btn-pay');

Patrick Müller's avatar
Patrick Müller committed
                this.$PayBtn = new QUIButton({
                    'class'  : 'btn-primary',
                    disabled : true,
                    text     : QUILocale.get(pkg, 'controls.PaymentDisplay.btn_pay.text', {
                        display_price: PayBtnElm.get('data-price')
                    }),
                    alt      : QUILocale.get(pkg, 'controls.PaymentDisplay.btn_pay.title', {
                        display_price: PayBtnElm.get('data-price')
                    }),
                    title    : QUILocale.get(pkg, 'controls.PaymentDisplay.btn_pay.title', {
                        display_price: PayBtnElm.get('data-price')
                    }),
                    textimage: 'fa fa-amazon',
                    events   : {
Patrick Müller's avatar
Patrick Müller committed
                        onClick: this.$onPayBtnClick
Patrick Müller's avatar
Patrick Müller committed
                    }
                }).inject(PayBtnElm);
Patrick Müller's avatar
Patrick Müller committed
            }

Patrick Müller's avatar
Patrick Müller committed
            // rendet wallet widget
Patrick Müller's avatar
Patrick Müller committed
            new OffAmazonPayments.Widgets.Wallet(Options).bind('quiqqer-payment-amazon-wallet');
        },

Patrick Müller's avatar
Patrick Müller committed
        /**
         * Start payment process
         *
         * @param {Object} Btn
         */
        $onPayBtnClick: function (Btn) {
            var self = this;

            Btn.disable();
            Btn.setAttribute('texticon', 'fa fa-spinner fa-spin');

            self.$WalletElm.addClass('quiqqer-payment-amazon__hidden');

            self.$OrderProcess.Loader.show(
                QUILocale.get(pkg, 'controls.PaymentDisplay.authorize_payment')
            );

            self.$authorizePayment().then(function (success) {
                if (success) {
                    self.$OrderProcess.next();
                    return;
                }

                self.$OrderProcess.Loader.hide();

                self.$showErrorMsg(
                    QUILocale.get(pkg, 'controls.PaymentDisplay.processing_error')
                );

                self.$showAmazonWallet(false);

                Btn.enable();
                Btn.setAttribute('textimage', 'fa fa-amazon');
Patrick Müller's avatar
Patrick Müller committed
            }, function (error) {
                self.$OrderProcess.Loader.hide();
                self.$showErrorMsg(error.getMessage());

                if (error.getAttribute('orderCancelled')) {
                    self.$orderReferenceId = false;
                }

                if (error.getAttribute('reRenderWallet')) {
                    self.$WalletElm.removeClass('quiqqer-payment-amazon__hidden');
                    self.$showAmazonWallet(false);

                    Btn.enable();
                    Btn.setAttribute('textimage', 'fa fa-amazon');
Patrick Müller's avatar
Patrick Müller committed

                    self.fireEvent('processingError', [self]);
Patrick Müller's avatar
Patrick Müller committed
                    return;
                }

                // sign out
                amazon.Login.logout();
                Btn.destroy();

                self.$showErrorMsg(
                    QUILocale.get(pkg, 'controls.PaymentDisplay.fatal_error')
                );

                new QUIButton({
                    text    : QUILocale.get(pkg, 'controls.PaymentDisplay.btn_reselect_payment.text'),
                    texticon: 'fa fa-credit-card',
                    events  : {
                        onClick: function () {
                            window.location.reload();
                        }
                    }
                }).inject(self.getElm().getElement('#quiqqer-payment-amazon-btn-pay'))
Patrick Müller's avatar
Patrick Müller committed
            });
        },

Patrick Müller's avatar
Patrick Müller committed
        /**
         * Start the payment process
         *
         * @return {Promise}
         */
Patrick Müller's avatar
Patrick Müller committed
        $authorizePayment: function () {
Patrick Müller's avatar
Patrick Müller committed
            var self = this;

            return new Promise(function (resolve, reject) {
Patrick Müller's avatar
Patrick Müller committed
                QUIAjax.post('package_quiqqer_payment-amazon_ajax_authorizePayment', resolve, {
Patrick Müller's avatar
Patrick Müller committed
                    'package'       : pkg,
                    orderHash       : self.getAttribute('orderhash'),
                    orderReferenceId: self.$orderReferenceId,
                    onError         : reject
                })
            });
        },

        /**
         * Show error msg
         *
Patrick Müller's avatar
Patrick Müller committed
         * @param {String} msg
Patrick Müller's avatar
Patrick Müller committed
         */
        $showErrorMsg: function (msg) {
            this.$MsgElm.set(
                'html',
                '<p class="message-error">' + msg + '</p>'
            );
Patrick Müller's avatar
Patrick Müller committed
        },

        /**
         * Show normal msg
         *
         * @param {String} msg
         */
        $showMsg: function (msg) {
            this.$MsgElm.set(
                'html',
                '<p>' + msg + '</p>'
            );
        },

        /**
         * Log an Amazon Pay widget/processing error
         *
         * @param {Object} Error - Amazon Pay widget error
         * @return {Promise}
         */
        $logError: function (Error) {
            return new Promise(function (resolve, reject) {
                QUIAjax.post('package_quiqqer_payment-amazon_ajax_logFrontendError', resolve, {
                    'package': pkg,
                    errorCode: Error.getErrorCode(),
                    errorMsg : Error.getErrorMessage(),
                    onError  : reject
                });
            });
Patrick Müller's avatar
Patrick Müller committed
        }
    });
});