【问题标题】:merge_fields error 400 - Mailchimp api v3合并字段错误 400 - Mailchimp api v3
【发布时间】:2018-07-28 10:31:53
【问题描述】:

我有一个包含这些字段的列表:emailFNAMELNAME。当我尝试通过 Ajax 发送 merge_fields 时,Ajax 返回错误:

string(400) "{"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Invalid Resource","status":400,"detail":"提交的资源无法验证。有关特定于字段的详细信息,请参阅 'errors' 数组。","instance":"f311cff1-ec28-4003-8dde-007bc0001688","errors":[{"field":"merge_fields.FNAME","message" :"数据与 anyOf 中描述的任何模式都不匹配。"}]}"

JS:

app.subscribe = function() {
$(document).on('submit', '.form-course', function(e) {
    var fullName = $('#name').val(),
        arrName = fullName.split(' '),
        fname = arrName.slice(0, 1).join(' '),
        lname = arrName.slice(1, arrName.length).join(' ');

    var data = {
        'email' : $('#email').val(),
        "merge_fields": {
            "FNAME": fname,
            "LNAME": lname
        }
    };

    console.log(data);

    $.ajax({
        url: url+'/wp-admin/admin-ajax.php?action=ux_subscribe',
        method: 'POST',
        data: data,
        success: function(response) {
            gtag('send', 'event', 'Modal', 'subscribed', 'Subscription');
            fbq('track', 'CompleteRegistration');

            $('#modal').fadeOut(function() {
                // window.location.replace("./sucesso");
            });
        }, error: function(data) {
            alert('ERRO! Tente novamente mais tarde!');
        }
    });

    return false;
    });
};

PHP:

function ux_subscribe() {
    //GET via front-end form
    $apiKey = 'XXX'; //Generate an API key via: Account > Extras > Api Keys
    $listId = 'XXX'; //Find this via: Lists > List > Settings > List name and defaults
    $email = $_POST['email']; //GET via front-end form
    $fname = $_POST['fname']; //GET via front-end form
    $lname = $_POST['lname']; //GET via front-end form
    $auth = base64_encode( 'user:' . $apiKey );

    echo $fname;

    $json = json_encode([
        'email_address' => $email,
        'status'        => "subscribed", // Choices include: "subscribed", "unsubscribed", "cleaned", "pending"
        'merge_fields'  => array(
            'FNAME' => $fname,
            'LNAME' => $lname
        )
    ]);

    $memberId = md5(strtolower( $email ));
    $dataCenter = substr($apiKey,strpos($apiKey,'-')+1);
    $url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listId . '/members/';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Basic ' . $auth]);
    curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

    $result = curl_exec($ch);

     var_dump($result);

    wp_die();
}

如果我删除变量并放入一个字符串,它会起作用:

$json = json_encode([
        'email_address' => $email,
        'status'        => "subscribed", // Choices include: "subscribed", "unsubscribed", "cleaned", "pending"
        'merge_fields'  => array(
            'FNAME' => 'hello',
            'LNAME' => 'bye'
        )
    ]);

有人知道为什么???

【问题讨论】:

    标签: ajax wordpress mailchimp-api-v3.0


    【解决方案1】:

    您不能向 API 发送“空”值。

    例如,这将起作用:

    $fname = "joe";
    $lname = "smith"
    'merge_fields'  => array(
        'FNAME' => $fname,
        'LNAME' => $lname
    )
    

    但这会失败,注意 lname 是如何没有定义的。

    $fname = "joe";
    'merge_fields'  => array(
        'FNAME' => $fname,
        'LNAME' => $lname
    )
    

    因此,您需要一些简单的速记来提供“空”值。

    $fname = empty($fname) ? " " : $fname;
    $lname = empty($lname ) ? " " : $lname ;
    'merge_fields'  => array(
        'FNAME' => $fname,
        'LNAME' => $lname
    )
    

    我有一个包含 20 个段的大数组,并且一遍又一遍地得到相同的错误,一旦我投入了一些适当的 empty() 检查一切都很好......

    【讨论】:

      【解决方案2】:

      这是旧的,但想指出您的 javascript ajax 调用发送此数据:

      var data = {
          'email' : $('#email').val(),
          "merge_fields": {
              "FNAME": fname,
              "LNAME": lname
          }
      };
      

      ...但是您的 PHP 脚本正在尝试在以下位置查找 post 变量:

      $fname = $_POST['fname'];
      $lname = $_POST['lname'];
      

      只需将您的 ajax 数据更新为:

      var data = {
        'email' : $('#email').val(),
        'fname': fname,
        'lname' : lname
      };
      

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 2018-10-25
        • 2016-10-12
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 2020-05-15
        相关资源
        最近更新 更多