Интеграция формы регистрации AJAX Mailchimp

122

Есть ли способ интегрировать mailchimp simple (один ввод электронной почты) с AJAX, чтобы не было обновления страницы и перенаправления на страницу mailchimp по умолчанию.

Это решение не работает jQuery Ajax POST не работает с MailChimp

Спасибо

alexndm
источник
после отправки формы он перенаправляется на страницу подтверждения mailchimp.
Alexndm
3
ваше решение имеет огромную дыру в безопасности, ключ API следует рассматривать как частный, поскольку он обеспечивает полный доступ к вашей учетной записи MailChimp. #justsaying
1
Это решение раскрывает ваш mailchimp API, что не является хорошей идеей,
Руайри Браун
3
Разве опция встраивания HTML по умолчанию на веб-сайте mailchimp не раскрывает ваш ключ API? Лучше или хуже этого решения быть не может.
Боб Боббио,
Используйте этот плагин jquery: github.com/scdoshi/jquery-ajaxchimp
sid

Ответы:

241

Вам не нужен ключ API, все, что вам нужно сделать, это вставить стандартную сгенерированную форму mailchimp в свой код (настроить внешний вид по мере необходимости) и в атрибуте "действие" форм изменить post?u=на, post-json?u=а затем в конце действия формы. добавить, &c=?чтобы обойти любую междоменную проблему. Также важно отметить, что при отправке формы вы должны использовать GET, а не POST.

Тег формы по умолчанию будет выглядеть примерно так:

<form action="http://xxxxx.us#.list-manage1.com/subscribe/post?u=xxxxx&id=xxxx" method="post" ... >

измените его, чтобы он выглядел примерно так

<form action="http://xxxxx.us#.list-manage1.com/subscribe/post-json?u=xxxxx&id=xxxx&c=?" method="get" ... >

Mail Chimp вернет объект json, содержащий 2 значения: «результат» - это укажет, был ли запрос успешным или нет (я когда-либо видел только 2 значения, «ошибка» и «успех») и «msg» - сообщение описание результата.

Я отправляю свои формы с помощью этого фрагмента jQuery:

$(document).ready( function () {
    // I only have one form on the page but you can be more specific if need be.
    var $form = $('form');

    if ( $form.length > 0 ) {
        $('form input[type="submit"]').bind('click', function ( event ) {
            if ( event ) event.preventDefault();
            // validate_input() is a validation function I wrote, you'll have to substitute this with your own.
            if ( validate_input($form) ) { register($form); }
        });
    }
});

function register($form) {
    $.ajax({
        type: $form.attr('method'),
        url: $form.attr('action'),
        data: $form.serialize(),
        cache       : false,
        dataType    : 'json',
        contentType: "application/json; charset=utf-8",
        error       : function(err) { alert("Could not connect to the registration server. Please try again later."); },
        success     : function(data) {
            if (data.result != "success") {
                // Something went wrong, do something to notify the user. maybe alert(data.msg);
            } else {
                // It worked, carry on...
            }
        }
    });
}
gbinflames
источник
8
Я сделал jquery-плагин, который использует этот метод: github.com/scdoshi/jquery-ajaxchimp
sid
22
Вы также можете использовать JSONP. Используйте post-jsonкак описано. Удалите, &c=если он у вас есть в URL-адресе действия формы. Используйте dataType: 'jsonp'и jsonp: 'c'для вызова jQuery ajax.
czerasz
5
Обратите внимание, что поля формы электронной почты должны иметь name = "EMAIL" для обработки mailchimp
Ян Уорнер,
5
Просто к сведению, на случай, если у кого-то возникнут проблемы, имя параметра электронной почты должно быть EMAIL(все заглавными). В противном случае вы получите сообщение об ошибке о том, что адрес электронной почты пуст.
Ник Тибери,
5
Не отключил ли MailChimp этот метод доступа к API с момента написания этого ответа? Я не видел в документации указаний на то, что GET / POST без ключа API может подписать пользователя на список.
Грег Белл
34

Основываясь на ответе gbinflames, я сохранил POST и URL-адрес, чтобы форма продолжала работать для тех, у кого отключен JS.

<form class="myform" action="http://XXXXXXXXXlist-manage2.com/subscribe/post" method="POST">
  <input type="hidden" name="u" value="XXXXXXXXXXXXXXXX">
  <input type="hidden" name="id" value="XXXXXXXXX">
  <input class="input" type="text" value="" name="MERGE1" placeholder="First Name" required>
  <input type="submit" value="Send" name="submit" id="mc-embedded-subscribe">
