Codeigniter reCaptcha v3 with cUrl - codeigniter

I have a form integrated with invisible reCaptcha.
Verification is performed on a function within the Controller.
The call to google is made using file_get_content and if no response is obtained, the call is made using curl.
This is the function
public function verify_captcha()
{
$recaptcha_response = $_POST['recaptchaResponse'];
log_message('info', $recaptcha_response);
// Build POST request:
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = 'My KEY';
$recaptcha_response = $_POST['recaptchaResponse'];
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha,true);
if(!$recaptcha)
{
// call curl to POST request
log_message('info', 'Call CURL');
$data = array( 'secret' => $recaptcha_secret, 'response' => $recaptcha_response);
//$curlConfig = array( CURLOPT_URL => $recaptcha_url, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $data );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $recaptcha_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$recaptcha = json_decode($response, true);
ob_start();
var_dump($recaptcha);
$result = ob_get_contents(); //or ob_get_clean()
log_message('info', $result);
if (array_key_exists('error-codes', $recaptcha))
{
log_message('error', 'Error reCaptcha '.$recaptcha['error-codes'][0]);
}
if ($recaptcha["success"] == '1')
{
if ($recaptcha["score"] >= 0.5)
{
}
}
else
{
log_message('error', 'Error reCaptcha no Success');
}
else
{
log_message('info', 'Call file_get_content');
}
}
These are the messages of the log file
ERROR - 2020-03-18 09:54:31 --> Severity: Warning --> file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known /mysite/application/controllers/captcha.php 1362
ERROR - 2020-03-18 09:54:31 --> Severity: Warning --> file_get_contents(https://www.google.com/recaptcha/api/siteverify?secret=6LfP26QUAAAAAHilJfguEgIcgOBkTg2soD7oCQIh&response=03AERD8XpOL7956DMd7dhiqasH4fK2iNjtBFBJdw3OynXGeAFBMmSqqtjsqXFW97rv-kD_H-y6aLrL1VLMkwg222Y7BoNnaB_zQ7y2NzXVtlIsWYwIw9BSbUdFdSylq4dNjO5j5Jo1xvjPotvMFuddnC5YVRC1wnk7HESqv8hvRU40x9pNpoQ-sIaXcAN8BdBgleXFufmmNoMzuh3PCvgT3RkIj1TsTs-ltM9LyVbLtFnFPbTkHZqpQjppMkHCcw87u3xqbr23EJkusR_U2vFwJTAJU9p-Z27sDuiKmEMsjJ2O1i3Wnxm9yq4HiEI2vnh420VDnPZEYRbXuLLSGhGuPciGQ3mtp07tjn265oyYbcFp2s9GentdUpPWRCxWfySTa6du7dzzSHkqPMKcPf6LmfVtICkTJf4y-w): failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known /mysite/application/controllers/captcha.php 1362
INFO - 2020-03-18 09:54:31 --> Call CURL
INFO - 2020-03-18 09:54:31 --> NULL
The call to file_get_content shows error and returns nothing with curl.
What may be happening?
Thanks

If you totally, absolutely need to use file_get_contents, I'll share with you a helper function I have, which you can adapt to your own needs
function validate_recaptcha_response($recaptcha_response)
{
$api_url = 'https://www.google.com/recaptcha/api/siteverify';
$api_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$remoteip = '';
$data = array('secret' => $api_secret, 'response' => $recaptcha_response);
$options = array(
'http' => array(
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($api_url, false, $context);
$captcha_response = json_decode($result, true);
$r = array(
'success' => $captcha_response['success'],
'timestamp' => $captcha_response['challenge_ts'],
'hostname' => $captcha_response['hostname'],
'error_codes' => (isset($captcha_response['error-codes'])) ? $captcha_response['error-codes'] : null,
);
return $r;
}
I call this from any controller that gets the recaptcha response (the helper is autoloaded) using something like
$recaptcha_check = validate_recaptcha_response($var_where_you_store_the_recaptcha_response);
Please note that I'm adding the $options array to build a POST, defining a header, the method and use http_build_query() and stream_context_create() before file_get_contents() in order to query the data.

Please Follow the bellow Steps to integrate Recaptcha v3 in Codeigniter versions bellow 4 (3.1.9) or others.
Step #1: Create Recaptcha v3 for your domain and keep the site_key & secret_key.
[https://cloud.google.com/recaptcha-enterprise/docs/create-key][1]
Step #2: Add the bellow Javascirpt codes with replacement of your site_key & secret_key inside Head section of your Form page.
<script type="text/javascript">
var review_recaptcha_widget;
var onloadCallback = function() {
if($('#review_recaptcha').length) {
review_recaptcha_widget = grecaptcha.render('review_recaptcha', {
'sitekey' : 'recaptcha_site_key_v3',
'secretkey' : 'recaptcha_secret_key_v3'
});
}
};
</script>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
Step #3:Browse the page, you will see the new recaptcha in right bottom corner of page, Done, thats it.

Related

How can I send sms using codeigniter 4?

I'm trying to send SMS using CodeIgniter 4 but something went wrong any help or another way to send?
This is my code:
public function message()
{
/*Check submit button */
if ($this->request->getPost()) {
$email = $this->input->post('email');
$data=$this->users_model->getUserByEmail($email);
$phone=$data['phone'];
$authKey = "3456655757gEr5a019b18";
/*Multiple mobiles numbers separated by comma*/
$mobileNumber = $phone;
/*Sender ID,While using route4 sender id should be 6 characters long.*/
$senderId = "ABCDEF";
/*Your message to send, Add URL encoding here.*/
$message = "From Codeigniter 4";
/*Define route */
$route = "route=4";
/*Prepare you post parameters*/
$postData = array(
'authkey' => $authKey,
'mobiles' => $mobileNumber,
'message' => $message,
'sender' => $senderId,
'route' => $route
);
/*API URL*/
$url="https://control.msg91.com/api/sendhttp.php";
/* init the resource */
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData
/*,CURLOPT_FOLLOWLOCATION => true*/
));
/*Ignore SSL certificate verification*/
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
/*get response*/
$output = curl_exec($ch);
/*Print error if any*/
if (curl_errno($ch)) {
echo 'error:' . curl_error($ch);
}
curl_close($ch);
echo "Message Sent Successfully !";
}
}
After run the code above my web page return "Message Sent Successfully!", but nothing received in my phone. What is the problem?
What does the cURL call responds in the $output variable?
You already put the output in it and i think it will guide you to the reason why the SMS is not sending out to your phone.

Use of undefined constant CURL_POSTFIELDS - assumed 'CURL_POSTFIELDS' (this will throw an Error in a future version of PHP)

I'm writing a laravel application to send sms. However the postfields part is throwing an error. How do I resolve it?
private function sendMessage($message, $recipients) {
$encodeMessage=urlencode($message);
$authkey = 'XYZ';
$senderid = '';
$route = ;
$country = ;
$data = array(
'authkey' => $authkey,
'recipients' => $recipients,
'message' => $encodeMessage,
'sender' => $senderid,
'route' => $route,
'country' => $country,
);
//dd($recipients)
$url = " ";
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURL_POSTFIELDS => $data
));
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);$output=curl_exec($ch);
if(curl_errno($ch)) {
echo 'error '.curl_error($ch);
}
curl_close($ch);
return back()->with('success','Messages sent successfully');
}
This is the error I'm getting:
"Use of undefined constant CURL_POSTFIELDS - assumed 'CURL_POSTFIELDS'
(this will throw an Error in a future version of PHP)"
Your error says that you use a constant that is undefined, which means it has never been declared. Indeed, as it has already been said in the comments, the correct constant is CURLOPT_POSTFIELDS.
This error happens because your php version dont't have the curl extension, try to change this version if you miss, or install the curl extension. To do this, run
sudo apt install php-version-curl
$fileName = storage_path('app') . '/tmp.xlsx';
$file_put_contents($fileName, file_get_contents($path));
$fields['file_name'] = $this->makeCurlFile($fileName);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
protected function makeCurlFile($file)
{
$mime = mime_content_type($file);
$info = pathinfo($file);
$name = $info['basename'];
$output = new \CURLFile($file, $mime, $name);
return $output;
}

