从没有表单 CakePHP 的控制器订阅 Mailchimp

Subscribe Mailchimp from controller without form CakePHP

我正在为 Android 应用程序创建网络服务。
Android 应用程序有一个包含 3 个字段的 "Newsletter subscription" 选项:
- 电子邮件
- 姓氏
- phone_number

应用程序将这些数据以 json 格式发送到我的网络服务上的 NewsletterControlleur.php

{
    "Newsletter":{
        "user":{
            "first_name":"Hugo",
            "surname":"Dumoulin",
            "phone":"0606060606",
            "email":"hugo@gmail.fr"
        }
     }
}

我现在需要将此人添加到我的 Mailchimp 订阅者列表中。
我怎样才能从控制器使用我的 json 数据并且没有任何形式来做到这一点?

我知道我必须 post 像这样 url 这些数据(mailchimp 给我的):

http://******.us1.list-manage.com/subscribe/post?u=************&id=********

有人知道我如何做到这一点吗?
提前致谢。

list-manage URL 旨在让使用浏览器的用户访问,有几种不同的事情可能会阻碍您的进程。具体来说,如果 MailChimp 认为订阅来自机器人,它有时会显示验证码。

先决条件

更好的方法是使用 MailChimp 的 API。你需要四样东西:

  1. 您的数据中心 - 这类似于 us7,当您登录到 MailChimp 时,它位于 URL 的开头。我将在下面使用 us7,但您应该替换为您自己的。
  2. 您的 API 密钥 - 您可以在帐户设置的 'extras' 部分或 click here.[=59= 中找到它]
  3. 您的列表 ID - 您可以在设置中找到(从 'settings' 菜单中选择 'name and defaults' link)。它看起来像这样:1295ff8fdb
  4. 相关合并标签 -- 您只需要知道名字、姓氏和 phone 的合并标签是什么。我将假设它们是下面的 FNAMELNAMEPHONE,但您需要替换为您自己的以使其正常工作。

一旦你有了这些东西,你就可以使用任何 HTTP 客户端(比如 Cake's)进行订阅。

身份验证

MailChimp API 的

v3 使用 HTTP Basic Authentication。这是一个 header-based 身份验证方案,绝大多数 HTTP 库都支持这种开箱即用的方式。如果您必须手动执行此操作,则传递一个名为 Authorization 的 header 并且 header 的内容是单词 "Basic" 后跟 space 和然后是您的用户名和密码,以冒号分隔,Base64 编码。对于 MailChimp,用户名无关紧要,您使用 API 密钥作为密码。

幸运的是,Cake 的客户端提供开箱即用的支持。要使用它,只需将 auth 键传递到请求的选项参数中。该值应如下所示:array('type' => 'basic', 'username' => 'anything', 'password' => $MAILCHIMP_API_KEY)。 (注意,MailChimp 不使用用户名,您可以传递任何您想要的字符串。

有效负载

使用我上面的示例信息,我将使用如下所示的 JSON 有效负载对 https://us7.api.mailchimp.com/3.0/lists/1295ff8fdb/members/ 进行 POST 调用:

{
    "email_address": "hugo@leggett.fr",
    "status": "subscribed",
    "merge_fields": {
        "FNAME": "Hugo",
        "LNAME": "Dumoulin",
        "PHONE": "0606060606"
    }
}

样品申请

因此,如果您使用上面 linked 的 HTTP 客户端,代码可能如下所示:

<?php
use Cake\Network\Http\Client;

$http = new Client();

$subscriberData = array(
    'email_address' => 'hugo@leggett.fr',
    'status' => 'subscribed',
    'merge_fields' => array(
        'FNAME' => 'Hugo',
        'LNAME' => 'Dumoulin',
        'PHONE' => '0606060606'
    )
);

$response = $http->post(
  'https://us7.api.mailchimp.com/3.0/lists/1295ff8fdb/members/',
  json_encode($subscriberData),
  array(
    'type' => 'json'
    'auth' => array(
      'type' => 'basic', 
      'username' => 'anything', 
      'password' => $MAILCHIMP_API_KEY
    )
  )
);

现在,如果用户已经订阅,MailChimp 将 return 一个 4xx 错误并且此代码不考虑任何其他错误情况,因此一定要将此用作 jumping-off 点而不是一个完整的解决方案,但它应该让你指向正确的方向。