function recaptchaHelper() {} recaptchaHelper.prototype = { siteKey: window.RECAPTCHA_SITE_KEY || null, getToken: function(callback) { if (typeof grecaptcha === 'undefined') { console.error('reCAPTCHA not loaded'); callback(null, 'reCAPTCHA not loaded'); return; } window.onReCaptchaSuccess = function(token) { callback(token); }; grecaptcha.execute(); }, attachTokenToData: function(data, callback) { this.getToken(function(token, error) { if (error || !token) { callback(data, error || 'No token received'); return; } data['recaptcha_token'] = token; callback(data); }); }, submitWithRecaptcha: function(url, data, successCallback, errorCallback) { this.attachTokenToData(data, function(dataWithToken, error) { if (error) { if (typeof errorCallback === 'function') { errorCallback(error); } return; } $.ajax({ url: url, method: 'post', dataType: 'json', data: dataWithToken, success: successCallback, error: function(xhr, status, err) { if (typeof errorCallback === 'function') { errorCallback(err || status); } } }); }); } }; // Instância global var recaptchaHelper = new recaptchaHelper();