</form>

Затем с помощью jQuery .submit () изменил тип и URL для обработки ответов JSON.

$('.myform').submit(function(e) {
  var $this = $(this);
  $.ajax({
      type: "GET", // GET & url for json slightly different
      url: "http://XXXXXXXX.list-manage2.com/subscribe/post-json?c=?",
      data: $this.serialize(),
      dataType    : 'json',
      contentType: "application/json; charset=utf-8",
      error       : function(err) { alert("Could not connect to the registration server."); },
      success     : function(data) {
          if (data.result != "success") {
              // Something went wrong, parse data.msg string and display message
          } else {
              // It worked, so hide form and display thank-you message.
          }
      }
  });
  return false;
});
skube
источник
18

Вы должны использовать код на стороне сервера, чтобы защитить свою учетную запись MailChimp.

Ниже приводится обновленная версия этого ответа, в которой используется PHP. :

Файлы PHP «защищены» на сервере, где пользователь никогда их не видит, но jQuery все еще может получить доступ и использовать.

1) Загрузите пример PHP 5 jQuery здесь ...

http://apidocs.mailchimp.com/downloads/mcapi-simple-subscribe-jquery.zip

Если у вас только PHP 4, просто загрузите версию 1.2 MCAPI и замените соответствующий MCAPI.class.phpфайл выше.

http://apidocs.mailchimp.com/downloads/mailchimp-api-class-1-2.zip

2) Следуйте инструкциям в файле Readme, добавив ключ API и идентификатор списка в store-address.phpфайл в нужных местах.

3) Вы также можете захотеть собрать имена ваших пользователей и / или другую информацию. Вы должны добавить в store-address.phpфайл массив, используя соответствующие переменные слияния.

Вот как store-address.phpвыглядит мой файл, где я также собираю имя, фамилию и тип электронной почты:

<?php

function storeAddress(){

    require_once('MCAPI.class.php');  // same directory as store-address.php

    // grab an API Key from http://admin.mailchimp.com/account/api/
    $api = new MCAPI('123456789-us2');

    $merge_vars = Array( 
        'EMAIL' => $_GET['email'],
        'FNAME' => $_GET['fname'], 
        'LNAME' => $_GET['lname']
    );

    // grab your List's Unique Id by going to http://admin.mailchimp.com/lists/
    // Click the "settings" link for the list - the Unique Id is at the bottom of that page. 
    $list_id = "123456a";

    if($api->listSubscribe($list_id, $_GET['email'], $merge_vars , $_GET['emailtype']) === true) {
        // It worked!   
        return 'Success!&nbsp; Check your inbox or spam folder for a message containing a confirmation link.';
    }else{
        // An error ocurred, return error message   
        return '<b>Error:</b>&nbsp; ' . $api->errorMessage;
    }

}

// If being called via ajax, autorun the function
if($_GET['ajax']){ echo storeAddress(); }
?>

4) Создайте форму HTML / CSS / jQuery. Находиться на странице PHP не обязательно.

Вот как index.htmlвыглядит мой файл:

<form id="signup" action="index.html" method="get">
    <input type="hidden" name="ajax" value="true" />
    First Name: <input type="text" name="fname" id="fname" />
    Last Name: <input type="text" name="lname" id="lname" />
    email Address (required): <input type="email" name="email" id="email" />
    HTML: <input type="radio" name="emailtype" value="html" checked="checked" />
    Text: <input type="radio" name="emailtype" value="text" />
    <input type="submit" id="SendButton" name="submit" value="Submit" />
</form>
<div id="message"></div>

<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript"> 
$(document).ready(function() {
    $('#signup').submit(function() {
        $("#message").html("<span class='error'>Adding your email address...</span>");
        $.ajax({
            url: 'inc/store-address.php', // proper url to your "store-address.php" file
            data: $('#signup').serialize(),
            success: function(msg) {
                $('#message').html(msg);
            }
        });
        return false;
    });
});
</script>

