Related
API code executes successfully without giving any errors however the voucher am trying to create doesn't get created in datto below is the response am getting ,the highlighted text is the voucher am trying to create what might be the cause of this because the input body am sending is as indicate in their documentation https://github.com/cloudtrax/docs/blob/master/api/vouchers.md#actions
this is the response and the request code any help will be highly appreciated
<?php
$key = 'xxxxxxxx';
$secret='xxxxxxx';
class Method
{
const GET = 0;
const POST = 1;
const PUT = 2;
const DELETE = 3;
public static function nameForEnumValue($value) {
switch($value) {
case 0: return "GET";
case 1: return "POST";
case 2: return "PUT";
case 3: return "DELETE";
}
}
};
function print_debug_info($method, $endpoint, $headers) {
print( "\n" );
print( "Method: " . Method::nameForEnumValue($method) . "\n");
print( "Endpoint: " . $endpoint . "\n" );
print_r($headers);
}
function build_headers($auth, $sign) {
$headers = array();
$headers[] = "Authorization: " . $auth;
$headers[] = "Signature: " . $sign;
$headers[] = "Content-Type: application/json";
$headers[] = "OpenMesh-API-Version: 1";
return $headers;
}
function invoke_curl($method, $endpoint, $headers, $json) {
$api_server = 'https://api.cloudtrax.com';
try {
// get a curl handle then go to town on it
$ch = curl_init($api_server . $endpoint);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($method == Method::DELETE)
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
elseif ($method == Method::PUT) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
}
else if ($method == Method::POST) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
}
$result = curl_exec($ch);
if ($result == FALSE) {
if (curl_errno($ch) == 0)
echo "#### NOTE ####: nil HTTP return: This API call appears to be broken" . "\n";
else
throw new Exception(curl_error($ch), curl_errno($ch));
}
else
echo "RESULT: \n" . $result . "\n";
echo "RESULT: \n" . $json . "\n";
}
catch(Exception $e) {
trigger_error( sprintf('Curl failed with error #%d: "%s"',
$e->getCode(), $e->getMessage()), E_USER_ERROR);
}
}
function call_api_server($method, $endpoint, $data) {
global $key, $secret;
$time = time();
$nonce = rand();
if ($method == Method::POST)
assert( '$data != NULL /* #### POST requires $data #### */');
elseif ($method == Method::GET || $method == Method::DELETE)
assert( '$data == NULL /* ### GET and DELETE take no $data ### */');
$path = $endpoint;
// if present, concatenate encoded json to $endpoint for Signature:
if ($data != NULL) {
$json = json_encode($data);
$path .= $json;
}
$authorization = "key=" . $key . ",timestamp=" . $time . ",nonce=" . $nonce;
$signature = hash_hmac('sha256', $authorization . $path . $body, $secret);
$headers = build_headers($authorization, $signature);
print_debug_info($method, $endpoint, $headers);
invoke_curl($method, $endpoint, $headers, $json);
}
$uniqueKey=strtoupper(substr(sha1(microtime()), rand(0, 6), 6));
$uniqueKey = implode("-", str_split($uniqueKey, 6));
echo($uniqueKey);
$data =array('desired_vouchers',[
'code'=>$uniqueKey,
//'code'=>0103,
'duration'=> 24,
'max_users'=> 4,
'up_limit'=> 20,
'down_limit'=> 40,
'comment'=> "Courtesy of API Test",
'purge_days'=> 5
] );
call_api_server(Method::POST, "/voucher/network/xxxxx",$data);
//call_api_server(Method::GET, "/dna-api/v1/login",Null);
//call_api_server(Method::GET, "/dna-api/doc#get--dna-api-v1-routers-{mac}",Null);
//call_api_server(Method::GET, "/dna-api/v1/users/xxxx/overview",Null);
?>
I am just trying to include a file in CakePhp but nothing helps me. I have placed that file inside the vendor folder.
Here's the path of that file:
vendor/paytm/PaytmChecksum.php
I tried to import it in my controller like below:
require_once(ROOT . DS . 'vendor' . DS . 'paytm' . DS . 'PaytmChecksum.php');
But it didn't work. So, I tried another method by including below two lines at top of the controller.
use Cake\Filesystem\File;
use Cake\Filesystem\Folder;
Then did this in the controller action:
$dir = new Folder(ROOT . DS . 'vendor' . DS . 'paytm' . DS . 'PaytmChecksum.php');
But nothing is working for me. I tried to place the folder in my current directory and then tried by including the file with require_once but that also not worked.
Can anyone please help with the same?
I also Faced a problem in paytm checksum.
So i had created a files in Component.
......\src\Controller\Component\PaytmChecksumComponent.php
And the code is.
<?php
namespace App\Controller\Component;
use Cake\Controller\Component;
define('PAYTM_ENVIRONMENT', 'TEST'); // PROD
define('PAYTM_MERCHANT_KEY', '*********************'); //Change this constant's value with Merchant key received from Paytm.
define('PAYTM_MERCHANT_MID', '*************'); //Change this constant's value with MID (Merchant ID) received from Paytm.
define('PAYTM_MERCHANT_WEBSITE', 'WEBSTAGING'); //Change this constant's value with Website name received from Paytm.
define('PAYTM_REFUND_URL', '');
class PaytmChecksumComponent extends Component
{
public $PAYTM_STATUS_QUERY_NEW_URL = 'https://securegw-stage.paytm.in/merchant-status/getTxnStatus';
public $PAYTM_TXN_URL = 'https://securegw-stage.paytm.in/theia/processTransaction';
public function initialize(array $config): void
{
if (PAYTM_ENVIRONMENT == 'PROD') {
$this->PAYTM_STATUS_QUERY_NEW_URL = 'https://securegw.paytm.in/merchant-status/getTxnStatus';
$this->PAYTM_TXN_URL = 'https://securegw.paytm.in/theia/processTransaction';
}
define('PAYTM_STATUS_QUERY_URL', $this->PAYTM_STATUS_QUERY_NEW_URL);
define('PAYTM_STATUS_QUERY_NEW_URL', $this->PAYTM_STATUS_QUERY_NEW_URL);
define('PAYTM_TXN_URL', $this->PAYTM_TXN_URL);
}
function encrypt_e($input, $ky)
{
$key = html_entity_decode($ky);
$iv = "####&&&&####$$$$";
$data = openssl_encrypt($input, "AES-128-CBC", $key, 0, $iv);
return $data;
}
function decrypt_e($crypt, $ky)
{
$key = html_entity_decode($ky);
$iv = "####&&&&####$$$$";
$data = openssl_decrypt($crypt, "AES-128-CBC", $key, 0, $iv);
return $data;
}
function generateSalt_e($length)
{
$random = "";
srand((float) microtime() * 1000000);
$data = "AbcDE123IJKLMN67QRSTUVWXYZ";
$data .= "aBCdefghijklmn123opq45rs67tuv89wxyz";
$data .= "0FGH45OP89";
for ($i = 0; $i < $length; $i++) {
$random .= substr($data, (rand() % (strlen($data))), 1);
}
return $random;
}
function checkString_e($value)
{
if ($value == 'null')
$value = '';
return $value;
}
function getChecksumFromArray($arrayList, $key, $sort = 1)
{
if ($sort != 0) {
ksort($arrayList);
}
$str = $this->getArray2Str($arrayList);
$salt = $this->generateSalt_e(4);
$finalString = $str . "|" . $salt;
$hash = hash("sha256", $finalString);
$hashString = $hash . $salt;
$checksum = $this->encrypt_e($hashString, $key);
return $checksum;
}
function getChecksumFromString($str, $key)
{
$salt = $this->generateSalt_e(4);
$finalString = $str . "|" . $salt;
$hash = hash("sha256", $finalString);
$hashString = $hash . $salt;
$checksum = $this->encrypt_e($hashString, $key);
return $checksum;
}
function verifychecksum_e($arrayList, $key, $checksumvalue)
{
$arrayList = $this->removeCheckSumParam($arrayList);
ksort($arrayList);
$str = $this->getArray2StrForVerify($arrayList);
$paytm_hash = $this->decrypt_e($checksumvalue, $key);
$salt = substr($paytm_hash, -4);
$finalString = $str . "|" . $salt;
$website_hash = hash("sha256", $finalString);
$website_hash .= $salt;
$validFlag = "FALSE";
if ($website_hash == $paytm_hash) {
$validFlag = "TRUE";
} else {
$validFlag = "FALSE";
}
return $validFlag;
}
function verifychecksum_eFromStr($str, $key, $checksumvalue)
{
$paytm_hash = $this->decrypt_e($checksumvalue, $key);
$salt = substr($paytm_hash, -4);
$finalString = $str . "|" . $salt;
$website_hash = hash("sha256", $finalString);
$website_hash .= $salt;
$validFlag = "FALSE";
if ($website_hash == $paytm_hash) {
$validFlag = "TRUE";
} else {
$validFlag = "FALSE";
}
return $validFlag;
}
function getArray2Str($arrayList)
{
$findme = 'REFUND';
$findmepipe = '|';
$paramStr = "";
$flag = 1;
foreach ($arrayList as $key => $value) {
$pos = strpos($value, $findme);
$pospipe = strpos($value, $findmepipe);
if ($pos !== false || $pospipe !== false) {
continue;
}
if ($flag) {
$paramStr .= $this->checkString_e($value);
$flag = 0;
} else {
$paramStr .= "|" . $this->checkString_e($value);
}
}
return $paramStr;
}
function getArray2StrForVerify($arrayList)
{
$paramStr = "";
$flag = 1;
foreach ($arrayList as $key => $value) {
if ($flag) {
$paramStr .= $this->checkString_e($value);
$flag = 0;
} else {
$paramStr .= "|" . $this->checkString_e($value);
}
}
return $paramStr;
}
function redirect2PG($paramList, $key)
{
$hashString = $this->getchecksumFromArray($paramList, $key);
$checksum = $this->encrypt_e($hashString, $key);
}
function removeCheckSumParam($arrayList)
{
if (isset($arrayList["CHECKSUMHASH"])) {
unset($arrayList["CHECKSUMHASH"]);
}
return $arrayList;
}
function getTxnStatus($requestParamList)
{
return $this->callAPI(PAYTM_STATUS_QUERY_URL, $requestParamList);
}
function getTxnStatusNew($requestParamList)
{
return $this->callNewAPI(PAYTM_STATUS_QUERY_NEW_URL, $requestParamList);
}
function initiateTxnRefund($requestParamList)
{
$CHECKSUM = $this->getRefundChecksumFromArray($requestParamList, PAYTM_MERCHANT_KEY, 0);
$requestParamList["CHECKSUM"] = $CHECKSUM;
return $this->callAPI(PAYTM_REFUND_URL, $requestParamList);
}
function callAPI($apiURL, $requestParamList)
{
$jsonResponse = "";
$responseParamList = array();
$JsonData = json_encode($requestParamList);
$postData = 'JsonData=' . urlencode($JsonData);
$ch = curl_init($apiURL);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($postData)
));
$jsonResponse = curl_exec($ch);
$responseParamList = json_decode($jsonResponse, true);
return $responseParamList;
}
function callNewAPI($apiURL, $requestParamList)
{
$jsonResponse = "";
$responseParamList = array();
$JsonData = json_encode($requestParamList);
$postData = 'JsonData=' . urlencode($JsonData);
$ch = curl_init($apiURL);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($postData)
));
$jsonResponse = curl_exec($ch);
$responseParamList = json_decode($jsonResponse, true);
return $responseParamList;
}
function getRefundChecksumFromArray($arrayList, $key, $sort = 1)
{
if ($sort != 0) {
ksort($arrayList);
}
$str = $this->getRefundArray2Str($arrayList);
$salt = $this->generateSalt_e(4);
$finalString = $str . "|" . $salt;
$hash = hash("sha256", $finalString);
$hashString = $hash . $salt;
$checksum = $this->encrypt_e($hashString, $key);
return $checksum;
}
function getRefundArray2Str($arrayList)
{
$findmepipe = '|';
$paramStr = "";
$flag = 1;
foreach ($arrayList as $key => $value) {
$pospipe = strpos($value, $findmepipe);
if ($pospipe !== false) {
continue;
}
if ($flag) {
$paramStr .= $this->checkString_e($value);
$flag = 0;
} else {
$paramStr .= "|" . $this->checkString_e($value);
}
}
return $paramStr;
}
function callRefundAPI($refundApiURL, $requestParamList)
{
$jsonResponse = "";
$responseParamList = array();
$JsonData = json_encode($requestParamList);
$postData = 'JsonData=' . urlencode($JsonData);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $refundApiURL);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$jsonResponse = curl_exec($ch);
$responseParamList = json_decode($jsonResponse, true);
return $responseParamList;
}
}
To load component in controller
public function initialize(): void
{
parent::initialize();
//....................................
$this->loadComponent('PaytmChecksum');
//........................
}
// .............
function payment(){
//...$paytmParams = array(
"MID" => "*****",
"WEBSITE" => "DEFAULT",
"INDUSTRY_TYPE_ID" => "1",
"CHANNEL_ID" => "WEB",
"ORDER_ID" => "*************",
"CUST_ID" => "*****",
"MOBILE_NO" => "*****",
"EMAIL" => "*******",
"TXN_AMOUNT" => (float)100,
/* on completion of transaction, we will send you the response on this URL */
"CALLBACK_URL" => "https://******",
);
$checksum = $this->PaytmChecksum->getChecksumFromArray($paytmParams, "_#C%&uL");
pr($checksum);
}
I have an API function written in php and want to convert to bash script, in shell to run in some simple environment. Is there any tool for that or have to code manually?
Could anyone assist? Thank you and your help will be highly appreciated.
<?php
$accessKey = 'xxxx';
$secretKey = 'xxxx';
$baseUri = 'http://xxx:9989/';
$yl = new YLOpenApi($accessKey, $secretKey, $baseUri);
$regionAllUri = "api/open/v1/manager/region/getAll";
var_dump($yl->get($regionAllUri));
$deviceEditUri = "api/open/v1/manager/device/getEdit";
//var_dump($yl->get($deviceEditUri,["id"=>"1213"]));
$deviceListUri = "api/open/v1/manager/device/getList";
$postDeviceListData = [
"limit" => 20
];
//var_dump($yl->post($deviceListUri, json_encode($postDeviceListData)));
$file = new CURLFile("F:\\000000000079-all.cfg");
$addGroupConfigUri = "api/open/v1/manager/groupConfig/add";
$addGroupData = [
'file'=>$file,
'name'=>'open api test'
];
//var_dump($yl->form($addGroupConfigUri,$addGroupData));
class YLOpenApi
{
const LF = "\n";
const GET = "GET";
const POST = "POST";
const CONTENT_TYPE_JSON = "Content-Type: application/json";
private $accessKey;
private $secretKey;
private $baseUri;
public function __construct($accessKey, $secretKey, $baseUri)
{
$this->secretKey = $secretKey;
$this->accessKey = $accessKey;
$this->baseUri = $baseUri;
}
public function get($uri, $query = [])
{
return $this->doRequest(self::GET, $uri, $query);
}
public function post($uri, $body = false)
{
return $this->doRequest(self::POST, $uri, [], $body, [self::CONTENT_TYPE_JSON]);
}
public function form($uri, $body = false)
{
return $this->doRequest(self::POST, $uri, [], $body);
}
private function doRequest($method, $uri, $query = [], $body = false, $headers = false)
{
list($signHeader, $queryParams) = $this->sign($method, $uri, $query, $body,!$headers);
$ch = curl_init();
$url = $this->getUrl($uri, $queryParams);
curl_setopt($ch, CURLOPT_URL, $url);
if ($method != self::GET) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$convertHeader = $this->convertCurlHeader($signHeader);
curl_setopt($ch, CURLOPT_HTTPHEADER, $convertHeader);
if ($method != self::GET && $body) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
if ($headers) {
curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge($convertHeader, $headers));
}
}
var_dump($signHeader);
if ($j = curl_exec($ch)) {
return json_decode($j);
} else {
return false;
}
}
private function sign($method, $uri, $query = [], $body = false,$form = false)
{
$systemHeader['X-Ca-Key'] = $this->accessKey;
$systemHeader['X-Ca-Nonce'] = sha1(uniqid('yl'));
$systemHeader['X-Ca-Timestamp'] = intval(microtime(true) * 1000);
if ($body && !$form) {
$systemHeader['Content-MD5'] = base64_encode(md5($body, true));
}
ksort($systemHeader);
$qs = null;
if ($query) {
ksort($query);
$qs = http_build_query($query);
}
// build string to sign
$toSign = $method;
foreach ($systemHeader as $k => $v) {
$toSign .= self::LF . $k . ':' . $v;
}
$toSign .= self::LF . $uri;
if (isset($qs)) {
$toSign .= self::LF . $qs;
}
$systemHeader['X-Ca-Signature'] = base64_encode(hash_hmac('sha256', trim($toSign), $this->secretKey, true));
return [$systemHeader, $qs];
}
private function getUrl($uri, $params)
{
return isset($params) ? $this->baseUri . $uri . '?' . $params : $this->baseUri . $uri;
}
public function convertCurlHeader($arr)
{
$header = [];
$i = 0;
foreach ($arr as $key => $val) {
$header[$i++] = $key . ": " . $val;
}
return $header;
}
}
Alternative solution: You can execute a php script directly from a shell.
1: Add a shebang:
#!/usr/bin/env php
<?php
....
2: make the php script executable
chmod a+x ./path/to/my.php
3: run the script
./path/to/my.php
# or
./path/to/my.php options_and_params
Facebook integration has been working perfectly on my site for some time, then overnight something happened at facebook because it's now failing.
Can someone have a look at the code I use all over my site and advise what I should do to get this working again as soon as possible, without having to remodel the whole implementation?
<?php
// http://developers.facebook.com/docs/reference/fql/user
class Facebook_class
{
var $cookie;
function Facebook_class() {
$this->cookie = $this->get_facebook_cookie(FACEBOOK_APP_ID, FACEBOOK_SECRET);
}
function getUserid() {
$cookie = $this->getCookie();
$fb_userid = $cookie['uid'];
return $fb_userid;
}
function getProfilePicture() {
$url = 'https://graph.facebook.com/'.$this->getUserid().'/picture?type=large';
//$url = 'api.facebook.com/method/fql.query?query=SELECT pic_big FROM user WHERE uid = '.$this->getUserid();
$url = $this->get_redirect_url($url);
return $url;
}
function getUserData() {
if($this->getCookie()) {
$url = 'https://graph.facebook.com/me?access_token='.$this->getAccessToken();
$userData = json_decode(file_get_contents($url));
return $userData;
}
}
function getCookie() {
return $this->cookie;
}
function getAccessToken() {
return $this->cookie['access_token'];
}
function loadJsSDK($path_to_library='') {
echo '<script type="text/javascript">
//<![CDATA[ ';
?>
function logoutFacebookUser(){FB.logout(function(response){window.location.reload();});}
function fbActionConnect(){FB.login(function(response){if (response.session){window.location = "http://www.mysite.com/signin/fbconnect";if(response.perms){}else{}}else{}}, {perms:'publish_stream,email'});}
function fbAppActionConnect(){FB.login(function(response){if (response.session){window.location = "http://www.mysite.com/signin/fbappconnect";if(response.perms){}else{}}else{}}, {perms:'publish_stream,email'});}
function fbLinkActionConnect(){FB.login(function(response){if (response.session){window.location = "http://www.mysite.com/index.php?name=signin&file=MyServices&op=linkacc";if(response.perms){}else {}}else{}},{perms:'publish_stream,email'});}
function fbActionCartConnect(id, sport) {FB.login(function(response){if(response.session){window.location = "//index.php?name=signin&file=cart&id=" + id + "&sport=" + sport + "&op=fbsignup";if (response.perms){}else{}}else{}},{perms:'publish_stream,email'});}
window.fbAsyncInit = function() {FB.init({appId: xxxxxxxxxxxxxxxxx, channelUrl:'http://www.mysite.com/channel.html', status: true, cookie: true, xfbml: true});};(function() {var e = document.createElement('script'); e.async = true;e.src = document.location.protocol +'//connect.facebook.net/en_US/all.js';document.getElementById('fb-root').appendChild(e);}());//]]></script>
<?php
}
function get_facebook_cookie($app_id, $application_secret) {
$args = array();
parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
ksort($args);
$payload = '';
foreach ($args as $key => $value) {
if ($key != 'sig') {
$payload .= $key . '=' . $value;
}
}
if (md5($payload . $application_secret) != $args['sig']) {
return null;
}
return $args;
}
function get_redirect_url($url) {
$redirect_url = null;
$url_parts = #parse_url($url);
if (!$url_parts) return false;
if (!isset($url_parts['host'])) return false; //can't process relative URLs
if (!isset($url_parts['path'])) $url_parts['path'] = '/';
$sock = fsockopen($url_parts['host'], (isset($url_parts['port']) ? (int)$url_parts['port'] : 80), $errno, $errstr, 30);
if (!$sock) return false;
$request = "HEAD " . $url_parts['path'] . (isset($url_parts['query']) ? '?'.$url_parts['query'] : '') . " HTTP/1.1\r\n";
$request .= 'Host: ' . $url_parts['host'] . "\r\n";
$request .= "Connection: Close\r\n\r\n";
fwrite($sock, $request);
$response = '';
while(!feof($sock)) $response .= fread($sock, 8192);
fclose($sock);
if (preg_match('/^Location: (.+?)$/m', $response, $matches)){
if ( substr($matches[1], 0, 1) == "/" )
return $url_parts['scheme'] . "://" . $url_parts['host'] . trim($matches[1]);
else
return trim($matches[1]);
} else {
return false;
}
}
function getFacebookFriends($criteria='') {
$name = $criteria['name'];
if($name=='') $name = 'me';
$url = 'https://graph.facebook.com/'.$name.'/friends?access_token='.$this->getAccessToken();
$content = #file_get_contents($url,0,null,null);
$content = json_decode($content,true);
$users = $this->formatFacebookUsers($content);
return $users;
}
function formatFacebookUsers($content) {
for($i=0; $i<count($content['data']); $i++) {
$id = $content['data'][$i]['id'];
$name = $content['data'][$i]['name'];
$picture = 'https://graph.facebook.com/'.$id.'/picture?type=square'; //square, small, large
$url = 'http://www.facebook.com/profile.php?id='.$id;
$users[$i]['id'] = $id;
$users[$i]['name'] = $name;
$users[$i]['picture'] = $picture;
$users[$i]['url'] = $url;
}
return $users;
}
function getFacebookAccounts() {
$url = 'https://graph.facebook.com/me/accounts?access_token='.$this->getAccessToken();
$content = #file_get_contents($url,0,null,null);
$content = json_decode($content,true);
return $content;
}
function displayUsersIcons($criteria) {
$users = $criteria['users'];
$nb_display = $criteria['nb_display'];
$width = $criteria['width'];
if($width=='') $width="30";
if($nb_display>count($users) || $nb_display=='') $nb_display=count($users); //display value never bigger than nb users
$display = '';
for($i=0;$i<$nb_display;$i++) {
$name = $users[$i]['name'];
$picture = $users[$i]['picture'];
$url = $users[$i]['url'];
$display .= '<a href="'.$url.'" target="_blank" title="'.$name.'">';
$display .= '<img src="'.$picture.'" width="'.$width.'" style="padding:2px;">';
$display .= '</a>';
}
return $display;
}
function getFacebookFeeds() {
$url = 'https://graph.facebook.com/me/posts?access_token='.$this->getAccessToken();
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$data = curl_exec($ch);
curl_close($ch);
$data = json_decode($data,true);
$dataList = $this->formatFacebookPosts($data);
return $dataList;
}
function formatFacebookPosts($data) {
$i=0;
foreach($data['data'] as $value) {
$id = $value['id'];
$from_id = $value['from']['id'];
$from_name = $value['from']['name'];
$type = $value['type']; //video, link, status, picture, swf
$message = $value['message'];
$picture = $value['picture'];
$link = $value['link'];
$source = $value['source']; //for videos
$name = $value['name']; //for videos or links
$caption = $value['caption']; //for videos (domain name url) or links
$description = $value['description']; //for videos
$icon = $value['icon'];
$created = $value['created_time'];
$likes_nb = $value['likes'];
$comments = $value['comments']['data']; //(message, created_time)
$comments_nb = $value['comments']['count'];
$action_comment = $value['actions'][0]['link'];
$picture_url = 'https://graph.facebook.com/'.$from_id.'/picture';
$profile_url = 'http://www.facebook.com/profile.php?id='.$from_id;
$attribution = $value['attribution'];
if($type=='status') {
$dataList[$i]['id'] = $id;
$dataList[$i]['from_id'] = $from_id;
$dataList[$i]['from_name'] = $from_name;
$dataList[$i]['type'] = $type;
$dataList[$i]['message'] = $message;
$dataList[$i]['picture'] = $picture;
$dataList[$i]['link'] = $link;
$dataList[$i]['source'] = $source;
$dataList[$i]['name'] = $name;
$dataList[$i]['caption'] = $caption;
$dataList[$i]['description'] = $description;
$dataList[$i]['icon'] = $icon;
$dataList[$i]['created'] = $created;
$dataList[$i]['attribution'] = $attribution;
$dataList[$i]['likes_nb'] = $likes_nb;
$dataList[$i]['comments'] = $comments;
$dataList[$i]['comments_nb'] = $comments_nb;
$dataList[$i]['action_comment'] = $action_comment;
$dataList[$i]['picture_url'] = $picture_url;
$dataList[$i]['profile_url'] = $profile_url;
$i++;
}
}
return $dataList;
}
function updateFacebookStatus($status) {
$postParms = "access_token=".$this->getAccessToken()."&message=".$status;
$ch = curl_init('https://graph.facebook.com/me/feed');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postParms);
$results = curl_exec($ch);
curl_close($ch);
}
function postmsg() {
$FILE_PATH = $_SERVER["DOCUMENT_ROOT"]."images/default/webedition1.jpg";
$token=$this->getAccessToken();
if (file_exists($FILE_PATH)) {
$args = array('message' => 'From the coaches locker');
$args['image'] = '#' . realpath($FILE_PATH);
$arr_attachment = array('image' => '#'.realpath($FILE_PATH),
'message' => 'Test caption'
);
$_curl = curl_init();
curl_setopt($_curl, CURLOPT_URL, "https://graph.facebook.com/me/photos?access_token=".$token);
curl_setopt($_curl, CURLOPT_HEADER, false);
curl_setopt($_curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($_curl, CURLOPT_POST, true);
curl_setopt($_curl, CURLOPT_POSTFIELDS, $arr_attachment);
curl_setopt($_curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($_curl, CURLOPT_SSL_VERIFYPEER, 0);
$_photo = curl_exec($_curl);
echo($_photo);
} else {
echo "cannot find file:".$FILE_PATH;
}
}
}
?>
Thanks.
Facebook introduced some breaking changes for OAuth2 authentication to the JavaScript SDK yesterday: http://developers.facebook.com/blog/post/614/
More details: http://developers.facebook.com/blog/post/525/
Basically some changes I've seen were:
FB.getSession() now changed to FB.getAuthResponse()
FB.init() now has the 'oath' value as always 'true'.
'perms' is now changed to 'scope' in the login button html
Possibly FB.Event.subscribe('auth.sessionChange'..) is now FB.Event.subscribe('auth.authResponseChange'..)
Hope that helps.
I am trying to integrate the LinkedIn API to a website so that any of the update can be posted to the website. I am using the LinkedIn API and OAuth API to get the desired functionality.
But when I tried to make it work out with my API key and the secret key, it is not returning the request token. What could be the problem with that?
I am attaching the files with this post.
Linkedin.php
<?php
require_once("OAuth.php");
class LinkedIn {
public $base_url = "http://api.linkedin.com";
public $secure_base_url = "https://api.linkedin.com";
public $oauth_callback = "oob";
public $consumer;
public $request_token;
public $access_token;
public $oauth_verifier;
public $signature_method;
public $request_token_path;
public $access_token_path;
public $authorize_path;
public $debug = false;
function __construct($consumer_key, $consumer_secret, $oauth_callback = NULL) {
if($oauth_callback) {
$this->oauth_callback = $oauth_callback;
}
$this->consumer = new OAuthConsumer($consumer_key, $consumer_secret, $this->oauth_callback);
$this->signature_method = new OAuthSignatureMethod_HMAC_SHA1();
$this->request_token_path = $this->secure_base_url . "/uas/oauth/requestToken";
$this->access_token_path = $this->secure_base_url . "/uas/oauth/accessToken";
$this->authorize_path = $this->secure_base_url . "/uas/oauth/authorize";
}
function getRequestToken() {
$consumer = $this->consumer;
$request = OAuthRequest::from_consumer_and_token($consumer, NULL, "GET", $this->request_token_path);
$request->set_parameter("oauth_callback", $this->oauth_callback);
$request->sign_request($this->signature_method, $consumer, NULL);
$headers = Array();
$url = $request->to_url();
$response = $this->httpRequest($url, $headers, "GET");
parse_str($response, $response_params);
$this->request_token = new OAuthConsumer($response_params['oauth_token'], $response_params['oauth_token_secret'], 1);
}
function generateAuthorizeUrl() {
$consumer = $this->consumer;
$request_token = $this->request_token;
return $this->authorize_path . "?oauth_token=" . $request_token->key;
}
function getAccessToken($oauth_verifier) {
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->request_token, "GET", $this->access_token_path);
$request->set_parameter("oauth_verifier", $oauth_verifier);
$request->sign_request($this->signature_method, $this->consumer, $this->request_token);
$headers = Array();
$url = $request->to_url();
$response = $this->httpRequest($url, $headers, "GET");
parse_str($response, $response_params);
if($debug) {
echo $response . "\n";
}
$this->access_token = new OAuthConsumer($response_params['oauth_token'], $response_params['oauth_token_secret'], 1);
}
function getProfile($resource = "~") {
$profile_url = $this->base_url . "/v1/people/" . $resource;
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "GET", $profile_url);
$request->sign_request($this->signature_method, $this->consumer, $this->access_token);
$auth_header = $request->to_header("https://api.linkedin.com");
if ($debug) {
echo $auth_header;
}
// $response will now hold the XML document
$response = $this->httpRequest($profile_url, $auth_header, "GET");
return $response;
}
function setStatus($status) {
$status_url = $this->base_url . "/v1/people/~/current-status";
echo "Setting status...\n";
$xml = "<current-status>" . htmlspecialchars($status, ENT_NOQUOTES, "UTF-8") . "</current-status>";
echo $xml . "\n";
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "PUT", $status_url);
$request->sign_request($this->signature_method, $this->consumer, $this->access_token);
$auth_header = $request->to_header("https://api.linkedin.com");
if ($debug) {
echo $auth_header . "\n";
}
$response = $this->httpRequest($profile_url, $auth_header, "GET");
return $response;
}
function search($parameters) {
$search_url = $this->base_url . "/v1/people/" . $parameters;
echo "Performing search for: " . $parameters . "\n";
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "GET", $search_url);
$request->sign_request($this->signature_method, $this->consumer, $this->access_token);
$auth_header = $request->to_header("https://api.linkedin.com");
if ($debug) {
echo $request->get_signature_base_string() . "\n";
echo $auth_header . "\n";
}
$response = $this->httpRequest($search_url, $auth_header, "GET");
return $response;
}
function httpRequest($url, $auth_header, $method, $body = NULL) {
if (!$method) {
$method = "GET";
};
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header)); // Set the headers.
if ($body) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header, "Content-Type: text/xml;charset=utf-8"));
}
$data = curl_exec($curl);
if ($this->debug) {
echo $data . "\n";
}
curl_close($curl);
return $data;
}
}
And the oAuth.php:
class OAuthConsumer {
public $key;
public $secret;
function __construct($key, $secret, $callback_url=NULL) {
$this->key = $key;
$this->secret = $secret;
$this->callback_url = $callback_url;
}
function __toString() {
return "OAuthConsumer[key=$this->key,secret=$this->secret]";
}
}
class OAuthToken {
// access tokens and request tokens
public $key;
public $secret;
function __construct($key, $secret) {
$this->key = $key;
$this->secret = $secret;
}
function to_string() {
return "oauth_token=" .
OAuthUtil::urlencode_rfc3986($this->key) .
"&oauth_token_secret=" .
OAuthUtil::urlencode_rfc3986($this->secret);
}
function __toString() {
return $this->to_string();
}
}
abstract class OAuthSignatureMethod {
abstract public function get_name();
abstract public function build_signature($request, $consumer, $token);
public function check_signature($request, $consumer, $token, $signature) {
$built = $this->build_signature($request, $consumer, $token);
return $built == $signature;
}
}
class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
function get_name() {
return "HMAC-SHA1";
}
public function build_signature($request, $consumer, $token) {
$base_string = $request->get_signature_base_string();
$request->base_string = $base_string;
$key_parts = array(
$consumer->secret,
($token) ? $token->secret : ""
);
$key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
$key = implode('&', $key_parts);
return base64_encode(hash_hmac('sha1', $base_string, $key, true));
}
}
class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
public function get_name() {
return "PLAINTEXT";
}
public function build_signature($request, $consumer, $token) {
$key_parts = array($consumer->secret,($token) ? $token->secret : "");
$key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
$key = implode('&', $key_parts);
$request->base_string = $key;
return $key;
}
}
abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
public function get_name() { return "RSA-SHA1";}
protected abstract function fetch_public_cert(&$request);
public function build_signature($request, $consumer, $token) {
$base_string = $request->get_signature_base_string();
$request->base_string = $base_string;
$cert = $this->fetch_private_cert($request);
$privatekeyid = openssl_get_privatekey($cert);
$ok = openssl_sign($base_string, $signature, $privatekeyid);
openssl_free_key($privatekeyid);
return base64_encode($signature);
}
public function check_signature($request, $consumer, $token, $signature) {
$decoded_sig = base64_decode($signature);
$base_string = $request->get_signature_base_string();
$cert = $this->fetch_public_cert($request);
$publickeyid = openssl_get_publickey($cert);
$ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
openssl_free_key($publickeyid);
return $ok == 1;
}
}
class OAuthRequest {
private $parameters;
private $http_method;
private $http_url;
// for debug purposes
public $base_string;
public static $version = '1.0';
public static $POST_INPUT = 'php://input';
function __construct($http_method, $http_url, $parameters=NULL) {
#$parameters or $parameters = array();
$parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);
$this->parameters = $parameters;
$this->http_method = $http_method;
$this->http_url = $http_url;
}
public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
? 'http'
: 'https';
#$http_url or $http_url = $scheme .
'://' . $_SERVER['HTTP_HOST'] .
':' .
$_SERVER['SERVER_PORT'] .
$_SERVER['REQUEST_URI'];
#$http_method or $http_method = $_SERVER['REQUEST_METHOD'];
if (!$parameters) {
$request_headers = OAuthUtil::get_headers();
$parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
if ($http_method == "POST"
&& #strstr($request_headers["Content-Type"],
"application/x-www-form-urlencoded")
) {
$post_data = OAuthUtil::parse_parameters(
file_get_contents(self::$POST_INPUT)
);
$parameters = array_merge($parameters, $post_data);
}
if (#substr($request_headers['Authorization'], 0, 6) == "OAuth ") {
$header_parameters = OAuthUtil::split_header(
$request_headers['Authorization']
);
$parameters = array_merge($parameters, $header_parameters);
}
}
return new OAuthRequest($http_method, $http_url, $parameters);
}
public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
#$parameters or $parameters = array();
$defaults = array("oauth_version" => OAuthRequest::$version,
//"oauth_nonce" => OAuthRequest::generate_nonce(),
"oauth_timestamp" => OAuthRequest::generate_timestamp(),
"oauth_consumer_key" => $consumer->key);
if ($token)
$defaults['oauth_token'] = $token->key;
$parameters = array_merge($defaults, $parameters);
return new OAuthRequest($http_method, $http_url, $parameters);
}
public function set_parameter($name, $value, $allow_duplicates = true) {
if ($allow_duplicates && isset($this->parameters[$name])) {
if (is_scalar($this->parameters[$name])) {
$this->parameters[$name] = array($this->parameters[$name]);
}
$this->parameters[$name][] = $value;
} else {
$this->parameters[$name] = $value;
}
}
public function get_parameter($name) {
return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
}
public function get_parameters() {
return $this->parameters;
}
public function unset_parameter($name) {
unset($this->parameters[$name]);
}
public function get_signable_parameters() {
$params = $this->parameters;
if (isset($params['oauth_signature'])) {
unset($params['oauth_signature']);
}
return OAuthUtil::build_http_query($params);
}
public function get_signature_base_string() {
$parts = array(
$this->get_normalized_http_method(),
$this->get_normalized_http_url(),
$this->get_signable_parameters()
);
$parts = OAuthUtil::urlencode_rfc3986($parts);
return implode('&', $parts);
}
public function get_normalized_http_method() {
return strtoupper($this->http_method);
}
public function get_normalized_http_url() {
$parts = parse_url($this->http_url);
$port = #$parts['port'];
$scheme = $parts['scheme'];
$host = $parts['host'];
$path = #$parts['path'];
$port or $port = ($scheme == 'https') ? '443' : '80';
if (($scheme == 'https' && $port != '443')
|| ($scheme == 'http' && $port != '80')) {
$host = "$host:$port";
}
return "$scheme://$host$path";
}
public function to_url() {
$post_data = $this->to_postdata();
$out = $this->get_normalized_http_url();
if ($post_data) {
$out .= '?'.$post_data;
}
return $out;
}
public function to_postdata() {
return OAuthUtil::build_http_query($this->parameters);
}
public function to_header($realm=null) {
if($realm)
$out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';
else
$out = 'Authorization: OAuth';
$total = array();
foreach ($this->parameters as $k => $v) {
if (substr($k, 0, 5) != "oauth") continue;
if (is_array($v)) {
throw new OAuthException('Arrays not supported in headers');
}
$out .= ',' .
OAuthUtil::urlencode_rfc3986($k) .
'="' .
OAuthUtil::urlencode_rfc3986($v) .
'"';
}
return $out;
}
public function __toString() {
return $this->to_url();
}
public function sign_request($signature_method, $consumer, $token) {
$this->set_parameter(
"oauth_signature_method",
$signature_method->get_name(),
false
);
$signature = $this->build_signature($signature_method, $consumer, $token);
$this->set_parameter("oauth_signature", $signature, false);
}
public function build_signature($signature_method, $consumer, $token) {
$signature = $signature_method->build_signature($this, $consumer, $token);
return $signature;
}
private static function generate_timestamp() {
return time();
}
private static function generate_nonce() {
$mt = microtime();
$rand = mt_rand();
return md5($mt . $rand); // md5s look nicer than numbers
}
}
class OAuthServer {
protected $timestamp_threshold = 300; // in seconds, five minutes
protected $version = '1.0'; // hi blaine
protected $signature_methods = array();
protected $data_store;
function __construct($data_store) {
$this->data_store = $data_store;
}
public function add_signature_method($signature_method) {
$this->signature_methods[$signature_method->get_name()] =
$signature_method;
}
public function fetch_request_token(&$request) {
$this->get_version($request);
$consumer = $this->get_consumer($request);
$token = NULL;
$this->check_signature($request, $consumer, $token);
$callback = $request->get_parameter('oauth_callback');
$new_token = $this->data_store->new_request_token($consumer, $callback);
return $new_token;
}
public function fetch_access_token(&$request) {
$this->get_version($request);
$consumer = $this->get_consumer($request);
// requires authorized request token
$token = $this->get_token($request, $consumer, "request");
$this->check_signature($request, $consumer, $token);
// Rev A change
$verifier = $request->get_parameter('oauth_verifier');
$new_token = $this->data_store->new_access_token($token, $consumer, $verifier);
return $new_token;
}
public function verify_request(&$request) {
$this->get_version($request);
$consumer = $this->get_consumer($request);
$token = $this->get_token($request, $consumer, "access");
$this->check_signature($request, $consumer, $token);
return array($consumer, $token);
}
private function get_version(&$request) {
$version = $request->get_parameter("oauth_version");
if (!$version) {
// Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.
// Chapter 7.0 ("Accessing Protected Ressources")
$version = '1.0';
}
if ($version !== $this->version) {
throw new OAuthException("OAuth version '$version' not supported");
}
return $version;
}
private function get_signature_method(&$request) {
$signature_method =
#$request->get_parameter("oauth_signature_method");
if (!$signature_method) {
// According to chapter 7 ("Accessing Protected Ressources") the signature-method
// parameter is required, and we can't just fallback to PLAINTEXT
throw new OAuthException('No signature method parameter. This parameter is required');
}
if (!in_array($signature_method,
array_keys($this->signature_methods))) {
throw new OAuthException(
"Signature method '$signature_method' not supported " .
"try one of the following: " .
implode(", ", array_keys($this->signature_methods))
);
}
return $this->signature_methods[$signature_method];
}
private function get_consumer(&$request) {
$consumer_key = #$request->get_parameter("oauth_consumer_key");
if (!$consumer_key) {
throw new OAuthException("Invalid consumer key");
}
$consumer = $this->data_store->lookup_consumer($consumer_key);
if (!$consumer) {
throw new OAuthException("Invalid consumer");
}
return $consumer;
}
private function get_token(&$request, $consumer, $token_type="access") {
$token_field = #$request->get_parameter('oauth_token');
$token = $this->data_store->lookup_token(
$consumer, $token_type, $token_field
);
if (!$token) {
throw new OAuthException("Invalid $token_type token: $token_field");
}
return $token;
}
private function check_signature(&$request, $consumer, $token) {
// this should probably be in a different method
$timestamp = #$request->get_parameter('oauth_timestamp');
$nonce = #$request->get_parameter('oauth_nonce');
$this->check_timestamp($timestamp);
$this->check_nonce($consumer, $token, $nonce, $timestamp);
$signature_method = $this->get_signature_method($request);
$signature = $request->get_parameter('oauth_signature');
$valid_sig = $signature_method->check_signature(
$request,
$consumer,
$token,
$signature
);
if (!$valid_sig) {
throw new OAuthException("Invalid signature");
}
}
private function check_timestamp($timestamp) {
if( ! $timestamp )
throw new OAuthException(
'Missing timestamp parameter. The parameter is required'
);
// verify that timestamp is recentish
$now = time();
if (abs($now - $timestamp) > $this->timestamp_threshold) {
throw new OAuthException(
"Expired timestamp, yours $timestamp, ours $now"
);
}
}
private function check_nonce($consumer, $token, $nonce, $timestamp) {
if( ! $nonce )
throw new OAuthException(
'Missing nonce parameter. The parameter is required'
);
// verify that the nonce is uniqueish
$found = $this->data_store->lookup_nonce(
$consumer,
$token,
$nonce,
$timestamp
);
if ($found) {
throw new OAuthException("Nonce already used: $nonce");
}
}
}
class OAuthDataStore {
function lookup_consumer($consumer_key) {
// implement me
}
function lookup_token($consumer, $token_type, $token) {
// implement me
}
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
// implement me
}
function new_request_token($consumer, $callback = null) {
// return a new token attached to this consumer
}
function new_access_token($token, $consumer, $verifier = null) {
}
}
class OAuthUtil {
public static function urlencode_rfc3986($input) {
if (is_array($input)) {
return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);
} else if (is_scalar($input)) {
return str_replace(
'+',
' ',
str_replace('%7E', '~', rawurlencode($input))
);
} else {
return '';
}
}
public static function urldecode_rfc3986($string) {
return urldecode($string);
}
public static function split_header($header, $only_allow_oauth_parameters = true) {
$pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/';
$offset = 0;
$params = array();
while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {
$match = $matches[0];
$header_name = $matches[2][0];
$header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0];
if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) {
$params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content);
}
$offset = $match[1] + strlen($match[0]);
}
if (isset($params['realm'])) {
unset($params['realm']);
}
return $params;
}
// helper to try to sort out headers for people who aren't running apache
public static function get_headers() {
if (function_exists('apache_request_headers')) {
// we need this to get the actual Authorization: header
// because apache tends to tell us it doesn't exist
$headers = apache_request_headers();
// sanitize the output of apache_request_headers because
// we always want the keys to be Cased-Like-This and arh()
// returns the headers in the same case as they are in the
// request
$out = array();
foreach( $headers AS $key => $value ) {
$key = str_replace(
" ",
"-",
ucwords(strtolower(str_replace("-", " ", $key)))
);
$out[$key] = $value;
}
} else {
// otherwise we don't have apache and are just going to have to hope
// that $_SERVER actually contains what we need
$out = array();
foreach ($_SERVER as $key => $value) {
if (substr($key, 0, 5) == "HTTP_") {
// this is chaos, basically it is just there to capitalize the first
// letter of every word that is not an initial HTTP and strip HTTP
// code from przemek
$key = str_replace(
" ",
"-",
ucwords(strtolower(str_replace("_", " ", substr($key, 5))))
);
$out[$key] = $value;
}
}
}
return $out;
}
// This function takes a input like a=b&a=c&d=e and returns the parsed
// parameters like this
// array('a' => array('b','c'), 'd' => 'e')
public static function parse_parameters( $input ) {
if (!isset($input) || !$input) return array();
$pairs = explode('&', $input);
$parsed_parameters = array();
foreach ($pairs as $pair) {
$split = explode('=', $pair, 2);
$parameter = OAuthUtil::urldecode_rfc3986($split[0]);
$value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';
if (isset($parsed_parameters[$parameter])) {
// We have already recieved parameter(s) with this name, so add to the list
// of parameters with this name
if (is_scalar($parsed_parameters[$parameter])) {
// This is the first duplicate, so transform scalar (string) into an array
// so we can add the duplicates
$parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);
}
$parsed_parameters[$parameter][] = $value;
} else {
$parsed_parameters[$parameter] = $value;
}
}
return $parsed_parameters;
}
public static function build_http_query($params) {
if (!$params) return '';
// Urlencode both keys and values
$keys = OAuthUtil::urlencode_rfc3986(array_keys($params));
$values = OAuthUtil::urlencode_rfc3986(array_values($params));
$params = array_combine($keys, $values);
// Parameters are sorted by name, using lexicographical byte value ordering.
// Ref: Spec: 9.1.1 (1)
uksort($params, 'strcmp');
$pairs = array();
foreach ($params as $parameter => $value) {
if (is_array($value)) {
// If two or more parameters share the same name, they are sorted by their value
// Ref: Spec: 9.1.1 (1)
natsort($value);
foreach ($value as $duplicate_value) {
$pairs[] = $parameter . '=' . $duplicate_value;
}
} else {
$pairs[] = $parameter . '=' . $value;
}
}
// For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
// Each name-value pair is separated by an '&' character (ASCII code 38)
return implode('&', $pairs);
}
}
?>
I am using the same LinkedIn class, and it worked the last time I checked in November. I tested again today and had the same issue.
To get detailed error information, try changing your httpRequest method to the following:
function httpRequest($url, $auth_header, $method, $body = NULL) {
if (!$method) {
$method = "GET";
};
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header)); // Set the headers.
if ($body) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header, "Content-Type: text/xml;charset=utf-8"));
}
$data = curl_exec($curl);
if ($this->debug) {
echo $data . "\n";
}
print_r(curl_getinfo($curl)); // get error info
echo "\n\ncURL error number:" .curl_errno($curl); // print error info
echo "\n\ncURL error:" . curl_error($curl);
curl_close($curl);
return $data;
}
I did this and saw that there is an SSL verification issue - I then fixed that by adding
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);.
This sorts out the SSL error message. However, I am now getting an HTTP error code 400.
I am not sure if this is the same on your side though...
For updating the status, change the function setStatus() to:
function setStatus($status) {
$status_url = $this->base_url . "/v1/people/~/current-status";
//echo "Setting status...\n";
$xml = "" . htmlspecialchars($status, ENT_NOQUOTES, "UTF-8") . "";
//echo $xml . "\n";
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "PUT", $status_url);
$request->sign_request($this->signature_method, $this->consumer, $this->access_token);
$auth_header = $request->to_header("https://api.linkedin.com");
if ($debug) {
echo $auth_header . "\n";
}
$response = $this->httpRequest($status_url, $auth_header, "PUT", $xml);
return $response;
}