Nativescript - Onesignal rest Api

I have push notifications on my app with onesignal sdk, but i´m having dificulty understanding how could i send with a large icon, i mean the one that stays on the left when the user receives the push(instead of showing a bell)...i know the icon must be transparent and have 256px x 256px. I´m sending the push using the rest api, but i don´t know where the problem is because nothing seems to work, here is my code:
public function sendMessage($messagePush){
$subtitle=["en" => $messagePush['message']];
$content = array(
"en" => $messagePush['contentJson']['tipoImovel'],
"large_icon" => public_path('img/icon.png')
);
$hashes_array = array();
array_push($hashes_array, array(
"id" => "id1",
"text" => "Ver"
));
$fields = array(
'app_id' => "myappid",
'included_segments' => array(
'All'
),
'data' => array(
"imovel" => $messagePush['contentJson']
),
'headings'=> $subtitle,
'contents' => $content,
'buttons' => $hashes_array
);
$fields = json_encode($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://onesignal.com/api/v1/notifications");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Authorization: my autorization'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$resp = curl_exec($ch);
curl_close($ch);
return $resp;
}
I can receive the push, but the icon never appears, and there´s also another problem...the push always appear on the top tray instead of the popup "kind", for that manner below is also my code that is on my app.js:
if (application.android) {
application.on(application.launchEvent, (args) => {
try {
TnsOneSignal.startInit(application.android.context).setNotificationOpenedHandler(new TnsOneSignal.NotificationOpenedHandler({
// notificationOpened: function (result: com.onesignal.OSNotificationOpenResult) {
notificationOpened: function (result) {
const imovelAndroid = JSON.parse(result.stringify()).notification.payload.additionalData;
handleOpenURL(imovelAndroid);
}
})).init();
TnsOneSignal.setInFocusDisplaying(TnsOneSignal.OSInFocusDisplayOption.Notification);
TnsOneSignal.startInit(application.android.context).init();
}
catch (error) {
console.error('error', error);
}
});
}
If i remove the TnsOneSignal.setInFocusDisplaying(TnsOneSignal.OSInFocusDisplayOption.Notification); the popup style appears, but the buttons don´t navegate to my handleOpenURL function...but if i let it stay, it does navigate but the push is always on the tray.
Any tips? thanks for your time.
Regards
You will have to remove TnsOneSignal.setInFocusDisplaying(TnsOneSignal.OSInFocusDisplayOption.Notification); as that would force the notification to be the tray one. Default one is InAppAlert already.
You were resetting setNotificationOpenedHandler on second call to startInit. So if you remove the second startInit statement too you should be good.

Start point for google analytics and webmaster api

I have about 50 websites in my google analytics account.
I want to do some research, create notification system and compare analytics data with data from other sources.
That means I want to get a dozen of reports for every site twice a day. I parse them and store in mysql. What's the simplest way do do that?
I registered an application and turned on analytics api in it, but there's no webmaster api. Also I have not a clear understanding of oAuth. Is there a way without redirecting and requesting new access token every time? That's something like granting permanent access for my application in my account from my ip without further confirmations.
So, is there a good tutorial for the beginner about retrieving data from analytics and webmaster written in php, perl or ruby?
Following code will help you to retrieve "refresh token" using offline access of oauth flow.
you can use this refresh token to get an access token without bothering user.
Make sure that the Redirect Uri that you have mentioned in your API console should be same as the filename in which you will place the following code.
For eg.
If the redirect uri is:-http://test.com/google_oauth.php
then following script should be placed in :- google_oauth.php (path:http://test.com/google_oauth.php)
<?php
$OAuth = array(
'oauth_uri' => 'https://accounts.google.com/o/oauth2/auth',
'client_id' => '#clientId',
'client_secret' => '#clientSecret',
'access_type' => 'offline',
'redirect_uri' => 'http://test.com/google_oauth.php', //this url should be same as you had registered in your api console as redirect uri()
'oauth_token_uri' => 'https://accounts.google.com/o/oauth2/token'
);
$token = array(
'access_token' => '',
'token_type' => '',
'expires_in' => '',
'refresh_token' => ''
);
$title = 'No Code';
$AuthCode = 'Null';
// see if error parameter exisits
$error = _get_url_param($_SERVER['REQUEST_URI'], 'error');
if ($error != NULL)
{ // this means the user denied api access to GWMTs
$title = $error;
}
else
{ // does the code parameter exist?
$AuthCode = _get_url_param($_SERVER['REQUEST_URI'], 'code');
if ($AuthCode == NULL)
{ // get authorization code
$OAuth_request = _formatOAuthReq($OAuth, "https://www.googleapis.com/auth/analytics.readonly");
header('Location: ' . $OAuth_request);
exit; // the redirect will come back to this page and $code will have a value
}
else
{
$title = 'Got Authorization Code';
// now exchange Authorization code for access token and refresh token
$token_response = _get_auth_token($OAuth, $AuthCode);
$json_obj = json_decode($token_response);
$token['access_token'] = $json_obj->access_token;
$token['token_type'] = $json_obj->token_type;
$token['expires_in'] = $json_obj->expires_in;
$token['refresh_token'] = $json_obj->refresh_token;
echo 'access_token = ' . $json_obj->access_token;
}
}
function _get_auth_token($params, $code)
{
$url = $params['oauth_token_uri'];
$fields = array(
'code' => $code,
'client_id' => $params['client_id'],
'client_secret' => $params['client_secret'],
'redirect_uri' => $params['redirect_uri'],
'grant_type' => 'authorization_code'
);
$response = _do_post($url, $fields);
return $response;
}
function _do_post($url, $fields)
{
$fields_string = '';
foreach ($fields as $key => $value)
{
$fields_string .= $key . '=' . $value . '&';
}
$fields_string = rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
function _formatOAuthReq($OAuthParams, $scope)
{
$uri = $OAuthParams['oauth_uri'];
$uri .= "?client_id=" . $OAuthParams['client_id'];
$uri .= "&redirect_uri=" . $OAuthParams['redirect_uri'];
$uri .= "&scope=" . $scope;
$uri .= "&response_type=code";
$uri .= "&access_type=offline";
return $uri;
}
function _get_url_param($url, $name)
{
parse_str(parse_url($url, PHP_URL_QUERY), $params);
return isset($params[$name]) ? $params[$name] : null;
}
function _get_refresh_token($params, $code)
{
$url = $params['oauth_token_uri'];
$fields = array(
'code' => $code,
'client_id' => $params['client_id'],
'client_secret' => $params['client_secret'],
'refresh_token' => $token['refresh_token'],
'grant_type' => 'refresh_token'
);
$response = _do_post($url, $fields);
return $response;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><?= $title; ?></title>
</head>
<body>
<h1>OAuth2 Authorization Code</h1>
<p>Authorization Code: <?= $AuthCode; ?></p>
<p>access token: <?= $token['access_token']; ?></p>
<p>expires in: <?= $token['expires_in']; ?></p>
<p>refresh token: <?= $token['refresh_token']; ?></p>
<p></p>
</body>
</html>
Once you get your refresh token you can use following code to get data from google analytics:-
<?php
$refresh_token='#refresh-token';
$fields_string = "client_id=#ClientId&client_secret=#clientSecret&refresh_token=$refresh_token&grant_type=refresh_token";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://accounts.google.com/o/oauth2/token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$token_response = curl_exec($ch);
$json_obj = json_decode($token_response);
$access_token = $json_obj->access_token;
curl_close($ch);
$url = "https://www.googleapis.com/analytics/v3/data/ga?ids=ga:30566906&start-date=2013-01-01&end-date=2013-04-16&dimensions=ga:medium&metrics=ga:visits,ga:bounces";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $access_token"));
curl_setopt($ch, CURLOPT_URL, html_entity_decode($url));
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$json_obj = json_decode($output);
$test=$json_obj->columnHeaders;
foreach($test as $a){
var_dump($a);
}
curl_close($ch);
?>
In above scripts:-
#clientId and #clientSecret should be replaced by the client id and client secret that you have received while registering your web application.
For your use case I would suggest using a Google Service Account rather than the OAuth flow that requires human confirmation.
There are Client Libraries available for several languages that can make the OAuth part simpler. For example, in the ruby library includes a sample script showing how to use a service account with Google Analytics API. Essentially it's this:
#client = Google::APIClient.new(
:application_name => opts['application_name'],
:application_version => opts['application_version'])
## Load our credentials for the service account
key = Google::APIClient::KeyUtils.load_from_pkcs12(key_file, key_secret)
#client.authorization = Signet::OAuth2::Client.new(
:token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
:audience => 'https://accounts.google.com/o/oauth2/token',
:scope => 'https://www.googleapis.com/auth/analytics.readonly',
:issuer => service_account_email,
:signing_key => key)
## Request a token for our service account
#client.authorization.fetch_access_token!
query_data = #client.execute(:api_method => #analytics.data.ga.get, :parameters => {
'ids' => "ga:" + #profileID,
'start-date' => #startDate,
'end-date' => #endDate,
'dimensions' => dimension,
'metrics' => metric,
'sort' => sort
})
There is a Webmaster API available although it does not have access to the query data. You can get that through this Google-published python script or through a similar one in PHP with more data.