Необходимые детали ...

  • index.html, созданный как указано выше или аналогично. С jQuery внешний вид и возможности безграничны.

  • Файл store-address.php загружен как часть примеров PHP на сайте Mailchimp и изменен с использованием вашего API KEY и LIST ID . Вам необходимо добавить в массив другие необязательные поля.

  • Файл MCAPI.class.php, загруженный с сайта Mailchimp (версия 1.3 для PHP 5 или версия 1.2 для PHP 4). Поместите его в тот же каталог, что и ваш store-address.php, или вы должны обновить путь URL -адреса в store-address.php, чтобы он мог его найти.

Спарки
источник
2
Если вы просто хотите добавить форму регистрации на свой сайт и отправить ее через AJAX, ответ @ gbinflames подойдет. Просто попробовал сам.
Патрик Кэнфилд
1
Нет, не обязательно .
Nowaker
2
Дерьмо, я должен сказать - я реализовал ответ @ skube некоторое время назад на сайте, а затем добавил https для всего сайта. Только что обнаружил, что он не работает с http-вызовом AJAX mailchimp. Настоятельно рекомендую сразу же использовать этот метод, если вашему сайту может понадобиться или рассмотреть возможность использования SSL.
squarecandy
12

Для тех, кто ищет решение на современном стеке:

import jsonp from 'jsonp';
import queryString from 'query-string';

// formData being an object with your form data like:
// { EMAIL: 'emailofyouruser@gmail.com' }

jsonp(`//YOURMAILCHIMP.us10.list-manage.com/subscribe/post-json?u=YOURMAILCHIMPU&${queryString.stringify(formData)}`, { param: 'c' }, (err, data) => {
  console.log(err);
  console.log(data);
});
adriendenat
источник
6

Основываясь на ответе gbinflames, это сработало для меня:

Создайте простую форму подписки на рассылку mailchimp, скопируйте URL-адрес действия и метод (сообщение) в свою настраиваемую форму. Также переименуйте имена полей формы на заглавные (name = 'EMAIL', как в исходном коде mailchimp, EMAIL, FNAME, LNAME, ...), затем используйте это:

      $form=$('#your-subscribe-form'); // use any lookup method at your convenience

      $.ajax({
      type: $form.attr('method'),
      url: $form.attr('action').replace('/post?', '/post-json?').concat('&c=?'),
      data: $form.serialize(),
      timeout: 5000, // Set timeout value, 5 seconds
      cache       : false,
      dataType    : 'jsonp',
      contentType: "application/json; charset=utf-8",
      error       : function(err) { // put user friendly connection error message  },
      success     : function(data) {
          if (data.result != "success") {
              // mailchimp returned error, check data.msg
          } else {
              // It worked, carry on...
          }
      }
Реза Хашеми
источник
5

Что касается этой даты (февраль 2017 г.), похоже, что mailchimp интегрировал что-то похожее на то, что предлагает gbinflames, в их собственную форму, сгенерированную javascript.

Теперь вам не нужно никакого дополнительного вмешательства, поскольку mailchimp преобразует форму в отправленную с помощью ajax, когда включен javascript.

Все, что вам нужно сделать сейчас, это просто вставить сгенерированную форму из меню встраивания на свою html-страницу и НЕ изменять или добавлять какой-либо другой код.

Это просто работает. Спасибо, MailChimp!

Дуди П
источник
4
Будет действительно
полезно,
Я добавил код встраивания Mailchimp на свою html-страницу, но Ajax не работает автоматически, как было предложено выше. Меня перенаправляют на другую страницу. Как я могу сделать это без редиректа?
Петра
1
В админке MailChimp перейдите в свой список -> Формы регистрации -> Встроенные формы -> Классический. Вы увидите, что в фрагмент кода включен JS. Это включит проверку формы и отправку AJAX.
MarcGuay
1
используя код mailchimp - как подключить настраиваемое действие к успеху ajax? [например, сокрытие формы]
Adeerlike
1
@Masiorama Я решил удалить скрипт mc-validate, поскольку он также содержал старый jquery и был слишком большим и уязвимым. так что просто проверка html и отправка с помощью ajax, как в stackoverflow.com/a/15120409/744690
Adeerlike
4

Для этого используйте плагин jquery.ajaxchimp . Это очень просто!

<form method="post" action="YOUR_SUBSCRIBE_URL_HERE">
  <input type="text" name="EMAIL" placeholder="e-mail address" />
  <input type="submit" name="subscribe" value="subscribe!" />        
  <p class="result"></p>
</form>

JavaScript:

$(function() {
  $('form').ajaxChimp({
    callback: function(response) {
      $('form .result').text(response.msg);
    }
  });
})
Nowaker
источник