Skip to content
Code-Schnipsel Gruppen Projekte
PaymentDisplay.js 13,8 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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('.quiqqer-payment-amazon-content')) {
                    return;
                }
    
    
    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
    
                                    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')
                                    );
                            }
    
    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', '');
    
    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.$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')
                                );
                        }
    
    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
    
                        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
            }
        });
    });