Integrazione del modulo di iscrizione AJAX Mailchimp


122

Esiste un modo per integrare mailchimp simple (un ingresso e-mail) con AJAX, quindi non c'è aggiornamento della pagina e nessun reindirizzamento alla pagina mailchimp predefinita.

Questa soluzione non funziona jQuery Ajax POST non funziona con MailChimp

Grazie


dopo aver inviato il modulo reindirizza alla pagina di "conferma" di mailchimp.
— alexndm

3
la tua soluzione ha un enorme buco di sicurezza, la chiave API dovrebbe essere trattata come privata poiché fornisce pieno accesso al tuo account MailChimp. #justsaying

1
Quella soluzione espone la tua API mailchimp che non è una buona idea
— Ruairi Browne

3
L'opzione di incorporamento HTML predefinita sul sito Web di mailchimp non espone anche la tua chiave API? Non può essere migliore o peggiore di quella soluzione.
— Bob Bobbio

Utilizzare questo plugin jQuery: github.com/scdoshi/jquery-ajaxchimp
— sid

Risposte:


241

Non hai bisogno di una chiave API, tutto ciò che devi fare è inserire il modulo standard generato da mailchimp nel tuo codice (personalizza l'aspetto secondo necessità) e nei moduli l'attributo "azione" cambia post?u=in post-json?u=e poi alla fine dell'azione dei moduli aggiungi &c=?per aggirare qualsiasi problema interdominio. Inoltre è importante notare che quando si invia il modulo è necessario utilizzare GET anziché POST.

Il tag del modulo sarà simile a questo per impostazione predefinita:

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

cambiarlo per assomigliare a questo

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

Mail Chimp restituirà un oggetto json contenente 2 valori: 'result' - questo indicherà se la richiesta ha avuto successo o meno (ho sempre visto solo 2 valori, "error" e "success") e 'msg' - un messaggio descrivere il risultato.

Invio i miei moduli con questo bit di 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...
            }
        }
    });
}

8
Ho creato un plug-in jquery che utilizza questo metodo: github.com/scdoshi/jquery-ajaxchimp
— sid

22
Puoi anche usare JSONP. Usa il post-jsoncome descritto. Rimuovi il &c=se lo hai nell'URL dell'azione del modulo. Usa dataType: 'jsonp'e jsonp: 'c'per la tua chiamata jQuery ajax.
— czerasz

5
Tieni presente che i campi del modulo email devono avere name = "EMAIL" affinché mailchimp possa essere elaborato
— Ian Warner

5
Solo per tua informazione, nel caso qualcuno abbia problemi, il nome del parametro email dovrebbe essere EMAIL(tutto maiuscolo). Altrimenti riceverai un errore che indica che l'indirizzo e-mail è vuoto.
— Nick Tiberi

5
MailChimp ha disabilitato questo metodo di accesso all'API da quando è stata scritta questa risposta? Non ho visto alcuna indicazione nella documentazione che un GET / POST senza la chiave API possa iscrivere un utente a un elenco.
— Greg Bell

34

Sulla base della risposta di gbinflames, ho mantenuto il POST e l'URL, in modo che il modulo continuasse a funzionare per quelli con JS disattivato.

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

Quindi, utilizzando .submit () di jQuery, è stato modificato il tipo e l'URL per gestire le risposte 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;
});

18

Si consiglia di utilizzare il codice lato server, al fine di proteggere l'account MailChimp.

Quella che segue è una versione aggiornata di questa risposta che utilizza PHP :

I file PHP sono "protetti" sul server dove l'utente non li vede mai, ma jQuery può ancora accedervi e utilizzarli.

1) Scarica l'esempio di jQuery PHP 5 qui ...

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

Se hai solo PHP 4, scarica semplicemente la versione 1.2 di MCAPI e sostituisci il MCAPI.class.phpfile corrispondente sopra.

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

2) Seguire le indicazioni nel file Leggimi aggiungendo la chiave API e l'ID elenco al store-address.phpfile nelle posizioni corrette.

