Php 谷歌TCHA成功后,如何将表单数据发布到第三方服务器?
我有一个很基本的问题,但我对PHP和表单创建非常陌生,希望有人能帮助我 尽管有蜜罐方法,但我们的网站上仍有垃圾邮件机器人不断提交一个字段的电子邮件表单,所以我希望使用谷歌的隐形reCaptcha来解决这个问题 我按照这本有用的指南中的说明进行操作:但我遇到的问题是,在结果成功后,我想获取通过表单提交的电子邮件地址,然后将其发布到第三方服务器(在本例中,我们的营销自动化工具Pardot) 以下是不可见的reCaptcha代码: 前端Php 谷歌TCHA成功后,如何将表单数据发布到第三方服务器?,php,forms,invisible-recaptcha,Php,Forms,Invisible Recaptcha,我有一个很基本的问题,但我对PHP和表单创建非常陌生,希望有人能帮助我 尽管有蜜罐方法,但我们的网站上仍有垃圾邮件机器人不断提交一个字段的电子邮件表单,所以我希望使用谷歌的隐形reCaptcha来解决这个问题 我按照这本有用的指南中的说明进行操作:但我遇到的问题是,在结果成功后,我想获取通过表单提交的电子邮件地址,然后将其发布到第三方服务器(在本例中,我们的营销自动化工具Pardot) 以下是不可见的reCaptcha代码: 前端 <script> function captchaS
<script>
function captchaSubmit(data) {
document.getElementsByClassName("invisible-recaptcha").submit();
}
</script>
<form action="utils/recaptcha.php" method="post" class="pardot-email-form-handler invisible-recaptcha" novalidate>
<input class="one-field-pardot-form-handler" maxlength="80" name="email" size="20" type="email" placeholder="Enter Email Address" required="required" />
<div style="position:absolute; left:-9999px; top: -9999px;">
<label for="pardot_extra_field">Comments</label>
<input type="text" id="pardot_extra_field" name="pardot_extra_field">
</div>
<button class="g-recaptcha" data-sitekey="anonymous" data-callback="captchaSubmit" type="submit" name="captchaSubmit">Submit</button>
</form>
函数captchSubmit(数据){
document.getElementsByClassName(“不可见的重述”).submit();
}
评论
提交
后端:
<?php
// reCaptcha info
$secret = "anonymous";
$remoteip = $_SERVER["REMOTE_ADDR"];
$url = "https://www.google.com/recaptcha/api/siteverify";
// Form info
$email = $_POST["email"];
$response = $_POST["g-recaptcha-response"];
// Curl Request
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
'secret' => $secret,
'response' => $response,
'remoteip' => $remoteip
));
$curlData = curl_exec($curl);
curl_close($curl);
// Parse data
$recaptcha = json_decode($curlData, true);
if ($recaptcha["success"])
echo "Success!";
else
echo "Failure!";
?>
我以前曾使用下面的代码发布到Pardot,但现在不清楚如何做到这一点,因为最初的帖子是发布到Google而不是Pardot。在收到TCHA的成功确认后,我将如何发布到Pardot
<div class="nav-email-form">
<form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" method="post" class="pardot-email-form-handler" novalidate>
<input class="one-field-pardot-form-handler" maxlength="80" name="email" size="20" type="email" placeholder="Enter Email Address" required="required" />
<div style="position:absolute; left:-9999px; top: -9999px;">
<label for="pardot_extra_field">Comments</label>
<input type="text" id="pardot_extra_field" name="pardot_extra_field">
</div>
<button type="submit" name="submit">Submit</button>
</form>
评论
提交
由于您已经开始使用
curl
来处理验证码,也许您应该在成功
响应后使用curl向Pardot发出POST
请求。你也许可以这样尝试-顺便说一句,没有经过测试
function curl( $url=NULL, $options=NULL ){
/*
Download a copy of cacert.pem from
https://curl.haxx.se/docs/caextract.html
and then edit below as appropriate
*/
$cacert='c:/wwwroot/cacert.pem'; #<-------- edit to suit own environment
$res=array(
'response' => NULL,
'info' => array( 'http_code' => 100 ),
'headers' => NULL,
'errors' => NULL
);
if( is_null( $url ) ) return (object)$res;
/* Initialise curl request object */
$curl=curl_init();
if( parse_url( $url,PHP_URL_SCHEME )=='https' ){
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, true );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $curl, CURLOPT_CAINFO, $cacert );
}
/* Define standard options */
curl_setopt( $curl, CURLOPT_URL,trim( $url ) );
curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_FAILONERROR, true );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLINFO_HEADER_OUT, false );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' );
curl_setopt( $curl, CURLOPT_ENCODING, '' );
/* Assign runtime parameters as options */
if( isset( $options ) && is_array( $options ) ){
foreach( $options as $param => $value ) curl_setopt( $curl, $param, $value );
}
/* Execute the request and store responses */
$res=(object)array(
'response' => curl_exec( $curl ),
'info' => (object)curl_getinfo( $curl ),
'errors' => curl_error( $curl )
);
curl_close( $curl );
return $res;
}
/*
stage 1: POST to Google
-----------------------
*/
$url='https://www.google.com/recaptcha/api/siteverify';
$params=array(
'secret' => $secret,
'response' => $_POST['g-recaptcha-response'],
'remoteip' => $_SERVER['REMOTE_ADDR']
);
$options=array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params
);
$result=curl( $url, $options );
if( $result->info->http_code==200 ){
$json=json_decode( $result->response );
$status=$json->success;
if( $status ){
/*
stage 2: POST to PARDOT
-----------------------
*/
$url='https://go.pardot.com/l/43312/2017-10-24/7dnr3n';
/* fields within the PARDOT form */
$_POST['pardot_extra_field']='';
$_POST['submit']='';
/* no need to send this field */
unset( $_POST['g-recaptcha-response'] );
/* this needs a value - but from where? */
#$_POST['email']='GERONIMO@EXAMPLE.COM';
$options=array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $_POST
);
$result=curl( $url, $options );
if( $result->info->http_code==200 ){
/* all good */
header('Location: ?mailsent=true');
} else {
/* bogus */
}
} else {
echo 'bogus';
}
}
函数curl($url=NULL,$options=NULL){
/*
从下载cacert.pem的副本
https://curl.haxx.se/docs/caextract.html
然后根据需要编辑以下内容
*/
$cacert='c:/wwwroot/cacert.pem'.#NULL,
'info'=>array('http_code'=>100),
'headers'=>NULL,
“错误”=>NULL
);
如果(is_null($url))返回(object)$res;
/*初始化curl请求对象*/
$curl=curl_init();
if(parse_url($url,PHP_url_SCHEME)='https'){
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,true);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
curl_setopt($curl,CURLOPT_CAINFO,$cacert);
}
/*定义标准选项*/
curl_setopt($curl,CURLOPT_URL,trim($URL));
curl_setopt($curl,CURLOPT_AUTOREFERER,true);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($curl,CURLOPT_FAILONERROR,true);
curl_setopt($curl,CURLOPT_头,false);
curl_setopt($curl,CURLINFO_HEADER_OUT,false);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0(windowsnt 6.1;Win64;x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/58.0.3029.110 Safari/537.36');
curl_setopt($curl,CURLOPT_ENCODING');
/*将运行时参数指定为选项*/
if(isset($options)和is_数组($options)){
foreach($param=>$value)curl_setopt($curl,$param,$value);
}
/*执行请求并存储响应*/
$res=(对象)数组(
“响应”=>curl\u exec($curl),
'info'=>(对象)curl\u getinfo($curl),
“错误”=>curl\u错误($curl)
);
curl_close($curl);
返回$res;
}
/*
第一阶段:发布到谷歌
-----------------------
*/
$url='1https://www.google.com/recaptcha/api/siteverify';
$params=数组(
'secret'=>$secret,
“response”=>$\u POST['g-recaptcha-response'],
'remoteip'=>$\u服务器['REMOTE\u ADDR']
);
$options=array(
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS=>$params
);
$result=curl($url$options);
如果($result->info->http\u code==200){
$json=json_解码($result->response);
$status=$json->success;
如果($状态){
/*
第二阶段:投递至帕多
-----------------------
*/
$url='1https://go.pardot.com/l/43312/2017-10-24/7dnr3n';
/*PARDOT表单中的字段*/
$\u POST['pardot\u extra\u field']='';
$\u POST['submit']='';
/*不需要发送此字段*/
未设置($_POST['g-recaptcha-response']);
/*这需要一个值-但从哪里开始*/
#$\u POST['email']='GERONIMO@EXAMPLE.COM';
$options=array(
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS=>$\u POST
);
$result=curl($url$options);
如果($result->info->http\u code==200){
/*一切都好*/
标题('位置:?mailssent=true');
}否则{
/*伪造的*/
}
}否则{
回声“假”;
}
}
下面是我最后对后端代码所做的操作。需要更好的成功和错误处理,我只将SSL_VERIFYPEER设置为false,因为我是在本地环境中设置的,但经过测试并成功发布到Pardot:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Results</title>
</head>
<body>
<p>Thank you for entering the form.</p>
<?php
// reCaptcha info
$secret = "anonymous";
$remoteip = $_SERVER["REMOTE_ADDR"];
$url = "https://www.google.com/recaptcha/api/siteverify";
// Form info
$email = $_POST["email"];
$response = $_POST["g-recaptcha-response"];
// Curl Request
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
'secret' => $secret,
'response' => $response,
'remoteip' => $remoteip
));
$curlData = curl_exec($curl);
curl_close($curl);
// Parse data
$recaptcha = json_decode($curlData, true);
if ($recaptcha["success"]) {
echo "Success!";
$pardotPost ='email='. $_POST["email"];
$curl_handle = curl_init();
$url = "anonymous";
curl_setopt ($curl_handle, CURLOPT_URL,$url);
curl_setopt($curl_handle, CURLOPT_POST, true);
curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl_handle, CURLOPT_POSTFIELDS, $pardotPost);
curl_setopt( $curl_handle, CURLOPT_SSL_VERIFYPEER, false );
$result = curl_exec ($curl_handle);
curl_close ($curl_handle);
}
else {
echo "Failure!";
}
?>
</body>
</html>
结果
谢谢你填写表格
google recaptcha代码在哪里?在问题的指南中添加了recaptcha代码。基本上,我想在后端代码的if“success”部分之后发布到Pardot。看起来Pardot需要一个电子邮件地址-它来自哪里?更新的答案包括现场使用的实际代码,而不是文档中的示例。来自前端代码。谢谢@RamRaider!根据您的建议使用CURL,但最终的结果与上面的不同,这反映在我的答案中。