Mailchimp API 使用 AJAX 调用
Mailchimp API call using AJAX
我正在使用
error:function(exception){alert('Exception:'+ JSON.stringify(exception));}
在出现 AJAX 错误时显示异常,这是我得到的响应:
Exception:{"readyState":4,"responseText":"","status":200,"statusText":"OK"}
这看起来像是对我的成功响应,但它是在 error
上调用的函数,这意味着出现问题。
这是页面:http://cuttingedgeconversions.com/free-month.html
我有一个成功的 API 调用,使用表单操作为 mail chimp 订阅一个新的电子邮件地址。但是我不想在提交表单后重定向到另一个页面,所以我取出了 'form action' 属性 并尝试将此 API 调用添加到 script.js 使用 ajax。
这是 HTML:
<form class="email_form_freemonth" method="post">
<h3>Get your first month free</h3>
<div class="form-group customised-formgroup"> <span class="icon-user"></span>
<input type="text" name="full_name" class="form-control" placeholder="Name">
</div>
<div class="form-group customised-formgroup"> <span class="icon-envelope"></span>
<input type="email" name="email" class="form-control" placeholder="Email">
</div>
<!--<div class="form-group customised-formgroup"> <span class="icon-telephone"></span>
<input type="text" name="phone" class="form-control" placeholder="Phone (optional)">
</div>-->
<div class="form-group customised-formgroup"> <span class="icon-laptop"></span>
<input type="text" name="website" class="form-control" placeholder="Website (optional)">
</div>
<!--<div class="form-group customised-formgroup"> <span class="icon-bubble"></span>
<textarea name="message" class="form-control" placeholder="Message"></textarea>
</div>-->
<div>
<br>
<button style="margin: 0 auto" name="submit" type="submit" class="btn btn-fill full-width">GET FREE MONTH<span class="icon-chevron-right"></span></button>
</div>
</form>
这里是 freemonth_action.php(在 script.js 中被调用,如下所示):
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == "POST"){
$name = trim($_POST['full_name']);
$email = trim($_POST['email']);
if(!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL) === false){
// MailChimp API credentials
$apiKey = '*****';
$listID = '0cf013d1d9';
// MailChimp API URL
$memberID = md5(strtolower($email));
$dataCenter = substr($apiKey,strpos($apiKey,'-')+1);
$url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listID . '/members/' . $memberID;
// member information
$json = json_encode([
'email_address' => $email,
'status' => 'subscribed',
'merge_fields' => [
'NAME' => $name,
]
]);
// send a HTTP POST request with curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
//echo json_decode($result);
// store the status message based on response code
if ($httpCode == 200) {
$_SESSION['msg'] = '<p style="color: #34A853">You have successfully subscribed to CodexWorld.</p>';
} else {
switch ($httpCode) {
case 214:
$msg = 'You are already subscribed.';
break;
default:
$msg = 'Some problem occurred, please try again.';
break;
}
$_SESSION['msg'] = '<p style="color: #EA4335">'.$msg.'</p>';
}
}else{
$_SESSION['msg'] = '<p style="color: #EA4335">Please enter valid email address.</p>';
}
}
我知道这些是正确的,因为当我使用 'form action = scripts/freemonth_action.php'
时它起作用了。但我不希望页面在提交时重定向,所以我在我的脚本中添加了一个 ajax 调用,该调用从 script.js 触发。我现在在 script.js 中有 2 个 ajax 调用,第一个正在工作,但第二个没有。奇怪的是 BOTH RETURN STATUS CODE 200.
script.js 非嵌套 Ajax 调用 - 现在正常工作:
$('.email_form_freemonth').on('submit', function (e) {
e.preventDefault();
var _self = $(this);
var __selector = _self.closest('input,textarea');
_self.closest('div').find('input,textarea').removeAttr('style');
_self.find('.msg').remove();
_self.closest('div').find('button[type="submit"]').attr('disabled', 'disabled');
var data = $(this).serialize();
$.ajax({
url: 'scripts/email_freeMonth.php',
type: "post",
dataType: 'json',
data: data,
success: function (data) {
_self.closest('div').find('button[type="submit"]').removeAttr('disabled');
if (data.code == false) {
_self.closest('div').find('[name="' + data.field + '"]').css('border-bottom', 'solid 2px red');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:red;padding:0;font-size:13px;font-weight:bold;position:absolute">*' + data.err + '</p></div>');
} else {
$('.msg').html('<p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p>');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p></div>');
_self.closest('div').find('input,textarea').val('');
}
}
});
$.ajax({
url: 'scripts/freemonth_action.php',
type: "post",
dataType: 'json',
data: data,
success: function (data) {
_self.closest('div').find('button[type="submit"]').removeAttr('disabled');
if (data.code == false) {
console.log("DATA.CODE == FALSE");
} else {
console.log("DATA.CODE == TRUE");
}
},
error:function(exception){alert('Exception:'+ JSON.stringify(exception));}
});
});
我觉得你需要在你第一次调用下添加ajax{}第二次调用{into}。
$('.email_form_freemonth').on('submit', function (e) {
e.preventDefault();
var _self = $(this);
var __selector = _self.closest('input,textarea');
_self.closest('div').find('input,textarea').removeAttr('style');
_self.find('.msg').remove();
_self.closest('div').find('button[type="submit"]').attr('disabled', 'disabled');
var data = $(this).serialize();
$.ajax({ //WORKS
url: 'scripts/email_freeMonth.php',
type: "post",
dataType: 'json',
data: data,
success: function (data) {
_self.closest('div').find('button[type="submit"]').removeAttr('disabled');
if (data.code == false) {
_self.closest('div').find('[name="' + data.field + '"]').css('border-bottom', 'solid 2px red');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:red;padding:0;font-size:13px;font-weight:bold;position:absolute">*' + data.err + '</p></div>');
} else {
$('.msg').html('<p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p>');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p></div>');
_self.closest('div').find('input,textarea').val('');
}
}
//because you are under an event submit "form" and you ajax post was after this one
$.ajax({
url: 'scripts/freemonth_action.php',
type: "post",
dataType: 'json',
success: function (data) {
alert(data);
}
});
});
当您通过 AJAX 请求传递序列化数据时,if(isset($_POST['submit']))
不会评估为 true,因为按钮不是通过请求发送的数据的一部分。您可以改用 if($_SERVER['REQUEST_METHOD'] == "POST")
来检查请求是否已提交。只需在您的 PHP 文件中更新它,它就会起作用!
我正在使用
error:function(exception){alert('Exception:'+ JSON.stringify(exception));}
在出现 AJAX 错误时显示异常,这是我得到的响应:
Exception:{"readyState":4,"responseText":"","status":200,"statusText":"OK"}
这看起来像是对我的成功响应,但它是在 error
上调用的函数,这意味着出现问题。
这是页面:http://cuttingedgeconversions.com/free-month.html
我有一个成功的 API 调用,使用表单操作为 mail chimp 订阅一个新的电子邮件地址。但是我不想在提交表单后重定向到另一个页面,所以我取出了 'form action' 属性 并尝试将此 API 调用添加到 script.js 使用 ajax。
这是 HTML:
<form class="email_form_freemonth" method="post">
<h3>Get your first month free</h3>
<div class="form-group customised-formgroup"> <span class="icon-user"></span>
<input type="text" name="full_name" class="form-control" placeholder="Name">
</div>
<div class="form-group customised-formgroup"> <span class="icon-envelope"></span>
<input type="email" name="email" class="form-control" placeholder="Email">
</div>
<!--<div class="form-group customised-formgroup"> <span class="icon-telephone"></span>
<input type="text" name="phone" class="form-control" placeholder="Phone (optional)">
</div>-->
<div class="form-group customised-formgroup"> <span class="icon-laptop"></span>
<input type="text" name="website" class="form-control" placeholder="Website (optional)">
</div>
<!--<div class="form-group customised-formgroup"> <span class="icon-bubble"></span>
<textarea name="message" class="form-control" placeholder="Message"></textarea>
</div>-->
<div>
<br>
<button style="margin: 0 auto" name="submit" type="submit" class="btn btn-fill full-width">GET FREE MONTH<span class="icon-chevron-right"></span></button>
</div>
</form>
这里是 freemonth_action.php(在 script.js 中被调用,如下所示):
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] == "POST"){
$name = trim($_POST['full_name']);
$email = trim($_POST['email']);
if(!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL) === false){
// MailChimp API credentials
$apiKey = '*****';
$listID = '0cf013d1d9';
// MailChimp API URL
$memberID = md5(strtolower($email));
$dataCenter = substr($apiKey,strpos($apiKey,'-')+1);
$url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/lists/' . $listID . '/members/' . $memberID;
// member information
$json = json_encode([
'email_address' => $email,
'status' => 'subscribed',
'merge_fields' => [
'NAME' => $name,
]
]);
// send a HTTP POST request with curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $apiKey);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
//echo json_decode($result);
// store the status message based on response code
if ($httpCode == 200) {
$_SESSION['msg'] = '<p style="color: #34A853">You have successfully subscribed to CodexWorld.</p>';
} else {
switch ($httpCode) {
case 214:
$msg = 'You are already subscribed.';
break;
default:
$msg = 'Some problem occurred, please try again.';
break;
}
$_SESSION['msg'] = '<p style="color: #EA4335">'.$msg.'</p>';
}
}else{
$_SESSION['msg'] = '<p style="color: #EA4335">Please enter valid email address.</p>';
}
}
我知道这些是正确的,因为当我使用 'form action = scripts/freemonth_action.php'
时它起作用了。但我不希望页面在提交时重定向,所以我在我的脚本中添加了一个 ajax 调用,该调用从 script.js 触发。我现在在 script.js 中有 2 个 ajax 调用,第一个正在工作,但第二个没有。奇怪的是 BOTH RETURN STATUS CODE 200.
script.js 非嵌套 Ajax 调用 - 现在正常工作:
$('.email_form_freemonth').on('submit', function (e) {
e.preventDefault();
var _self = $(this);
var __selector = _self.closest('input,textarea');
_self.closest('div').find('input,textarea').removeAttr('style');
_self.find('.msg').remove();
_self.closest('div').find('button[type="submit"]').attr('disabled', 'disabled');
var data = $(this).serialize();
$.ajax({
url: 'scripts/email_freeMonth.php',
type: "post",
dataType: 'json',
data: data,
success: function (data) {
_self.closest('div').find('button[type="submit"]').removeAttr('disabled');
if (data.code == false) {
_self.closest('div').find('[name="' + data.field + '"]').css('border-bottom', 'solid 2px red');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:red;padding:0;font-size:13px;font-weight:bold;position:absolute">*' + data.err + '</p></div>');
} else {
$('.msg').html('<p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p>');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p></div>');
_self.closest('div').find('input,textarea').val('');
}
}
});
$.ajax({
url: 'scripts/freemonth_action.php',
type: "post",
dataType: 'json',
data: data,
success: function (data) {
_self.closest('div').find('button[type="submit"]').removeAttr('disabled');
if (data.code == false) {
console.log("DATA.CODE == FALSE");
} else {
console.log("DATA.CODE == TRUE");
}
},
error:function(exception){alert('Exception:'+ JSON.stringify(exception));}
});
});
我觉得你需要在你第一次调用下添加ajax{}第二次调用{into}。
$('.email_form_freemonth').on('submit', function (e) {
e.preventDefault();
var _self = $(this);
var __selector = _self.closest('input,textarea');
_self.closest('div').find('input,textarea').removeAttr('style');
_self.find('.msg').remove();
_self.closest('div').find('button[type="submit"]').attr('disabled', 'disabled');
var data = $(this).serialize();
$.ajax({ //WORKS
url: 'scripts/email_freeMonth.php',
type: "post",
dataType: 'json',
data: data,
success: function (data) {
_self.closest('div').find('button[type="submit"]').removeAttr('disabled');
if (data.code == false) {
_self.closest('div').find('[name="' + data.field + '"]').css('border-bottom', 'solid 2px red');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:red;padding:0;font-size:13px;font-weight:bold;position:absolute">*' + data.err + '</p></div>');
} else {
$('.msg').html('<p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p>');
_self.find('.customised-formgroup').last().after('<div class="msg"><p style="color:green;padding:0;font-size:13px;font-weight:bold;position:absolute">' + data.success + '</p></div>');
_self.closest('div').find('input,textarea').val('');
}
}
//because you are under an event submit "form" and you ajax post was after this one
$.ajax({
url: 'scripts/freemonth_action.php',
type: "post",
dataType: 'json',
success: function (data) {
alert(data);
}
});
});
当您通过 AJAX 请求传递序列化数据时,if(isset($_POST['submit']))
不会评估为 true,因为按钮不是通过请求发送的数据的一部分。您可以改用 if($_SERVER['REQUEST_METHOD'] == "POST")
来检查请求是否已提交。只需在您的 PHP 文件中更新它,它就会起作用!