一、Cloudflare Turnstile官网注册申请
二、帝国CMS前端表单调用:
<script type="text/javascript">
$(document).ready(function(){
var turnstileToken = ""; // Stores Turnstile token
// Turnstile success callback
window.onTurnstileSuccess = function(token) {
console.log("✅ Turnstile passed:", token);
turnstileToken = token; // Save token
};
// Turnstile expired callback
window.onTurnstileExpired = function() {
console.log("⚠️ Turnstile expired, please refresh.");
turnstileToken = ""; // Clear token
};
// Form submit
$("#saypl").on("submit", function(event){
event.preventDefault(); // Prevent default submission
var message = $("#saytext").val().trim();
if (message === "") {
alert("Comments cannot be empty.");
$("#saytext").focus();
return false;
}
// Check Turnstile
if (!turnstileToken) {
alert("Please complete the CAPTCHA first.");
return false;
}
var formData = $(this).serialize() + "&cf_turnstile_response=" + encodeURIComponent(turnstileToken);
$.ajax({
type: "POST",
url: $(this).attr("action"), // /e/pl/doaction.php
data: formData,
dataType: "html",
beforeSend: function() {
$("#button").val("Submitting...").prop("disabled", true);
},
success: function(response) {
if (response.indexOf("Verification code expired") !== -1) {
alert("Verification failed or expired. Please try again.");
} else if (response.indexOf("Please enter content") !== -1) {
alert("Please enter your comment before submitting.");
} else if (response.indexOf("success") !== -1 || response.indexOf("Success") !== -1 || response.indexOf("successful") !== -1) {
alert("Your comment has been submitted successfully. It will appear once approved.");
$("#saytext").val(""); // Clear textarea
// Reset Turnstile
if (typeof turnstile !== "undefined") {
turnstile.reset();
}
turnstileToken = ""; // Clear token
} else {
alert("Submission completed. Please refresh the page to see your comment.");
}
},
error: function() {
alert("Network error. Please try again later.");
},
complete: function() {
$("#button").val("Submit").prop("disabled", false);
}
});
});
});
</script>
<div class="cf-turnstile" data-sitekey="0x4AAAAAAB6GKpaiLg7B21NK" data-callback="onTurnstileSuccess" data-expired-callback="onTurnstileExpired"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
三、后端验证,/e/pl/doaction.php在这个文件开头部分加入以下代码
// ===== Cloudflare Turnstile Verification =====
$turnstile_secret = "xxx"; // ← 替换为你的 Secret Key
$turnstile_response = $_POST['cf-turnstile-response'] ?? '';
if (empty($turnstile_response)) {
printerror("Turnstile verification missing.", "history.go(-1)", 1);
}
$verify_url = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
$post_data = http_build_query([
'secret' => $turnstile_secret,
'response' => $turnstile_response,
'remoteip' => $_SERVER['REMOTE_ADDR'] ?? ''
]);
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $post_data,
'timeout' => 5
]
];
$context = stream_context_create($options);
$verify_result = @file_get_contents($verify_url, false, $context);
$verify_json = json_decode($verify_result, true);
// 检查验证结果
if (!$verify_json || empty($verify_json['success'])) {
printerror("Turnstile verification failed. Please try again.", "history.go(-1)", 1);
}
// ===== End of Turnstile verification =====