Jquery POST 500 Internal Error ]when trying to submit a Wufoo form

I am trying to submit a wufoo form via AJAX. I am using jQuery $.post to achieve this and am getting a 500 (Internal Server Error) returned back from the php script. The javascript code is:
$('form#form20').submit(function(event){
event.preventDefault();
$.post('form_handler.php', $('form#form20').serialize(), function(response) {
console.log(response);
});
});
The php code from the form_handler.php file is:
<?php
if (count($_POST) > 0) {
$fieldErrors = initAPI($root);
}
$wufoo_query_vals = array(
'w_api_key' => 'xxxx-xxxx-xxxx-xxxx',
'w_form' => 'connect-with-us',
'1' => $_POST['Field1'],
'2' => $_POST['Field2'],
'3' => $_POST['Field3'],
'4' => $_POST['Field4'],
'5' => $_POST['Field5'],
'11' => $_POST['Field11'],
'14' => $_POST['Field14'],
'13' => $_POST['Field13'],
'8' => $_POST['Field8'],
'9' => $_POST['Field9']
);
foreach($wufoo_query_vals as $key => $value) {
$request .= $key.'='.urlencode($value).'&';
}
$request = substr($request, 0, -1);
$ch = curl_init("http://defineyouredge.wufoo.com/api/insert/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
$response = curl_exec($ch);
curl_close ($ch);
echo $response;
?>
I have removed the API key for obvious reasons, but I do have it correctly entered in the actual code. Also, I have not completed the functionality for handling the response. Currently, just logging the the response to the console for testing.
Thank you very much for your support!

Resources