Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Помогите поставить Recaptcha в форму обратной связи

Страниц (1): [1]
 

1. dofamin - 18 Апреля, 2018 - 19:51:07 - перейти к сообщению
Здравствуйте,у меня есть форма обратной связи с отправкой в Telegram и мне нужно подключить Recaptcha с проверкой полей и правильности ввода
Вот PHP:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.  
  4. /***************************************************************************
  5.  *                              Настройки                                  *
  6.  ***************************************************************************/
  7.  
  8. const NOTIFICATIONS_EMAIL = "мыло";
  9. const TELEGRAM_TOKEN = "токен_телеги";
  10. const TELEGRAM_CHAT_ID = "айди_чата";
  11.  
  12.  
  13. /***************************************************************************
  14.  *                                Логика                                   *
  15.  ***************************************************************************/
  16.  
  17. // Получаем данные из формы
  18. $input = getInput();
  19.  
  20. // Если превышен суммарный максимальный размер всех полей формы (вместе с файлами), показываем страницу с ошибкой
  21. // и просим заполнить форму еще раз
  22. if (empty($input["text"]) && empty($input["files"]) && (int)$_SERVER['CONTENT_LENGTH'] > 512 * 1024) {
  23.     showPostExceededError();
  24. }
  25.  
  26. // Разбираем полученные файлы
  27. $files = getFiles($input);
  28.  
  29. // Если есть файлы, превышающие максимальный разрешенный размер - показываем страницу с ошибкой
  30. // и просим заполнить форму еще раз
  31. $bigFiles = getBigFiles($files);
  32. if (count($bigFiles) != 0) {
  33.     showBigFilesError($input, $bigFiles);
  34. }
  35.  
  36. // Если есть ошибки (серверные) при загрузке файлов, пишем об этом в логи
  37. $errorFiles = getErrorFiles($files);
  38. if (count($errorFiles) != 0) {
  39.     foreach ($errorFiles as $file) {
  40.         error_log("Fail to upload file {$file["name"]}. Error code: {$file["error"]}", 0);
  41.     }
  42. }
  43.  
  44. // Получаем список успешно загруженных файлов
  45. $goodFiles = getGoodFiles($files);
  46.  
  47. // Создаем новый ID для заявки. Это поможет идентифицировать апселлы
  48. $leadId = time();
  49.  
  50. // Если указан email для уведомлений - отправляем письмо
  51. if (defined("NOTIFICATIONS_EMAIL") && NOTIFICATIONS_EMAIL != "") {
  52.     $emailSent = sendEmail($input, $leadId, $errorFiles, $goodFiles);
  53. }
  54.  
  55. // Если указаны данные для Telegram бота - шлем лид в Telegram
  56. if (defined("TELEGRAM_TOKEN") && TELEGRAM_TOKEN != "" && defined("TELEGRAM_CHAT_ID") && TELEGRAM_CHAT_ID != "") {
  57.     $telegramSent = sendTelegram($input, $leadId, $errorFiles, $goodFiles);
  58. }
  59.  
  60. // Если заявка не отправилась ни на Email, ни в Telegram - показываем посетителю ошибку отправки формы
  61. if (!$emailSent && !$telegramSent) {
  62.     showFormError();
  63. }
  64.  
  65. // Если указан URL редиректа - делаем редирект
  66. if ($input["text"]["redirect"]) {
  67.     redirect($input, $leadId);
  68. }
  69.  
  70. // Если редирект не настроен - показываем стандартную страницу благодарности
  71. showDefaultThankyouPage($input);
  72.  
  73.  
  74. /***************************************************************************
  75.  *                               Функции                                   *
  76.  ***************************************************************************/
  77.  
  78. function httpRequest($url, $method = "GET", $headers = [], $data = NULL)
  79. {
  80.     $curl = curl_init();
  81.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  82.     curl_setopt($curl, CURLOPT_USERAGENT, "PHP API Client");
  83.     curl_setopt($curl, CURLOPT_URL, $url);
  84.     curl_setopt($curl, CURLOPT_HEADER, false);
  85.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  86.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  87.     curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
  88.     if ($method == "POST") {
  89.         $headers [] = 'Content-Type: multipart/form-data';
  90.         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  91.     }
  92.     curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  93.     $result = curl_exec($curl);
  94.     if ($result === false) {
  95.         throw new Exception("httpRequest failed: " . curl_error($curl));
  96.     }
  97.     $responseBody = json_decode($result, true);
  98.     $responseStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  99.     curl_close($curl);
  100.     if ($responseStatus != 200) {
  101.         throw new Exception("httpRequest failed: " . print_r($responseBody));
  102.     }
  103.     return $responseBody;
  104. }
  105.  
  106. function getFileMaxSize($input)
  107. {
  108.     $max_size = -1;
  109.     if ($max_size < 0) {
  110.         $post_max_size = getPostMaxSize();
  111.         if ($post_max_size > 0) {
  112.             $max_size = $post_max_size;
  113.         }
  114.         $upload_max = parseSize(ini_get('upload_max_filesize'));
  115.         if ($upload_max > 0 && $upload_max < $max_size) {
  116.             $max_size = $upload_max;
  117.         }
  118.         if ((int)$input["text"]["MAX_FILE_SIZE"] > 0 && (int)$input["text"]["MAX_FILE_SIZE"] < $max_size) {
  119.             $max_size = (int)$input["text"]["MAX_FILE_SIZE"];
  120.         }
  121.     }
  122.     return $max_size;
  123. }
  124.  
  125. function getPostMaxSize()
  126. {
  127.     $max_size = -1;
  128.     if ($max_size < 0) {
  129.         $post_max_size = parseSize(ini_get('post_max_size'));
  130.         if ($post_max_size > 0) {
  131.             $max_size = $post_max_size;
  132.         }
  133.     }
  134.     return $max_size;
  135. }
  136.  
  137. function parseSize($size)
  138. {
  139.     $unit = preg_replace('/[^bkmgtpezy]/i', '', $size);
  140.     $size = preg_replace('/[^0-9\.]/', '', $size);
  141.     if ($unit) {
  142.         return round($size * pow(1024, stripos('bkmgtpezy', $unit[0])));
  143.     } else {
  144.         return round($size);
  145.     }
  146. }
  147.  
  148. function render($html)
  149. {
  150.     echo "
  151.      <html lang='ru'>
  152.      <head>
  153.        <meta charset='UTF-8'>
  154.        <meta http-equiv='X-UA-Compatible' content='IE=edge'>
  155.        <meta name='viewport' content='width=device-width, initial-scale=1.0'>
  156.        <link rel='shortcut icon' href='https://freelandings.ru/assets/favicons/favicon.ico'>
  157.        <title>Спасибо за заказ!</title>
  158.        <style>
  159.          body{
  160.            margin: 0;
  161.            background: #43cea2;
  162.            background: -webkit-linear-gradient(to right, #185a9d, #43cea2);
  163.            background: linear-gradient(to right, #185a9d, #43cea2);
  164.            height: 100vh;
  165.            padding: 2rem;
  166.            color: white;
  167.            font-family: 'Open Sans', sans-serif;
  168.            text-align: center;
  169.            box-sizing: border-box;
  170.            text-shadow: 0 1px 2px rgba(0,0,0,.1);
  171.          }
  172.          .content {
  173.            position: absolute;
  174.            width: 80%;
  175.            top: 50%;
  176.            left: 50%;
  177.            transform: translate(-50%, -50%);
  178.            background-color: white;
  179.            color: rgba(0, 0, 0, .75);
  180.            -webkit-box-shadow: 0 0 8px 2px rgba(0,0,0,.2);
  181.            -moz-box-shadow: 0 0 8px 2px rgba(0,0,0,.2);
  182.            box-shadow: 0 0 8px 2px rgba(0,0,0,.2);
  183.            -webkit-border-radius: 4px;
  184.            -moz-border-radius: 4px;
  185.            border-radius: 4px;
  186.            padding: 1rem;
  187.            text-shadow: none;
  188.          }
  189.          @media screen and (min-width: 900px) {
  190.            .content {
  191.              max-width: 600px;
  192.              padding: 2rem;
  193.            }
  194.          }
  195.          .content ul {
  196.            margin: 2rem 0;
  197.            text-align: left;
  198.          }
  199.          .content button {
  200.            padding: .5rem 1rem;
  201.            -webkit-border-radius: 2px;
  202.            -moz-border-radius: 2px;
  203.            border-radius: 2px;
  204.            color: white;
  205.            background-color: #2BC0E4;
  206.            border: none;
  207.            -webkit-box-shadow: 0 0 8px 2px rgba(0,0,0,.2);
  208.            -moz-box-shadow: 0 0 8px 2px rgba(0,0,0,.2);
  209.            box-shadow: 0 0 8px 2px rgba(0,0,0,.2);
  210.            text-shadow: 0 1px 2px rgba(0,0,0,.1);
  211.          }
  212.          .content button:hover {
  213.            cursor: pointer;
  214.            -webkit-transform: translateY(-1px);
  215.            -moz-transform: translateY(-1px);
  216.            -ms-transform: translateY(-1px);
  217.            -o-transform: translateY(-1px);
  218.            transform: translateY(-1px);
  219.          }
  220.        </style>
  221.      </head>
  222.      <body>
  223.        <div class='content'>
  224.          $html
  225.          <button onclick='history.go(-1);'>Вернуться</button>
  226.        </div>
  227.      </body>
  228.      </html>
  229.    ";
  230.     exit(0);
  231. }
  232.  
  233. function getInput()
  234. {
  235.     $input = [
  236.         "text" => $_SERVER["REQUEST_METHOD"] == "POST" ? $_POST : $_GET,
  237.         "files" => $_FILES
  238.     ];
  239.     return $input;
  240. }
  241.  
  242. function getFiles($input)
  243. {
  244.     $files = [];
  245.     foreach ($input["files"] as $entry) {
  246.         if (!is_array($entry["name"])) {
  247.             if (empty($entry["name"])) continue;
  248.             $entry["name"] = basename($entry["name"]);
  249.             $files [] = $entry;
  250.             continue;
  251.         }
  252.         for ($i = 0; $i < count($entry["name"]); $i++) {
  253.             $file = [];
  254.             foreach ($entry as $name => $values) {
  255.                 $file[$name] = $values[$i];
  256.             }
  257.             if (empty($file["name"])) continue;
  258.             $file["name"] = basename($file["name"]);
  259.             $files [] = $file;
  260.         }
  261.     }
  262.     return $files;
  263. }
  264.  
  265. function getBigFiles($files)
  266. {
  267.     $bigFiles = [];
  268.     foreach ($files as $file) {
  269.         if ($file["error"] == UPLOAD_ERR_INI_SIZE || $file["error"] == UPLOAD_ERR_FORM_SIZE) {
  270.             $bigFiles [] = $file;
  271.         }
  272.     }
  273.     return $bigFiles;
  274. }
  275.  
  276. function getErrorFiles($files)
  277. {
  278.     $errorFiles = [];
  279.     foreach ($files as $file) {
  280.         if ($file["error"] > UPLOAD_ERR_FORM_SIZE) {
  281.             $errorFiles [] = $file;
  282.         }
  283.     }
  284.     return $errorFiles;
  285. }
  286.  
  287. function getGoodFiles($files)
  288. {
  289.     $goodFiles = [];
  290.     foreach ($files as $file) {
  291.         if ($file["error"] == UPLOAD_ERR_OK) {
  292.             $goodFiles [] = $file;
  293.         }
  294.     }
  295.     return $goodFiles;
  296. }
  297.  
  298. function translateUploadError($errorCode)
  299. {
  300.     $errorMessage = "";
  301.     switch ($errorCode) {
  302.         case UPLOAD_ERR_PARTIAL:
  303.             $errorMessage = "Загружаемый файл был получен только частично";
  304.             break;
  305.         case UPLOAD_ERR_NO_FILE:
  306.             $errorMessage = "Файл не был загружен";
  307.             break;
  308.         case UPLOAD_ERR_NO_TMP_DIR:
  309.             $errorMessage = "Отсутствует временная папка";
  310.             break;
  311.         case UPLOAD_ERR_CANT_WRITE:
  312.             $errorMessage = "Не удалось записать файл на диск";
  313.             break;
  314.         case UPLOAD_ERR_EXTENSION:
  315.             $errorMessage = "PHP-расширение остановило загрузку файла";
  316.             break;
  317.     }
  318.     return $errorMessage;
  319. }
  320.  
  321. function getSiteName()
  322. {
  323.     $siteName = $_SERVER["HTTP_REFERER"]
  324.         ? preg_split("/[?\/]/", $_SERVER["HTTP_REFERER"], -1, PREG_SPLIT_NO_EMPTY)[1]
  325.         : "";
  326.     return $siteName;
  327. }
  328.  
  329. function sendEmail($input, $leadId, $errorFiles, $goodFiles)
  330. {
  331.     $ok = true;
  332.     $siteName = getSiteName();
  333.     $subject = $input["text"]["leadId"]
  334.         ? "Лид {$input["text"]["leadId"]} с сайта $siteName"
  335.         : "Лид $leadId с сайта $siteName";
  336.     $uid = md5(uniqid(time()));
  337.     $body = "--$uid\r\n";
  338.     $body .= "Content-type:text/html; charset=utf-8\r\n";
  339.     $body .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
  340.     $body .= "<html><body>";
  341.     $body .= $input["text"]["leadId"]
  342.         ? "<p>Апселл к заказу {$input["text"]["leadId"]}:</p>"
  343.         : "<p>Новый заказ:</p>";
  344.     $body .= "<ul><li>ID: ";
  345.     $body .= $input["text"]["leadId"]
  346.         ? $input["text"]["leadId"]
  347.         : $leadId . "</li>";
  348.     foreach ($input["text"] as $name => $value) {
  349.         $name != "redirect" && $name != "leadId" && $name != "MAX_FILE_SIZE" && $body .= "<li>$name: $value</li>";
  350.     }
  351.     $body .= "
  352.      <li>IP: {$_SERVER["REMOTE_ADDR"]}</li>
  353.      <li>URL: {$_SERVER["HTTP_REFERER"]}</li>
  354.      <li>User Agent: {$_SERVER["HTTP_USER_AGENT"]}</li>
  355.      </ul>
  356.    ";
  357.     if (count($errorFiles) != 0) {
  358.         $body .= "<p>Ошибки загрузки файлов:</p><ul>";
  359.         foreach ($errorFiles as $file) {
  360.             $body .= "<li>{$file["name"]}: " . translateUploadError($file["error"]) . "</li>";
  361.         }
  362.         $body .= "</ul>";
  363.     }
  364.     $body .= "</body></html>\r\n\r\n";
  365.     foreach ($goodFiles as $file) {
  366.         $body .= "--$uid\r\n";
  367.         $body .= "Content-Type: application/octet-stream; name=\"{$file["name"]}\"\r\n";
  368.         $body .= "Content-Transfer-Encoding: base64\r\n";
  369.         $body .= "Content-Disposition: attachment; filename=\"{$file["name"]}\"\r\n\r\n";
  370.         $content = chunk_split(base64_encode(file_get_contents($file["tmp_name"])));
  371.         $body .= "$content\r\n\r\n";
  372.     }
  373.     $body .= "--$uid--";
  374.     try {
  375.         $sent = mail(NOTIFICATIONS_EMAIL, $subject, $body, implode("\r\n", [
  376.             "MIME-Version: 1.0",
  377.             "Content-type: multipart/mixed; boundary=\"$uid\""
  378.         ]));
  379.         if (!$sent) {
  380.             throw new Exception("Email not accepted by MTA");
  381.         }
  382.     } catch (Exception $e) {
  383.         error_log("Fail to send notification email: $e", 0);
  384.         $ok = false;
  385.     }
  386.     return $ok;
  387. }
  388.  
  389. function sendTelegram($input, $leadId, $errorFiles, $goodFiles)
  390. {
  391.     $ok = true;
  392.     $siteName = getSiteName();
  393.     $message = $input["text"]["leadId"]
  394.         ? "Апселл к заказу {$input["text"]["leadId"]} с сайта $siteName\n\n"
  395.         : "Новый заказ на сайте $siteName\n\nID: $leadId\n";
  396.     foreach ($input["text"] as $name => $value) {
  397.         $name != "redirect" && $name != "leadId" && $name != "MAX_FILE_SIZE" && $message .= "$name: $value\n";
  398.     }
  399.     $message .= "IP: {$_SERVER["REMOTE_ADDR"]}\nURL: {$_SERVER["HTTP_REFERER"]}\nUser Agent: {$_SERVER["HTTP_USER_AGENT"]}\n";
  400.     if (count($errorFiles) != 0) {
  401.         $message .= "\nОшибки загрузки файлов:\n";
  402.         foreach ($errorFiles as $file) {
  403.             $message .= "{$file["name"]}: " . translateUploadError($file["error"]) . "\n";
  404.         }
  405.     }
  406.     $message = urlencode($message);
  407.     try {
  408.         httpRequest("https://api.telegram.org/bot"
  409.             . TELEGRAM_TOKEN
  410.             . "/sendMessage?chat_id="
  411.             . TELEGRAM_CHAT_ID
  412.             . "&text={$message}");
  413.     } catch (Exception $e) {
  414.         error_log("Fail to send notification to telegram: $e", 0);
  415.         $ok = false;
  416.     }
  417.     $leadId = $input["text"]["leadId"] ? $input["text"]["leadId"] : $leadId;
  418.     foreach ($goodFiles as $file) {
  419.         try {
  420.             httpRequest("https://api.telegram.org/bot" . TELEGRAM_TOKEN . "/sendDocument", "POST", [], [
  421.                 "chat_id" => TELEGRAM_CHAT_ID,
  422.                 "document" => curl_file_create($file["tmp_name"], "", $file["name"]),
  423.                 "caption" => "Вложение к заказу $leadId"
  424.             ]);
  425.         } catch (Exception $e) {
  426.             error_log("Fail to send file to telegram: $e", 0);
  427.             $ok = false;
  428.         }
  429.     }
  430.     return $ok;
  431. }
  432.  
  433. function redirect($input, $leadId)
  434. {
  435.     $redirectUrlSplitted = explode("?", $input["text"]["redirect"], 2);
  436.     $redirectUrl = "{$redirectUrlSplitted[0]}?leadId=";
  437.     $redirectUrl .= $input["text"]["leadId"] ?: $leadId;
  438.     foreach ($input["text"] as $name => $value) {
  439.         $name != "redirect" && $name != "leadId" && $redirectUrl .= "&$name=$value";
  440.     }
  441.     if (count($redirectUrlSplitted) > 1) $redirectUrl .= "&{$redirectUrlSplitted[1]}";
  442.     if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  443.         header("Content-Type: application/json; charset=utf-8");
  444.         echo json_encode(['redirect' => $redirectUrl]);
  445.         exit(0);
  446.     }
  447.     header("Location: $redirectUrl");
  448.     exit(0);
  449. }
  450.  
  451. function showDefaultThankyouPage($input)
  452. {
  453.     if ($input["text"]["leadId"]) {
  454.         $html = "<h3>Товар добавлен к заказу</h3>"
  455.             . "<p>Мы свяжемся с вами в течение 15 минут для подтверждения заказа. "
  456.             . "Пожалуйста, убедитесь, что ваш телефон включен</p><ul>";
  457.         foreach ($input["text"] as $name => $value) {
  458.             if ($name != "redirect" && $name != "leadId" && $name != "MAX_FILE_SIZE") $html .= "<li>$name: $value</li>";
  459.         }
  460.         $html .= "</ul>";
  461.     } else {
  462.         $html = "<h3>Ваша заявка принята</h3>"
  463.             . "<p>Мы свяжемся с вами в течение 15 минут для подтверждения заказа. "
  464.             . "Пожалуйста, убедитесь, что ваш телефон включен и проверьте введённые данные</p><ul>";
  465.         foreach ($input["text"] as $name => $value) {
  466.             if ($name != "redirect" && $name != "MAX_FILE_SIZE") $html .= "<li>$name: $value</li>";
  467.         }
  468.         $html .= "</ul><p>Если вы ошиблись, вернитесь на страницу заказа и заполните форму еще раз</p>";
  469.     }
  470.     if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  471.         header("Content-Type: application/json; charset=utf-8");
  472.         echo json_encode(['html' => $html]);
  473.         exit(0);
  474.     }
  475.     render($html);
  476. }
  477.  
  478. function showPostExceededError()
  479. {
  480.     $html = "<h3>Ошибка отправки формы</h3>"
  481.         . "<p>Максимальный суммарный размер загружаемых файлов не должен превышать "
  482.         . round(getPostMaxSize() / 1024 / 1024, 2) . " МБ</p>"
  483.         . "<p>Вернитесь на страницу заказа и заполните форму еще раз</p>";
  484.     if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  485.         header("Content-Type: application/json; charset=utf-8");
  486.         header("HTTP/1.0 400 Bad Request");
  487.         echo json_encode(['html' => $html]);
  488.         exit(0);
  489.     }
  490.     render($html);
  491. }
  492.  
  493. function showBigFilesError($input, $bigFiles)
  494. {
  495.     $html = "<h3>Ошибка отправки формы</h3>"
  496.         . "<p>Следующие файлы не загружены из-за слишком большого размера</p><ul>";
  497.     foreach ($bigFiles as $file) {
  498.         $html .= "<li>{$file["name"]}</li>";
  499.     }
  500.     $html .= "<p></ul>Максимальный размер загружаемого файла - "
  501.         . round(getFileMaxSize($input) / 1024 / 1024, 2) . " МБ</p>";
  502.     $html .= "<p>Вернитесь на страницу заказа и заполните форму еще раз</p>";
  503.     if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  504.         header("Content-Type: application/json; charset=utf-8");
  505.         header("HTTP/1.0 400 Bad Request");
  506.         echo json_encode(['html' => $html]);
  507.         exit(0);
  508.     }
  509.     render($html);
  510. }
  511.  
  512. function showFormError()
  513. {
  514.     $html = "<h3>Ошибка отправки формы</h3>"
  515.         . "<p>Попробуйте повторить попытку позднее</p>";
  516.     if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  517.         header("Content-Type: application/json; charset=utf-8");
  518.         header("HTTP/1.0 400 Bad Request");
  519.         echo json_encode(['html' => $html]);
  520.         exit(0);
  521.     }
  522.     render($html);
  523. }
  524.  


