帝国CMS评论使用验证码 Cloudflare Turnstile

By | 2025年11月7日

一、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 =====