Вы можете использовать этот плагин, flutter_recaptcha .
Для домена у меня возникла та же проблема. Сначала я обнаружил, что мне нужно использовать опцию «Я не робот» из здесь , и мне пришлось проверить репозиторий github , чтобы найти эту информацию, !!! Не забудьте добавить этот домен в настройку reCaptcha: recaptcha-flutter-plugin.firebaseapp.com,", что объясняет это.
Я немного растерялся, когда не увидел этого на главной странице, но теперь это имеет смысл. Надеюсь, это поможет.
Редактировать
Я кое-что заметил после того, как попробовал это, что я хотел бы упомянуть. Плагин не предоставляет контрольный ответ для использования для аутентификации пользователя на стороне сервера, поэтому он не выглядит очень полезным в том виде, как он есть. Тем не менее, это простой плагин, поэтому можно использовать его в качестве примера. Я думаю, что нужно будет создать веб-страницу с капчей. Как и в случае с плагином, используйте веб-просмотр, чтобы открыть страницу, затем запишите выходные данные формы и IP-адрес пользователя, отправившего форму, , используя что-то вроде , затем отправьте его на флаттер , а затем отправьте запрос с этой информацией и используйте библиотеку Google для проверки капчи.
Инструкции
Я только что завершил реализацию это и я нашел хороший способ, который работает. Сначала создайте страницу html, например:
<html>
<head>
<title>reCAPTCHA</title>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body style='background-color: aqua;'>
<div style='height: 60px;'></div>
<form action="?" method="POST">
<div class="g-recaptcha"
data-sitekey="YOUR-SITE-KEY"
data-callback="captchaCallback"></div>
</form>
<script>
function captchaCallback(response){
//console.log(response);
if(typeof Captcha!=="undefined"){
Captcha.postMessage(response);
}
}
</script>
</body>
</html>
Затем разместите ее в своем домене, например, example.com/captcha.
Затем создайте виджет для флаттера, например: это:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class Captcha extends StatefulWidget{
Function callback;
Captcha(this.callback);
@override
State<StatefulWidget> createState() {
return CaptchaState();
}
}
class CaptchaState extends State<Captcha>{
WebViewController webViewController;
@override
initState(){
super.initState();
}
@override
Widget build(BuildContext context) {
return Center(
child: WebView(
initialUrl: "https://example.com/captcha.html",
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: Set.from([
JavascriptChannel(
name: 'Captcha',
onMessageReceived: (JavascriptMessage message) {
//This is where you receive message from
//javascript code and handle in Flutter/Dart
//like here, the message is just being printed
//in Run/LogCat window of android studio
//print(message.message);
widget.callback(message.message);
Navigator.of(context).pop();
})
]),
onWebViewCreated: (WebViewController w) {
webViewController = w;
},
)
);
}
}
Убедитесь, что вы зарегистрировались для ключа капчи на https://www.google.com/recaptcha (нажмите «Консоль администратора» в правом верхнем углу).
Затем , у вас есть встроенный интерфейс. Чтобы вызвать капчу, просто наберите:
Navigator.of(context).push(
MaterialPageRoute(
builder: (context){
return Captcha((String code)=>print("Code returned: "+code));
}
),
);
Вы можете использовать любой обратный вызов, например:
class GenericState extends State<Generic>{
void methodWithCaptcha(String captchaCode){
// Do something with captchaCode
}
@override
Widget build(BuildContext context) {
return Center(child:FlatButton(
child: Text("Click here!"),
onPressed: (){
Navigator.of(context).push(
MaterialPageRoute(
builder: (context){
return Captcha(methodWithCaptcha);
}
),
);
}
}
}
На стороне сервера, вы можете следовать инструкциям здесь (я следил за разделами «Прямая загрузка» и «Использование»). Я обнаружил, что для использования я мог просто использовать код:
$recaptcha = new \ReCaptcha\ReCaptcha($secret);
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);
if ($resp->isSuccess()) {
// Verified!
} else {
$errors = $resp->getErrorCodes();
}
Использование setExpectedHostname
, как в примере, было ненужным.
После этого все работает! Я думаю, что в настоящее время это лучший способ реализовать Google ReCaptcha V2 во флаттере (как для iOS, так и для Android).