Integração do formulário de inscrição do AJAX Mailchimp

122

Existe alguma maneira de integrar o mailchimp simple (uma entrada de email) ao AJAX, para que não haja atualização de página nem redirecionamento para a página padrão do mailchimp.

Esta solução não funciona O jQuery Ajax POST não funciona com o MailChimp

obrigado

alexndm
fonte
depois de enviar o formulário, ele é redirecionado para a página "confirmar" do mailchimp.
Alexdm
3
Se sua solução possui uma enorme falha de segurança, a chave da API deve ser tratada como privada, pois fornece acesso total à sua conta do MailChimp. #justsaying
1
Essa solução expõe sua API MailChimp que não é uma boa idéia
Ruairi Browne
3
A opção de incorporação HTML padrão no site do mailchimp também não expõe sua chave API? Não pode ser melhor ou pior do que essa solução.
Bob Bobbio
Use este plug-in do jquery: github.com/scdoshi/jquery-ajaxchimp
sid

Respostas:

241

Você não precisa de uma chave de API, tudo o que você precisa fazer é inserir o formulário padrão gerado pelo mailchimp em seu código (personalizar a aparência conforme necessário) e no atributo "action" do formulário, alterar post?u=para post-json?u=e depois no final da ação do formulário anexar &c=?para solucionar qualquer problema entre domínios. Também é importante observar que, quando você envia o formulário, deve usar GET em vez de POST.

Sua tag de formulário será mais ou menos assim por padrão:

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

alterá-lo para algo parecido com isto

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

O Mail Chimp retornará um objeto json contendo 2 valores: 'resultado' - isso indicará se a solicitação foi bem-sucedida ou não (só vi 2 valores, "erro" e "êxito") e 'msg' - uma mensagem descrevendo o resultado.

Submeto meus formulários com este pedaço de 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
fonte
8
Fiz um que usa-plugin jQuery este método: github.com/scdoshi/jquery-ajaxchimp
sid
22
Você também pode usar JSONP. Use o post-jsondescrito. Remova o &c=URL se você o tiver no formulário de ação. Use dataType: 'jsonp'e jsonp: 'c'para a sua chamada ajax do jQuery.
czerasz
5
Note-se que os campos do formulário de e-mail deve ter name = "EMAIL" para MailChimp para processo
Ian Warner
5
Apenas para sua informação, caso alguém esteja tendo problemas, o nome do parâmetro de email deve ser EMAIL(em maiúsculas). Caso contrário, você receberá um erro informando que o endereço de email está em branco.
Nick Tiberi
5
O MailChimp desativou esse método de acessar a API desde que esta resposta foi escrita? Não vi nenhuma indicação na documentação de que um GET / POST sem a chave da API possa inscrever um usuário em uma lista.
Greg Bell
34

Com base na resposta da gbinflames, mantive o POST e o URL, para que o formulário continuasse funcionando para aqueles com o JS desativado.

<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>

Em seguida, o uso do .submit () do jQuery alterou o tipo e a URL para manipular as respostas 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
fonte
18

Você deve usar o código do lado do servidor para proteger sua conta do MailChimp.

A seguir, há uma versão atualizada desta resposta que usa PHP :

Os arquivos PHP são "protegidos" no servidor em que o usuário nunca os vê, mas o jQuery ainda pode acessar e usar.

1) Faça o download do exemplo jQuery do PHP 5 aqui ...

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

Se você possui apenas o PHP 4, basta baixar a versão 1.2 do MCAPI e substituir o MCAPI.class.phparquivo correspondente acima.

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

2) Siga as instruções no arquivo Leiame adicionando a chave da API e o ID da lista ao store-address.phparquivo nos locais adequados.

3) Você também pode querer coletar o nome de seus usuários e / ou outras informações. Você precisa adicionar uma matriz ao store-address.phparquivo usando as variáveis ​​de mesclagem correspondentes.

Aqui está a store-address.phpaparência do meu arquivo, onde também encontro o nome, o sobrenome e o tipo de email:

<?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) Crie seu formulário HTML / CSS / jQuery. Não é necessário estar em uma página PHP.

Aqui está algo parecido com o que meu index.htmlarquivo se parece:

<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>

Peças necessárias ...

  • index.html construído como acima ou semelhante. Com o jQuery, a aparência e as opções são infinitas.

  • arquivo store-address.php baixado como parte dos exemplos de PHP no site Mailchimp e modificado com sua API KEY e LIST ID . Você precisa adicionar seus outros campos opcionais à matriz.

  • Arquivo MCAPI.class.php baixado do site Mailchimp (versão 1.3 para PHP 5 ou versão 1.2 para PHP 4). Coloque-o no mesmo diretório do seu store-address.php ou você deve atualizar o caminho da URL em store-address.php para que ele possa encontrá-lo.

Sparky
fonte
2
Se você quiser apenas adicionar um formulário de inscrição ao seu site e enviá-lo via AJAX, a resposta de @ gbinflames funciona. Apenas tentei eu mesmo.
Patrick Canfield
1
Não, não há nenhuma obrigação .
Nowaker
2
Merda, devo dizer - eu implementei a resposta do @ skube há um tempo atrás em um site e depois adicionei https em todo o site. Acabei de descobrir agora que não está funcionando com a chamada http AJAX do mailchimp. É altamente recomendável seguir esse método imediatamente, se o site precisar ou considerar usar SSL.
Squarecandy
12

Para quem procura uma solução em uma pilha moderna:

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

// formData being an object with your form data like:
// { EMAIL: '[email protected]' }

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
fonte
6

Com base na resposta da gbinflames, é isso que funcionou para mim:

Gere um formulário de inscrição simples na lista de chimpanzés, copie o URL da ação e o método (postagem) para seu formulário personalizado. Renomeie também os nomes dos campos de formulário para todas as letras maiúsculas (name = 'EMAIL', como no código original do emailchimp, EMAIL, FNAME, LNAME, ...) e use o seguinte:

      $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...
          }
      }
Reza Hashemi
fonte
5

Nesta data (fevereiro de 2017), parece que o mailchimp integrou algo semelhante ao que o gbinflames sugere em seu próprio formulário gerado por javascript.

Você não precisa de mais nenhuma intervenção agora, pois o mailchimp converterá o formulário em um ajax enviado quando o javascript estiver ativado.

Tudo o que você precisa fazer agora é colar o formulário gerado no menu incorporar na sua página html e NÃO modificar ou adicionar qualquer outro código.

Isso simplesmente funciona. Obrigado MailChimp!

Doody P
fonte
4
Ele vai realmente ajuda se você pode adicionar algum artigo mensagens link / blog para fazer o mesmo
GonePhishing
Eu adicionei o código de incorporação do Mailchimp na minha página html, mas o Ajax não funciona automaticamente como sugerido acima. Sou redirecionado para outra página. Como posso fazer isso funcionar sem um redirecionamento?
Petra
1
No administrador do MailChimp, acesse sua lista -> Formulários de inscrição -> Formulários incorporados -> Clássico. Você verá que há algumas JS incluídas no snippet de código. Isso permitirá a validação do formulário e o envio do AJAX.
MarcGuay
1
usando o código mailchimp - como faço para conectar uma ação personalizada ao sucesso do ajax? [como esconder a forma]
Adeerlike
1
@ Massiorama Optei por remover o script mc-validate, pois também continha um jquery antigo e era muito grande e vulnerável. então apenas ter validação html e enviar com ajax como em stackoverflow.com/a/15120409/744690
Adeerlike
4

Use o plugin jquery.ajaxchimp para conseguir isso. É fácil demais!

<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
fonte