HTML側は以下となる。
.cf-turnstileは固定されたフォーマットなので、変更不可。

<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="サイトキー" data-callback="javascriptCallback" data-language="ja"></div>
<script> window.javascriptCallback = () => { /* チェック前のコールバック */ }; </script>

PHP側の実装は以下のようになる。

$data = [];
$data[ 'secret' ] = 'シークレットキー';
$data[ 'response' ] = $_POST[ 'cf-turnstile-response' ];
$data = http_build_query( $data, '', '&' );
$curl = curl_init();
curl_setopt_array( $curl, [
  CURLOPT_URL => 'https://challenges.cloudflare.com/turnstile/v0/siteverify',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => $data
] );
$res = curl_exec( $curl );
$err = curl_error( $curl );
curl_close( $curl );
if ( $err ){
  // エラー処理
}