Вот HTML:
CODE (html):
скопировать код в буфер обмена
  1. <div class="popa">
  2. <form action="c2VuZF9mb3JtX2luX3RlbGVncmFt.php" method="post" enctype="multipart/form-data">
  3. <input type="vk" name="Style7" placeholder="Ссылка на ваш вк" minlength="7" maxlength="60" required>
  4. <input type="urls" name="Фон" placeholder="Ссылка на ваш фон" minlength="7" maxlength="250" required>
  5. <input type="text" name="Ник" placeholder="Введите ваш ник (будет на вашей иллюстрации)" minlength="1" maxlength="60" required>
  6. <input type="car" name="Картинка" placeholder="Ссылка на картинку,которую нужно анимировать" minlength="1" maxlength="250" required>
  7. <input type="steam" name="Стим" placeholder="Ссылка на ваш Steam профиль(необязательно)" maxlength="250">
  8. <textarea class="nepopa" style="width: 100%;" cols="1" name="Комментарии" rows="7" placeholder="Опишите подробно что вы хотите видеть в своей анимации" maxlength="2800"></textarea>
  9. <input type="submit" value="Отправить заявку и перейти к оплате">
  10. <input type="hidden" name="redirect" value="style7.html">
  11. </form>
  12. </div>
  13. </div>
2. andrewkard - 19 Апреля, 2018 - 11:26:54 - перейти к сообщению
Ставим на сайт:
https://developers[dot]google[dot]com/re[dot][dot][dot]cha/docs/display
Проверка на сервере:
https://developers[dot]google[dot]com/re[dot][dot][dot]tcha/docs/verify
3. dofamin - 19 Апреля, 2018 - 15:06:45 - перейти к сообщению
andrewkard пишет:
Ставим на сайт:
https://developers[dot]google[dot]com/re[dot][dot][dot]cha/docs/display
Проверка на сервере:
https://developers.google.com/recaptcha/docs/verify

Да это и так понятно,мне нужно это в код внедрить,чтобы все работало.
4. andrewkard - 19 Апреля, 2018 - 16:32:17 - перейти к сообщению
dofamin пишет:
Да это и так понятно

а что тогда непонятно? Копируете из доков код и ставите себе

 

Powered by ExBB FM 1.0 RC1