Using Google authentication API with PHP - php

Instead of printing the userinfo, the following code is printing the details of the access token granted by Google. The code is very simple yet I am not able to figure out the exact cause of this
<?php
$url = 'https://accounts.google.com/o/oauth2/token';
$fields = array(
'code'=>urlencode($_GET['code']),
'client_id'=>urlencode('###########.apps.googleusercontent.com'),
'client_secret'=>urlencode('###########'),
'redirect_uri'=>urlencode('http://######odie.co.in/googlogin'),
'grant_type'=>urlencode('authorization_code'),
);
foreach($fields as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$data = json_decode($result);
print_r(file_get_contents(' https://www.googleapis.com/oauth2/v1/userinfo?access_token='.$data['access_token']));
?>

You need to add CURLOPT_RETURNTRANSFER, true to your curl_setopt.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

refer this. its very simple.
Simple PHP Library for Google Authentication API

Related

Using Curl in CodeIgniter : How to send data using post method

Not going to succeed when trying to send data using post method. Never used it before.
This is code of executing curl:
$url = LICENSE_URL."validate_system_key/validate_key/";
//url-ify the data for the POST
$data['system_key']='A8Z0-X1N7-S1V2-Y1I5';
$data['domain']='http://example.com';
$fields_string = '';
foreach($data as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($data));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10); # timeout after 10 seconds, you can increase it
//curl_setopt($ch,CURLOPT_HEADER,false);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); # Set curl to return the data instead of printing it to the browser.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$result=json_decode($result,TRUE);
And this is the Code On Client Url:
public function validate_key(){
$system_key=$_POST['system_key'];
$domain=$_POST['domain'];
$result['error']=3;
echo json_encode($result);
}
Note: When I am not using POST method (sending data through url) evrything is fine. Its all about POST method, not getting the mistake! Any kind of help will be appreciated! Thanks.
Use array instead of String in data passed to string like below:
foreach($data as $key=>$value) {
$data[$key] = $value;
}
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
I hope this will work.

PHP cURL Post Failing or no Data returning where did I go wrong?

