gee-captcha.js 4.45 KB
/**
 * Created by TaoHuang on 2016/12/12.
 */

var $ = require('yoho-jquery');


var GeeCaptcha = function(container, options) {
    var optionDefault = {
        template: require('hbs/common/gee-captcha.hbs'),
        initURI: '//www.yohobuy.com/passport/images.png',
        checkURI: '//www.yohobuy.com/passport/captcha/img'
    };

    $.extend(this, optionDefault, options);
    this.container = container;
    this.$container = $(this.container);
    this.$container.html(this.template());
    this.$tip = this.$container.find('.img-check-tip-gee');
    this._result = [];
    this._captchObj = null;
    this.successCb = null;
    this.refreshCb = null;

    // NODE: 这个是专门给自动化测试做的后门
    this.$_____trojanYohobuy = this.$container.find('#yohobuy');

    return this;
};

GeeCaptcha.prototype = {
    init: function() {
        var _this = this;

        $.get(_this.initURI + '?t=' + $.now()).then(function(data) {
            initGeetest && initGeetest({  // eslint-disable-line
                gt: data.gt,
                challenge: data.challenge,
                product: 'float', // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
                offline: !data.success // 表示用户后台检测极验服务器是否宕机,一般不需要关注
            }, $.proxy(_this.initCallback, _this));
        });

        return this;
    },

    initCallback: function(captchaObj) {
        var _this = this;

        _this._captchObj = captchaObj;

        captchaObj.onSuccess(function() {
            var validate = captchaObj.getValidate();

            _this._result = [
                validate.geetest_challenge,
                validate.geetest_validate,
                validate.geetest_seccode
            ];

            _this.hideTip();
            _this.successCb && _this.successCb();
        });

        captchaObj.onFail(function() {
            _this._result = [];
            _this.hideTip();
        });

        captchaObj.onRefresh(function() {
            _this._result = [];
            _this.hideTip();
            _this.refreshCb && _this.refreshCb();
        });

        captchaObj.appendTo(_this.$container.find('.img-check-main').get(0));
    },

    refresh: function() {
        var _this = this;

        return $.sleep(500).then(function() {
            _this._captchObj.refresh();
        });
    },

    onRefresh: function(cb) {
        this.refreshCb = cb;
        return this;
    },

    onSuccess: function(cb) {
        this.successCb = cb;
        return this;
    },

    check: function() {
        var _this = this;

        if (_this.getResults() === '') {
            _this.showTip();
            return $.Deferred().reject().promise(); // eslint-disable-line
        }

        if (!this.checkURI) { // 如果没有跳过网络检查
            return $.Deferred().resolve().promise(); // eslint-disable-line
        }

        return $.post(this.checkURI, {
            verifyCode: _this.getResults()
        }).then(function(result) {
            if (result.code === 200) {
                _this.hideTip();
                return $.Deferred().resolve().promise(); // eslint-disable-line
            } else if (result.code === 403) {
                _this.refresh();
                return $.Deferred().reject().promise(); //eslint-disable-line
            } else {
                _this.showTip(result.message);
                return $.Deferred().reject().promise(); //eslint-disable-line
            }
        }).fail(function() {
            _this.refresh();
        });
    },

    getResults: function() {
        if (this.$_____trojanYohobuy && this.$_____trojanYohobuy.val()) {
            this._result = [];
            this._result.push(this.$_____trojanYohobuy.val());
        }

        return this._result.join(',');
    },

    showTip: function(msg) {
        if (msg) {
            this.$tip.find('em').html(msg);
        } else {
            this.$tip.find('em').html('请输入正确的图形验证码');
        }

        if (this.$tip) {
            this.$tip.removeClass('hide');
        }
        return this;
    },

    hideTip: function() {
        if (this.$tip) {
            this.$tip.addClass('hide');
        }
        return this;
    },

    show: function() {
        this.$container.removeClass('hide');
    },

    hide: function() {
        this.$container.addClass('hide');
    }
};

GeeCaptcha.prototype.construct = GeeCaptcha;

require('../../common/promise');

module.exports = GeeCaptcha;