3 votes

Impossible d'utiliser l'upsert pour un membre existant

J'essaie d'abonner des utilisateurs à Mailchimp avec Gibbon 2.2.4 avec un générique subscribe que j'ai utilisée, et peu de temps après, je souhaite ajouter quelques champs supplémentaires pour suivre les résultats d'un quiz auquel ils ont répondu.

Je souhaite stocker ces données sur Mailchimp car j'aimerais gérer les courriels que j'envoie directement à partir du tableau de bord de Mailchimp.

Le service que j'ai créé pour gérer mes abonnements :

class MailchimpService

  def subscribe(list_id,email,first_name)
    GIBBON.lists(list_id).members.create({
      body: {
        email_address: email,
        status: 'subscribed',
        merge_fields: {
          FNAME: first_name,
        },
        double_optin: false,
        update_existing: true
      }
    })
  end

  def subscribe_to_quiz(first_name, email, user_id, quiz_id)
    list_id = ENV['QUIZ_MAILCHIMP_LIST_ID']
    if subscribe(list_id,email,first_name)
      attempt = QuizAttempt.where("user_id = ? AND quiz_id = ?", user_id, quiz_id).last
      correct = attempt.correct_answer_count
      total = attempt.questions_answered
      successful = attempt.successful?
      send_quiz_results(list_id, email, correct, total, successful)
    end
  end

  def send_quiz_results(list_id, email, correct, total, successful)
    GIBBON.lists(list_id).members(email).upsert(
      body: {
        email_address: email,
        status: 'subscribed',
        merge_fields: {
          correct_answers: correct,
          total_answers: total,
          successful: successful
        },
        update_existing: true
    })
  end
end

En subscribe_to_quiz Je suis en train d'abonner l'utilisateur à ma liste de quiz dans Mailchimp. Les valeurs des champs que je mets à jour ici ne sont pas pertinentes, mais je pense qu'elles sont assez explicites. Lorsque j'essaie d'exécuter ma déclaration upsert dans send_quiz_results J'obtiens l'erreur suivante :

the server responded with status 400 
@title="Member Exists", 
@detail="foo@bar.baz is already a list member. Use PUT to insert or update list members.", 
@body={"type"=>"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/", "title"=>"Member Exists", "status"=>400, "detail"=>"foo@bar.baz is already a list member. Use PUT to insert or update list members.", "instance"=>""}, 
@raw_body="{\"type\":\"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/\",\"title\":\"Member Exists\",\"status\":400,\"detail\":\"foo@bar.baz is already a list member. Use PUT to insert or update list members.\",\"instance\":\"\"}", 
@status_code=400

Je n'ai aucune idée de la raison pour laquelle il ne me permet pas de le faire... Il semble qu'il se réfère à un create mais la source extraite de l'erreur fait référence à mon upsert déclaration.

Je sais que j'utilise le verbe PUT correspondant pour Gibbon, puisque ce qui suit est tiré directement de la documentation :

Bien entendu, le corps n'est pris en charge que pour les appels de création, de mise à jour et d'insertion. Ceux-ci correspondent respectivement aux verbes HTTP POST, PATCH et PUT.

Je n'ai aucune idée de la raison pour laquelle cela ne fonctionne pas... J'ai essayé d'enlever les autres champs et d'ajouter simplement ceux que je mets à jour. J'ai également essayé de l'exécuter directement depuis le terminal pour m'assurer que rien ne se chevauche.

6voto

infused Points 13869

En Documentation sur l'API de MailChimp montrent que lors de la mise à jour d'un membre, vous devez fournir son subscriber_hash, qui est le hash MD5 de la version minuscule de l'adresse e-mail du membre.

Utilisation Digest::MD5.hexdigest pour hacher l'adresse électronique avec MD5 :

GIBBON.lists(list_id).members(Digest::MD5.hexdigest(email.downcase)).upsert

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X