Heres my bit o' php, tryin to figure out why I'm not getting a $result going to the URL it produces will give me a valid JSON result based on a get or post. So I think my problem is how I am using cURL. So I need someone take on this.
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($params));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
//execute post
$result = curl_exec($ch);
if(!$result)
{
$error = curl_error($ch); echo $error; return false;
}
//close connection
curl_close($ch);
//return json_decode($result);
echo $result;
EDITED CODE ABOVE From original Post
$error does not report anything. I changed the return json... to echo to see if that was doing anything and it printed out 'Disallowed Key Characters.' on the screen.
EDIT 2
$url = http://domain.com/search
$params = array('q'=>'search,term')
$params is put through a foreach loop which builds the $fields_string
$fields_string = '?';
foreach($params as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = substr($fields_string,0,-1);
fields_string looks like ?ll=37.2790669,-121.874722&range=10 in the end (for what I am doing currently, I have anywhere from 1-12 optional parameters that can be passed which is why I am building it the way I am.
Try adding error checking to make sure curl_exec is executing successfully and to get a meaningful error message back on the server.
something like:
$ch = curl_init();
//Make string url safe with urlencode
curl_setopt($ch,CURLOPT_URL,urlencode($url));
curl_setopt($ch,CURLOPT_POST,count($params));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(!$result) {
$error = curl_error();
//$error now contains the error thrown when curl_exec failed to execute
//echo this to terminal or to an error box in the browser?
}
curl_close($ch);
return json_decode($result);
Post your resulting error here if you still need help.
Also, here are the manual pages for the two functions I took advantage of:
http://www.php.net/manual/en/function.curl-error.php
http://www.php.net/manual/en/function.curl-exec.php
http://php.net/manual/en/function.urlencode.php
-Cheers
//set POST variables
$url = "http://example.com/edsym/registration.php"; // URL to calc.cgi
$fields = array(
'namee'=>urlencode($name),
'city'=>urlencode($city),
'phh'=>urlencode($ph),
'emaill'=>urlencode($email),
'msg1'=>urlencode("Message type")
);
$fields_string=" ";
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
I am using curl to post like this and its working

sagepay curl request

I want to process payments through my website and wanted to use sagepay for that purpose. I have gone through the guideline for sagepay go direct integration mentioned here:
http://www.sagepay.com/sites/default/files/pdf/user_guides/sagepaydirectprotocolandintegrationguidelines_0.pdf
Now,
I have created a script made necessary changes needed for the fields to process http request. here is the code:
<?php
//extract data from the post
extract($_POST);
//set POST variables
$url = 'https://live.sagepay.com/gateway/service/vspdirect-register.vsp';
$txcode = 'prefix_' . time() . rand(0, 9999);
$fields = array(
'VPSProtocol'=>urlencode("2.23"),
'TxType'=>urlencode("PAYMENT"),
'Vendor'=>urlencode("myvendorname"),
'VendorTxCode'=>urlencode($txcode),
'Amount'=>urlencode("2.00"),
'Currency'=>urlencode("GBP"),
'Description'=>urlencode("payment for my site"),
'CardHolder'=>urlencode('DELTA'),
'CardNumber'=>urlencode(4929000000006),
'ExpiryDate'=>urlencode(1213),
'CV2'=>urlencode(123),
'CardType'=>urlencode('VISA'),
'BillingSurname'=>urlencode('surname'),
'BillingFirstnames'=>urlencode('name'),
'BillingAddress1'=>urlencode(' clifton'),
'BillingCity'=>urlencode('Bristol'),
'BillingPostCode'=>urlencode('BS82UE'),
'BillingCountry'=>urlencode('United Kingdom'),
'DeliverySurname'=>urlencode('surname'),
'DeliveryFirstnames'=>urlencode('name'),
'DeliveryAddress1'=>urlencode(' clifton'),
'DeliveryCity'=>urlencode('Bristol'),
'DeliveryPostCode'=>urlencode('bs82ue'),
'DeliveryCountry'=>urlencode('united kingdom'),
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
//execute post
$result = curl_exec($ch);
print_r($result);
echo "end";
//close connection
curl_close($ch);
?>
But I am not getting any response back.. what could be the problem? Its in wamp server and non https url.
This code works for me. I added a few CURL functions and removed one and that did the trick.
<?php
//extract data from the post
extract($_POST);
//set POST variables
$url = 'https://live.sagepay.com/gateway/service/vspdirect-register.vsp';
$txcode = 'prefix_' . time() . rand(0, 9999);
$fields = array(
'VPSProtocol'=>urlencode("2.23"),
'TxType'=>urlencode("PAYMENT"),
'Vendor'=>urlencode("myvendorname"),
'VendorTxCode'=>urlencode($txcode),
'Amount'=>urlencode("2.00"),
'Currency'=>urlencode("GBP"),
'Description'=>urlencode("payment for my site"),
'CardHolder'=>urlencode('DELTA'),
'CardNumber'=>urlencode(4111111111111111),
'ExpiryDate'=>urlencode(1213),
'CV2'=>urlencode(123),
'CardType'=>urlencode('VISA'),
'BillingSurname'=>urlencode('surname'),
'BillingFirstnames'=>urlencode('name'),
'BillingAddress1'=>urlencode(' clifton'),
'BillingCity'=>urlencode('Bristol'),
'BillingPostCode'=>urlencode('BS82UE'),
'BillingCountry'=>urlencode('United Kingdom'),
'DeliverySurname'=>urlencode('surname'),
'DeliveryFirstnames'=>urlencode('name'),
'DeliveryAddress1'=>urlencode(' clifton'),
'DeliveryCity'=>urlencode('Bristol'),
'DeliveryPostCode'=>urlencode('bs82ue'),
'DeliveryCountry'=>urlencode('united kingdom'),
);
//url-ify the data for the POST
$fields_string = http_build_query($fields);
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
//execute post
$result = curl_exec($ch);
print_r($result);
echo "end";
//close connection
curl_close($ch);
?>
FYI, using http_build_query() is great for building query_strings.
$fields_string = http_build_query($fields);
This code will work if you add field
Crypt='Your encryption password in your account setting in sagepay test';
But it returns null string if you use curl to post and it will be redirected to
https://test.sagepay.com/gateway/service/cardselection?vpstxid={BDBF098F-9BB5-3822-8CAE-AC0645A2CC57}
if you use Http POST.
Goodluck

PHP Curl POST/SESSION/COOKIE Issue

I want to create a script that can login using POST info, then browses through afew pages, on the same time. (After logging in) So I need to keep the session/cookie thing...
I've tried afew things, the logging in (POST) works fine.
But when I try to execute a second url, (the first being the login page) I lose the session/cookie and it the webpage says i'm no longer logged in:
Where am I going wrong with my code?
$url = 'http://www.example.com/authenticate.php';
$url2 = 'http://www.example.com/twourl.php';
$player = 'myuser';
$password = 'mypass';
$fields = array(
'player'=>urlencode($player),
'password'=>urlencode($password),
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_HEADER, 0);
//execute post
curl_exec($ch);
curl_setopt($ch, CURLOPT_URL,$url2);
curl_setopt($ch, CURLOPT_HEADER, 0);
//execute two url
curl_exec($ch);
//close connection
curl_close($ch);
Why is it not keeping me logged in on the second url?
Check out http://www.php.net/manual/en/book.curl.php#97160 I don't see where you are trying to pass the session to the site.
EDIT: you can also check out http://www.phpbuilder.com/board/showthread.php?t=10346748

HowTo login with PHP (and Curl) into DirectAdmin

Hey guys, I am trying to create a script that will pull the log's from DirectAdmin so they can be parsed and submitted to a DB, the problem is the login of DirectAdmin.
I tried lots of script but I cant seem to get it to work...
Current script:
$url = 'http://213.247.000.000:2222/CMD_SHOW_LOG?domain=mydomain.com&type=log';
$username = 'xxx';
$password = 'xxx';
$fields = array(
'username'=>urlencode($username),
'password'=>urlencode($password)
);
$fields_string='';
foreach($fields as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string,'&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
$result = curl_exec($ch);
if($result===false) {
echo 'CURL ERROR: '.curl_error($ch);
}
curl_close($ch);
var_dump($result);
I've got it!
Made a little function out of it:
function getlog($ip,$username,$password,$domain) {
$url = 'http://'.$ip.':2222';
// set temp cookie
$ckfile = tempnam ("/tmp", "CURLCOOKIE");
// make list of POST fields
$fields = array(
'referer' =>urlencode('/'),
'username'=>urlencode($username),
'password'=>urlencode($password)
);
$fields_string='';
foreach($fields as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string,'&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_URL,$url.'/CMD_LOGIN');
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
$result = curl_exec($ch);
if($result===false) {
die('CURL ERROR: '.curl_error($ch));
} else {
curl_setopt($ch,CURLOPT_URL,$url.'/CMD_SHOW_LOG?domain='.$domain.'&type=log');
curl_setopt($ch,CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
if($result===false) {
die('CURL ERROR: '.curl_error($ch));
} else {
return $result;
}
}
}
You would probably better use the DirectAdmin PHP API class.
You need to use fiddler and firebug to figure out what is being sent when you login using your browser.
You then run your curl request through fiddler and make sure the exact same thing is posted.
You might need to set a refer, user-agent or cookies. You have too look at the request to tell what you need to send.
Web developer is a useful tool to disable cookies and javascript. See if you can login without cookies or javascript.
Use firebug will let you know if there are any ajax requests going on behind the scenes.
Blindly posting using curl will drive you insane.
You don't have to url-encode your username/password. Just pass the regular array to CURL, and it'll take care of the encoding.
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);

Categories