3) Potresti anche voler raccogliere il nome dei tuoi utenti e / o altre informazioni. È necessario aggiungere un array al store-address.phpfile utilizzando le variabili di unione corrispondenti.

Ecco store-address.phpcome appare il mio file dove raccolgo anche il nome, il cognome e il tipo di 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) Crea il tuo modulo HTML / CSS / jQuery. Non è necessario essere su una pagina PHP.

Ecco qualcosa di simile a index.htmlcome appare il mio file:

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

Pezzi necessari ...

  • index.html costruito come sopra o simile. Con jQuery, l'aspetto e le opzioni sono infinite.

  • file store-address.php scaricato come parte degli esempi PHP sul sito Mailchimp e modificato con la tua API KEY e LIST ID . È necessario aggiungere gli altri campi facoltativi all'array.

  • File MCAPI.class.php scaricato dal sito Mailchimp (versione 1.3 per PHP 5 o versione 1.2 per PHP 4). Inseriscilo nella stessa directory del tuo store-address.php o devi aggiornare il percorso dell'URL all'interno di store-address.php in modo che possa trovarlo.


2
Se vuoi solo aggiungere un modulo di iscrizione al tuo sito e inviarlo tramite AJAX, la risposta di @ gbinflames funziona. Ho appena provato io stesso.
— Patrick Canfield

1
No, non è necessario .
— Nowaker,

2
Merda, devo dire: ho implementato la risposta di @ skube qualche tempo fa su un sito e poi ho aggiunto https a livello di sito. Ho appena scoperto che non funziona con la chiamata http AJAX di mailchimp. Consiglio vivamente di utilizzare questo metodo subito se il tuo sito potrebbe aver bisogno o prendere in considerazione l'utilizzo di SSL.
— squarecandy

12

Per chi cerca una soluzione su uno stack moderno:

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);
});

6

Sulla base della risposta di gbinflames, questo è ciò che ha funzionato per me:

Genera un semplice modulo di iscrizione alla lista mailchimp, copia l'URL dell'azione e il metodo (post) nel modulo personalizzato. Rinomina anche i nomi dei campi del modulo in maiuscolo (nome = 'EMAIL' come nel codice mailchimp originale, EMAIL, FNAME, LNAME, ...), quindi usa questo:

      $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

Per quanto riguarda questa data (febbraio 2017), sembra che mailchimp abbia integrato qualcosa di simile a ciò che gbinflames suggerisce nel proprio modulo generato da javascript.

Non è necessario alcun ulteriore intervento ora poiché mailchimp convertirà il modulo in uno inviato ajax quando javascript è abilitato.

Tutto quello che devi fare ora è incollare il modulo generato dal menu di incorporamento nella tua pagina html e NON modificare o aggiungere alcun altro codice.

Funziona semplicemente. Grazie MailChimp!


4
Sarà davvero d'aiuto se puoi aggiungere alcuni link ad articoli / post di blog per fare lo stesso
— gophishing

Ho aggiunto il codice di incorporamento di Mailchimp nella mia pagina html ma Ajax non funziona automaticamente come suggerito sopra. Vengo reindirizzato a un'altra pagina. Come posso farlo funzionare senza un reindirizzamento?
— Petra

1
Nell'amministratore di MailChimp vai alla tua lista -> Moduli di iscrizione -> Moduli incorporati -> Classico. Vedrai che c'è del JS incluso nello snippet di codice. Ciò consentirà la convalida del modulo e l'invio AJAX.
— MarcGuay

1
utilizzando il codice mailchimp - come collego un'azione personalizzata al successo di ajax? [come nascondere il modulo]
— Adeerlike il

1
@Masiorama Ho deciso di rimuovere lo script mc-validate, poiché conteneva anche un vecchio jquery ed era troppo grande e vulnerabile. quindi basta avere la convalida html e la presentazione con AJAX come in stackoverflow.com/a/15120409/744690
— Adeerlike

4

Usa il plugin jquery.ajaxchimp per raggiungere questo obiettivo. È semplicissimo!

<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);
    }
  });
})

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.