Related
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
I know this question has been asked multiple times, however looking through all the solutions, none of them have seemed to work for me.
I've been using the IPN Simulator on the PayPal website to integrate Subscriptions into my website, yet the IPN is always returning invalid.
I've tried multiple ways to get this working, but this is my current method:
<?php
class IpnListener {
public $use_curl = true;
public $force_ssl_v3 = false;
public $follow_location = false;
public $use_ssl = true;
public $use_sandbox = false;
public $timeout = 30;
private $post_data = array();
private $post_uri = '';
private $response_status = '';
private $response = '';
const PAYPAL_HOST = 'www.paypal.com';
const SANDBOX_HOST = 'www.sandbox.paypal.com';
protected function curlPost($encoded_data) {
if ($this->use_ssl) {
$uri = 'https://'.$this->getPaypalHost().'/cgi-bin/webscr';
$this->post_uri = $uri;
} else {
$uri = 'http://'.$this->getPaypalHost().'/cgi-bin/webscr';
$this->post_uri = $uri;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->follow_location);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
if ($this->force_ssl_v3) {
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
} else {
curl_setopt($ch, CURLOPT_SSLVERSION, 4);
}
$this->response = curl_exec($ch);
$this->response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
if ($this->response === false || $this->response_status == '0') {
$errno = curl_errno($ch);
$errstr = curl_error($ch);
throw new Exception("cURL error: [$errno] $errstr");
}
}
protected function fsockPost($encoded_data) {
if ($this->use_ssl) {
$uri = 'ssl://'.$this->getPaypalHost();
$port = '443';
$this->post_uri = $uri.'/cgi-bin/webscr';
} else {
$uri = $this->getPaypalHost(); // no "http://" in call to fsockopen()
$port = '80';
$this->post_uri = 'http://'.$uri.'/cgi-bin/webscr';
}
$fp = fsockopen($uri, $port, $errno, $errstr, $this->timeout);
if (!$fp) {
// fsockopen error
throw new Exception("fsockopen error: [$errno] $errstr");
}
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: ".$this->getPaypalHost()."\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($encoded_data)."\r\n";
$header .= "Connection: Close\r\n\r\n";
fputs($fp, $header.$encoded_data."\r\n\r\n");
while(!feof($fp)) {
if (empty($this->response)) {
// extract HTTP status from first line
$this->response .= $status = fgets($fp, 1024);
$this->response_status = trim(substr($status, 9, 4));
} else {
$this->response .= fgets($fp, 1024);
}
}
fclose($fp);
}
private function getPaypalHost() {
if ($this->use_sandbox) return self::SANDBOX_HOST;
else return self::PAYPAL_HOST;
}
public function getPostUri() {
return $this->post_uri;
}
public function getResponse() {
return $this->response;
}
public function getResponseStatus() {
return $this->response_status;
}
public function getTextReport() {
$r = '';
// date and POST url
for ($i=0; $i<80; $i++) { $r .= '-'; }
$r .= "\n[".date('m/d/Y g:i A').'] - '.$this->getPostUri();
if ($this->use_curl) $r .= " (curl)\n";
else $r .= " (fsockopen)\n";
// HTTP Response
for ($i=0; $i<80; $i++) { $r .= '-'; }
$r .= "\n{$this->getResponse()}\n";
// POST vars
for ($i=0; $i<80; $i++) { $r .= '-'; }
$r .= "\n";
foreach ($this->post_data as $key => $value) {
$r .= str_pad($key, 25)."$value\n";
}
$r .= "\n\n";
return $r;
}
public function processIpn($post_data=null) {
$encoded_data = 'cmd=_notify-validate';
if ($post_data === null) {
// use raw POST data
if (!empty($_POST)) {
$this->post_data = $_POST;
$encoded_data .= '&'.file_get_contents('php://input');
} else {
throw new Exception("No POST data found.");
}
} else {
// use provided data array
$this->post_data = $post_data;
foreach ($this->post_data as $key => $value) {
$encoded_data .= "&$key=".urlencode($value);
}
}
if ($this->use_curl) $this->curlPost($encoded_data);
else $this->fsockPost($encoded_data);
if (strpos($this->response_status, '200') === false) {
throw new Exception("Invalid response status: ".$this->response_status);
}
if (strpos($this->response, "VERIFIED") !== false) {
return true;
} elseif (strpos($this->response, "INVALID") !== false) {
return false;
} else {
throw new Exception("Unexpected response from PayPal.");
}
}
public function requirePostMethod() {
// require POST requests
if ($_SERVER['REQUEST_METHOD'] && $_SERVER['REQUEST_METHOD'] != 'POST') {
header('Allow: POST', true, 405);
throw new Exception("Invalid HTTP request method.");
}
}
Then the Payment.php class, which is where PayPal sends the request too.
/*The Database Connection Code Is Here*/
include('ipnlistener.php');
$listener = new IpnListener();
$listener->use_sandbox = true;
//$listener->use_curl = false;
try {
$verified = $listener->processIpn();
} catch (Exception $e) {
file_put_contents("paymentdev.php", $e->getMessage()." ".date("H:i"));
//file_put_contents("paymentdev.php", "fudge");
exit(0);
}
if ($verified) {
file_put_contents("paymentdev.php", "test");
$data = $_POST;
$user_id = json_decode($data['custom'])->user_id;
$subscription = ($data['mc_gross_1'] == '49.95') ? 2 : 1;
$txn_id = $data['txn_id'];
$user_id = $user_id;
$paypal_id = $data['subsc_id'];
$subscription = $subscription;
$expires = date('Y-m-d H:i:s', strtotime('+1 Month'));
$sql = "SELECT * FROM payments WHERE user_id=$user_id";
$payment = $mysqli->query($sql);
if(isset($payment) && $payment->num_rows > 0)
{
$sql = "DELETE FROM payments WHERE user_id=$user_id";
$delete = $mysqli->query($sql);
}
$sql = "INSERT INTO payments (txn_id, user_id, paypal_id, expires, subscription) VALUES ('$txn_id', $user_id, '$paypal_id', '$expires', $subscription)";
$insertpayment = $mysqli->query($sql);
file_put_contents("paymentdev.php", $mysqli->error);
} else {
file_put_contents("paymentdev.php", "Transaction not verified ".date("H:i")."<br>".$listener->getTextReport());
echo "Error: Transaction not verified";
}
Thanks in advance for all your help guys!
Turns out the code I was using was just fine, I updated the server a bit more just to ensure it was using the latest cURL and open ssl, but even so the sandbox would always return INVALID. I tried the live version with subscriptions priced at $0.01 and the payment went through, was valid and my database was updated
Must just be something weird with the IPN simulator/sandbox
I need some help
I'm trying to write my own class in PHP for Server/InFrame payments.
This is the class:
class SagePay {
public $VPSProtocol = 3.00;
public $TxType = "PAYMENT";
public $Vendor = "************";
public $VendorTxCode ;
public $Amount = 11.75;
public $Currency = "GBP";
public $Description = "By Def";
public $NotificationURL = NOTIFICATIONURL ;
public $BillingSurname ;
public $BillingFirstnames ;
public $BillingAddress1 ;
public $BillingCity ;
public $BillingPostCode ;
public $BillingCountry = "GB";
public $DeliverySurname ;
public $DeliveryFirstnames ;//= Fname Mname
public $DeliveryAddress1 ;//= BillAddress Line 1
public $DeliveryCity ;//= BillCity
public $DeliveryPostCode ;//= W1A 1BL
public $DeliveryCountry = "GB";
public $StoreToken = 1;
public $CustomerName ;//= Fname Mname Surname
public $CustomerEMail ;//= customer#example.com
public $VendorEMail ;//=
public $SendEMail =1;//= 0 1 е да прати и на двамата емайли
public $eMailMessage ;//= нещо се пише тука
public $BillingAddress2 ;//= BillAddress Line 2
public $BillingPhone ;//= 44 (0)7933 000 000
public $ApplyAVSCV2 = 0;
public $Apply3DSecure = 0;
public $AllowGiftAid = 0;
public $BillingAgreement = 1;
public $DeliveryAddress2 ;//= BillAddress Line 2
public $DeliveryPhone ;//= 44 (0)7933 000 000
public $Profile = "LOW";
public $AccountType = "E";
protected $url = "https://test.sagepay.com/gateway/service/vspserver-register.vsp";// must be changet from test to live
static protected $nonSensitiveRequestDataArray = array("VPSProtocol", "TxType", "Vendor", "VendorTxCode", "Amount","Currency", "Description");
static protected $nonSensitiveResponseDataArray = array("VPSProtocol", "Status", "StatusDetail", "VPSTxId");
function __construct() {
define('SAGEPAY_SDK_PATH', dirname(__FILE__));
$data = get_object_vars($this);
}
static public function requestPost($url,$data, $ttl = 30, $caCertPath = ''){
set_time_limit(60);
$output = array();
$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_HEADER, 0);
curl_setopt($curlSession, CURLOPT_POST, 1);
curl_setopt($curlSession, CURLOPT_POSTFIELDS, self::arrayToQueryString($data));
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlSession, CURLOPT_TIMEOUT, $ttl);
curl_setopt($curlSession, CURLOPT_SSL_VERIFYHOST, 2);
if (!empty($caCertPath))
{
curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curlSession, CURLOPT_CAINFO, $caCertPath);
}
else
{
curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, 0);
}
$rawresponse = curl_exec($curlSession);
if (curl_getinfo($curlSession, CURLINFO_HTTP_CODE) !== 200)
{
$output['Status'] = "FAIL";
$output['StatusDetails'] = "Server Response: " . curl_getinfo($curlSession, CURLINFO_HTTP_CODE);
$output['Response'] = $rawresponse;
return $output;
}
if (curl_error($curlSession))
{
$output['Status'] = "FAIL";
$output['StatusDetail'] = curl_error($curlSession);
$output['Response'] = $rawresponse;
return $output;
}
curl_close($curlSession);
$requestForLog= self::arrayToQueryStringRemovingSensitiveData($data,self::$nonSensitiveRequestDataArray ) ;
$response = self::queryStringToArray($rawresponse, "\r\n");
$responseForLog= self::queryStringToArrayRemovingSensitiveData($rawresponse, "\r\n", self::$nonSensitiveResponseDataArray );
self::log("Request:" . PHP_EOL . $requestForLog);
$res = array_merge($output, $response);
return $res;
}
protected static function arrayToQueryString(array $data, $delimiter = '&', $urlencoded = false){
$queryString = '';
$delimiterLength = strlen($delimiter);
// Parse each value pairs and concate to query string
foreach ($data as $name => $value)
{
// Apply urlencode if it is required
if ($urlencoded)
{
$value = urlencode($value);
}
$queryString .= $name . '=' . $value . $delimiter;
}
// remove the last delimiter
return substr($queryString, 0, -1 * $delimiterLength);
}
protected static function arrayToQueryStringRemovingSensitiveData(array $data,array $nonSensitiveDataKey, $delimiter = '&', $urlencoded = false){
$queryString = '';
$delimiterLength = strlen($delimiter);
// Parse each value pairs and concate to query string
foreach ($data as $name => $value)
{
if (!in_array($name, $nonSensitiveDataKey)){
$value=MASK_FOR_HIDDEN_FIELDS;
}
else if ($urlencoded){
$value = urlencode($value);
}
// Apply urlencode if it is required
$queryString .= $name . '=' . $value . $delimiter;
}
// remove the last delimiter
return substr($queryString, 0, -1 * $delimiterLength);
}
protected static function queryStringToArray($data, $delimeter = "&"){
// Explode query by delimiter
$pairs = explode($delimeter, $data);
$queryArray = array();
// Explode pairs by "="
foreach ($pairs as $pair)
{
$keyValue = explode('=', $pair);
// Use first value as key
$key = array_shift($keyValue);
// Implode others as value for $key
$queryArray[$key] = implode('=', $keyValue);
}
return $queryArray;
}
protected static function queryStringToArrayRemovingSensitiveData($data, $delimeter = "&", $nonSensitiveDataKey){
// Explode query by delimiter
$pairs = explode($delimeter, $data);
$queryArray = array();
// Explode pairs by "="
foreach ($pairs as $pair)
{
$keyValue = explode('=', $pair);
// Use first value as key
$key = array_shift($keyValue);
if (in_array($key, $nonSensitiveDataKey)){
$keyValue = explode('=', $pair);
}
else{
$keyValue = array(MASK_FOR_HIDDEN_FIELDS);
}
// Implode others as value for $key
$queryArray[$key] = implode('=', $keyValue);
}
return $queryArray;
}
protected static function log($message){
return true;
}
public function createVendorTxCode(){
$timestamp = time();
$random_number = rand(0,32000)*rand(0,32000);
return "{$timestamp}-{$random_number}";
}
}
IFrame is created correctly. I fill everything properly in the IFrame and the result is:
HTTP Status Code: 500
HTTP Status Message: The request was unsuccessful due to an unexpected condition encountered by the server.
Error Code : 5006
Error Description : Unable to redirect to Vendor's web site. The Vendor failed to provide a RedirectionURL.
Where in the demo of PHP is created and how to generate this RedirectionURL?
When your notificationURL receives the results post from Sage Pay, it needs to respond, providing the RedirectURL - this error usually occurs when Sage Pay are unable to reach the specified notificationURL, or there is no redirection URL returned.
I stopped GZIP compression and everithing is OK.
Responses from SagePay taken with INPUT_POST
i need some advise on this one, im having trouble figuring out the array that comes from google contacts, im already extracting the email from an example i found online, but now i need to extract the name of the contact and the phone number, i am seeing this information in the array doing a print_r() but dont know how to get it.
This is are my files:
gmail.php (this one prints all the emails, here i need also name and phone)
include_once 'GmailOath.php';
$oauth =new GmailOath($consumer_key, $consumer_secret, $argarray, $debug, $callback);
$getcontact_access=new GmailGetContacts();
$request_token=$oauth->rfc3986_decode($_GET['oauth_token']);
$request_token_secret=$oauth->rfc3986_decode($_SESSION['oauth_token_secret']);
$oauth_verifier= $oauth->rfc3986_decode($_GET['oauth_verifier']);
$contact_access = $getcontact_access->get_access_token($oauth,$request_token, $request_token_secret,$oauth_verifier, false, true, true);
$access_token=$oauth->rfc3986_decode($contact_access['oauth_token']);
$access_token_secret=$oauth->rfc3986_decode($contact_access['oauth_token_secret']);
$contacts= $getcontact_access->GetContacts($oauth, $access_token, $access_token_secret, false, true,$emails_count);
foreach($contacts as $k => $a)
{
$final = end($contacts[$k]);
foreach($final as $email)
{
echo 'email: ' . $email["address"] .'<br>';
}
}
GmailOath.php
<?php
class GmailOath {
public $oauth_consumer_key;
public $oauth_consumer_secret;
public $progname;
public $debug;
public $callback;
function __construct($consumer_key, $consumer_secret, $argarray, $debug, $callback) {
$this->oauth_consumer_key = $consumer_key;
$this->oauth_consumer_secret = $consumer_secret;
$this->progname = $argarray;
$this->debug = $debug; // Set to 1 for verbose debugging output
$this->callback = $callback;
}
////////////////// global.php open//////////////
function logit($msg, $preamble=true) {
// date_default_timezone_set('America/Los_Angeles');
$now = date(DateTime::ISO8601, time());
error_log(($preamble ? "+++${now}:" : '') . $msg);
}
function do_get($url, $port=80, $headers=NULL) {
$retarr = array(); // Return value
$curl_opts = array(CURLOPT_URL => $url,
CURLOPT_PORT => $port,
CURLOPT_POST => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true);
if ($headers) {
$curl_opts[CURLOPT_HTTPHEADER] = $headers;
}
$response = $this->do_curl($curl_opts);
if (!empty($response)) {
$retarr = $response;
}
return $retarr;
}
function do_post($url, $postbody, $port=80, $headers=NULL) {
$retarr = array(); // Return value
$curl_opts = array(CURLOPT_URL => $url,
CURLOPT_PORT => $port,
CURLOPT_POST => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POSTFIELDS => $postbody,
CURLOPT_RETURNTRANSFER => true);
if ($headers) {
$curl_opts[CURLOPT_HTTPHEADER] = $headers;
}
$response = do_curl($curl_opts);
if (!empty($response)) {
$retarr = $response;
}
return $retarr;
}
function do_curl($curl_opts) {
$retarr = array(); // Return value
if (!$curl_opts) {
if ($this->debug) {
$this->logit("do_curl:ERR:curl_opts is empty");
}
return $retarr;
}
// Open curl session
$ch = curl_init();
if (!$ch) {
if ($this->debug) {
$this->logit("do_curl:ERR:curl_init failed");
}
return $retarr;
}
// Set curl options that were passed in
curl_setopt_array($ch, $curl_opts);
// Ensure that we receive full header
curl_setopt($ch, CURLOPT_HEADER, true);
if ($this->debug) {
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
}
// Send the request and get the response
ob_start();
$response = curl_exec($ch);
$curl_spew = ob_get_contents();
ob_end_clean();
if ($this->debug && $curl_spew) {
$this->logit("do_curl:INFO:curl_spew begin");
$this->logit($curl_spew, false);
$this->logit("do_curl:INFO:curl_spew end");
}
// Check for errors
if (curl_errno($ch)) {
$errno = curl_errno($ch);
$errmsg = curl_error($ch);
if ($this->debug) {
$this->logit("do_curl:ERR:$errno:$errmsg");
}
curl_close($ch);
unset($ch);
return $retarr;
}
if ($this->debug) {
$this->logit("do_curl:DBG:header sent begin");
$header_sent = curl_getinfo($ch, CURLINFO_HEADER_OUT);
$this->logit($header_sent, false);
$this->logit("do_curl:DBG:header sent end");
}
// Get information about the transfer
$info = curl_getinfo($ch);
// Parse out header and body
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
// Close curl session
curl_close($ch);
unset($ch);
if ($this->debug) {
$this->logit("do_curl:DBG:response received begin");
if (!empty($response)) {
$this->logit($response, false);
}
$this->logit("do_curl:DBG:response received end");
}
// Set return value
array_push($retarr, $info, $header, $body);
return $retarr;
}
function json_pretty_print($json, $html_output=false) {
$spacer = ' ';
$level = 1;
$indent = 0; // current indentation level
$pretty_json = '';
$in_string = false;
$len = strlen($json);
for ($c = 0; $c < $len; $c++) {
$char = $json[$c];
switch ($char) {
case '{':
case '[':
if (!$in_string) {
$indent += $level;
$pretty_json .= $char . "\n" . str_repeat($spacer, $indent);
} else {
$pretty_json .= $char;
}
break;
case '}':
case ']':
if (!$in_string) {
$indent -= $level;
$pretty_json .= "\n" . str_repeat($spacer, $indent) . $char;
} else {
$pretty_json .= $char;
}
break;
case ',':
if (!$in_string) {
$pretty_json .= ",\n" . str_repeat($spacer, $indent);
} else {
$pretty_json .= $char;
}
break;
case ':':
if (!$in_string) {
$pretty_json .= ": ";
} else {
$pretty_json .= $char;
}
break;
case '"':
if ($c > 0 && $json[$c - 1] != '\\') {
$in_string = !$in_string;
}
default:
$pretty_json .= $char;
break;
}
}
return ($html_output) ?
'<pre>' . htmlentities($pretty_json) . '</pre>' :
$pretty_json . "\n";
}
function oauth_http_build_query($params, $excludeOauthParams=false) {
$query_string = '';
if (!empty($params)) {
// rfc3986 encode both keys and values
$keys = $this->rfc3986_encode(array_keys($params));
$values = $this->rfc3986_encode(array_values($params));
$params = array_combine($keys, $values);
uksort($params, 'strcmp');
$kvpairs = array();
foreach ($params as $k => $v) {
if ($excludeOauthParams && substr($k, 0, 5) == 'oauth') {
continue;
}
if (is_array($v)) {
// If two or more parameters share the same name,
// they are sorted by their value. OAuth Spec: 9.1.1 (1)
natsort($v);
foreach ($v as $value_for_same_key) {
array_push($kvpairs, ($k . '=' . $value_for_same_key));
}
} else {
// For each parameter, the name is separated from the corresponding
// value by an '=' character (ASCII code 61). OAuth Spec: 9.1.1 (2)
array_push($kvpairs, ($k . '=' . $v));
}
}
// Each name-value pair is separated by an '&' character, ASCII code 38.
// OAuth Spec: 9.1.1 (2)
$query_string = implode('&', $kvpairs);
}
return $query_string;
}
function oauth_parse_str($query_string) {
$query_array = array();
if (isset($query_string)) {
// Separate single string into an array of "key=value" strings
$kvpairs = explode('&', $query_string);
// Separate each "key=value" string into an array[key] = value
foreach ($kvpairs as $pair) {
list($k, $v) = explode('=', $pair, 2);
// Handle the case where multiple values map to the same key
// by pulling those values into an array themselves
if (isset($query_array[$k])) {
// If the existing value is a scalar, turn it into an array
if (is_scalar($query_array[$k])) {
$query_array[$k] = array($query_array[$k]);
}
array_push($query_array[$k], $v);
} else {
$query_array[$k] = $v;
}
}
}
return $query_array;
}
function build_oauth_header($params, $realm='') {
$header = 'Authorization: OAuth';
foreach ($params as $k => $v) {
if (substr($k, 0, 5) == 'oauth') {
$header .= ',' . $this->rfc3986_encode($k) . '="' . $this->rfc3986_encode($v) . '"';
}
}
return $header;
}
function oauth_compute_plaintext_sig($consumer_secret, $token_secret) {
return ($consumer_secret . '&' . $token_secret);
}
function oauth_compute_hmac_sig($http_method, $url, $params, $consumer_secret, $token_secret) {
$base_string = $this->signature_base_string($http_method, $url, $params);
$signature_key = $this->rfc3986_encode($consumer_secret) . '&' . $this->rfc3986_encode($token_secret);
$sig = base64_encode(hash_hmac('sha1', $base_string, $signature_key, true));
if ($this->debug) {
logit("oauth_compute_hmac_sig:DBG:sig:$sig");
}
return $sig;
}
/**
* Make the URL conform to the format scheme://host/path
* #param string $url
* #return string the url in the form of scheme://host/path
*/
function normalize_url($url) {
$parts = parse_url($url);
$scheme = $parts['scheme'];
$host = $parts['host'];
$port = $parts['port'];
$path = $parts['path'];
if (!$port) {
$port = ($scheme == 'https') ? '443' : '80';
}
if (($scheme == 'https' && $port != '443')
|| ($scheme == 'http' && $port != '80')) {
$host = "$host:$port";
}
return "$scheme://$host$path";
}
/**
* Returns the normalized signature base string of this request
* #param string $http_method
* #param string $url
* #param array $params
* The base string is defined as the method, the url and the
* parameters (normalized), each urlencoded and the concated with &.
* #see http://oauth.net/core/1.0/#rfc.section.A.5.1
*/
function signature_base_string($http_method, $url, $params) {
// Decompose and pull query params out of the url
$query_str = parse_url($url, PHP_URL_QUERY);
if ($query_str) {
$parsed_query = $this->oauth_parse_str($query_str);
// merge params from the url with params array from caller
$params = array_merge($params, $parsed_query);
}
// Remove oauth_signature from params array if present
if (isset($params['oauth_signature'])) {
unset($params['oauth_signature']);
}
// Create the signature base string. Yes, the $params are double encoded.
$base_string = $this->rfc3986_encode(strtoupper($http_method)) . '&' .
$this->rfc3986_encode($this->normalize_url($url)) . '&' .
$this->rfc3986_encode($this->oauth_http_build_query($params));
$this->logit("signature_base_string:INFO:normalized_base_string:$base_string");
return $base_string;
}
/**
* Encode input per RFC 3986
* #param string|array $raw_input
* #return string|array properly rfc3986 encoded raw_input
* If an array is passed in, rfc3896 encode all elements of the array.
* #link http://oauth.net/core/1.0/#encoding_parameters
*/
function rfc3986_encode($raw_input){
if (is_array($raw_input)) {
//return array_map($this->rfc3986_encode, $raw_input);
return array_map(array($this, 'rfc3986_encode'), $raw_input);
// return $this->rfc3986_encode($raw_input);
} else if (is_scalar($raw_input)) {
return str_replace('%7E', '~', rawurlencode($raw_input));
} else {
return '';
}
}
function rfc3986_decode($raw_input) {
return rawurldecode($raw_input);
}
}
class GmailGetContacts {
function get_request_token($oauth, $usePost=false, $useHmacSha1Sig=true, $passOAuthInHeader=false) {
$retarr = array(); // return value
$response = array();
$url = 'https://www.google.com/accounts/OAuthGetRequestToken';
$params['oauth_version'] = '1.0';
$params['oauth_nonce'] = mt_rand();
$params['oauth_timestamp'] = time();
$params['oauth_consumer_key'] = $oauth->oauth_consumer_key;
$params['oauth_callback'] = $oauth->callback;
$params['scope'] = 'https://www.google.com/m8/feeds';
// compute signature and add it to the params list
if ($useHmacSha1Sig) {
$params['oauth_signature_method'] = 'HMAC-SHA1';
$params['oauth_signature'] =
$oauth->oauth_compute_hmac_sig($usePost ? 'POST' : 'GET', $url, $params,
$oauth->oauth_consumer_secret, null);
} else {
echo "signature mathod not support";
}
// Pass OAuth credentials in a separate header or in the query string
if ($passOAuthInHeader) {
$query_parameter_string = $oauth->oauth_http_build_query($params, FALSE);
$header = $oauth->build_oauth_header($params);
$headers[] = $header;
} else {
$query_parameter_string = $oauth->oauth_http_build_query($params);
}
// POST or GET the request
if ($usePost) {
$request_url = $url;
$oauth->logit("getreqtok:INFO:request_url:$request_url");
$oauth->logit("getreqtok:INFO:post_body:$query_parameter_string");
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$response = do_post($request_url, $query_parameter_string, 443, $headers);
} else {
$request_url = $url . ($query_parameter_string ?
('?' . $query_parameter_string) : '' );
$oauth->logit("getreqtok:INFO:request_url:$request_url");
$response = $oauth->do_get($request_url, 443, $headers);
}
// extract successful response
if (!empty($response)) {
list($info, $header, $body) = $response;
$body_parsed = $oauth->oauth_parse_str($body);
if (!empty($body_parsed)) {
$oauth->logit("getreqtok:INFO:response_body_parsed:");
//print_r($body_parsed);
}
$retarr = $response;
$retarr[] = $body_parsed;
}
return $body_parsed;
}
function get_access_token($oauth, $request_token, $request_token_secret, $oauth_verifier, $usePost=false, $useHmacSha1Sig=true, $passOAuthInHeader=true) {
$retarr = array(); // return value
$response = array();
$url = 'https://www.google.com/accounts/OAuthGetAccessToken';
$params['oauth_version'] = '1.0';
$params['oauth_nonce'] = mt_rand();
$params['oauth_timestamp'] = time();
$params['oauth_consumer_key'] = $oauth->oauth_consumer_key;
$params['oauth_token'] = $request_token;
$params['oauth_verifier'] = $oauth_verifier;
// compute signature and add it to the params list
if ($useHmacSha1Sig){
$params['oauth_signature_method'] = 'HMAC-SHA1';
$params['oauth_signature'] =
$oauth->oauth_compute_hmac_sig($usePost ? 'POST' : 'GET', $url, $params,
$oauth->oauth_consumer_secret, $request_token_secret);
} else {
echo "signature mathod not support";
}
//
if ($passOAuthInHeader) {
$query_parameter_string = $oauth->oauth_http_build_query($params, false);
$header = $oauth->build_oauth_header($params);
$headers[] = $header;
} else {
$query_parameter_string = $oauth->oauth_http_build_query($params);
}
if ($usePost){
$request_url = $url;
logit("getacctok:INFO:request_url:$request_url");
logit("getacctok:INFO:post_body:$query_parameter_string");
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$response = $oauth->do_post($request_url, $query_parameter_string, 443, $headers);
} else {
$request_url = $url . ($query_parameter_string ?
('?' . $query_parameter_string) : '' );
$oauth->logit("getacctok:INFO:request_url:$request_url");
$response = $oauth->do_get($request_url, 443, $headers);
}
if (!empty($response)) {
list($info, $header, $body) = $response;
$body_parsed = $oauth->oauth_parse_str($body);
if (!empty($body_parsed)) {
$oauth->logit("getacctok:INFO:response_body_parsed:");
//print_r($body_parsed);
}
$retarr = $response;
$retarr[] = $body_parsed;
}
return $body_parsed;
}
function GetContacts($oauth, $access_token, $access_token_secret, $usePost=false, $passOAuthInHeader=true,$emails_count) {
$retarr = array(); // return value
$response = array();
$url = "https://www.google.com/m8/feeds/contacts/default/full";
$params['alt'] = 'json';
$params['max-results'] = $emails_count;
$params['oauth_version'] = '1.0';
$params['oauth_nonce'] = mt_rand();
$params['oauth_timestamp'] = time();
$params['oauth_consumer_key'] = $oauth->oauth_consumer_key;
$params['oauth_token'] = $access_token;
// compute hmac-sha1 signature and add it to the params list
$params['oauth_signature_method'] = 'HMAC-SHA1';
$params['oauth_signature'] =
$oauth->oauth_compute_hmac_sig($usePost ? 'POST' : 'GET', $url, $params,
$oauth->oauth_consumer_secret, $access_token_secret);
// Pass OAuth credentials in a separate header or in the query string
if ($passOAuthInHeader){
$query_parameter_string = $oauth->oauth_http_build_query($params, false);
$header = $oauth->build_oauth_header($params);
$headers[] = $header;
} else {
$query_parameter_string = $oauth->oauth_http_build_query($params);
}
// POST or GET the request
if ($usePost){
$request_url = $url;
$oauth->logit("callcontact:INFO:request_url:$request_url");
$oauth->logit("callcontact:INFO:post_body:$query_parameter_string");
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$response = $oauth->do_post($request_url, $query_parameter_string, 80, $headers);
} else {
$request_url = $url . ($query_parameter_string ?
('?' . $query_parameter_string) : '' );
$oauth->logit("callcontact:INFO:request_url:$request_url");
$response = $oauth->do_get($request_url, 443, $headers);
}
if (!empty($response)) {
list($info, $header, $body) = $response;
if ($body) {
$oauth->logit("callcontact:INFO:response:");
$contact = json_decode($oauth->json_pretty_print($body), true);
//echo $contact['feed']['entry'][0]['gd$email'][0]['address'];
return $contact['feed']['entry'];
}
$retarr = $response;
}
return $retarr;
}
}
?>
Can you guys help me on this one please. Thanks in advance!
Not sure if this can help you as you say you have already used print_r (are you using with braces?), but to display the contents of an array in PHP, I have always used this with success.
It displays the integer ref of the array plus the data in each field.
<?php
echo "<pre>"; //print array to console
{print_r($variable_name);}
echo "</pre>";
?>
Alternately, have you checked the information here: https://developers.google.com/google-apps/contacts/v3/#retrieving_contacts_using_query_parameters
Or try the Context.IO API - there's a call specifically for pulling contacts: http://context.io/docs/2.0/accounts/contacts
Hoping any of these might help you.
For your case for first Phone andress and Note Field .
add where you loop the contacts in gmail.php
foreach($contacts as $k => $a)
{
$phone1 = end($a['gd$phoneNumber'][0]);
$note = end($a['content']);
$adress = end($a['gd$postalAddress'][0]);
I'm trying to write a php script to send a http post request to a url. It doesnt seem to pass through for the server is not receiving it. Can anyone help?
<?php
function postXMLToURL ($server, $path, $xmlDocument) {
$xmlSource = $xmlDocument;
$contentLength = strlen($xmlSource);
//$fp = fsockopen($server, 80);
$fp = fsockopen($server,8080);
fwrite($fp, "POST $path HTTP/1.0\r\n");
fwrite($fp, "Host: $server\r\n");
fwrite($fp, "Content-Type: application/xml\r\n");
fwrite($fp, "Content-Length: $contentLength\r\n");
fwrite($fp, "Connection: close\r\n");
fwrite($fp, "\r\n"); // all headers sent
fwrite($fp, $xmlSource);
$result = '';
while (!feof($fp)) {
$result .= fgets($fp, 128);
}
return $result;
}
function getBody ($httpResponse) {
$lines = preg_split('/(\r\n|\r|\n)/', $httpResponse);
$responseBody = '';
$lineCount = count($lines);
for ($i = 0; $i < $lineCount; $i++) {
if ($lines[$i] == '') {
break;
}
}
for ($j = $i + 1; $j < $lineCount; $j++) {
$responseBody .= $lines[$j] . "\n";
}
return $responseBody;
}
$xmlDocument = new DomDocument($final_xml); //final_xml is my xml in a string
$result = postXMLtoURL("localhost", "/resources", $xmlDocument);
$responseBody = getBody($result);
$resultDocument = new DOMDocument();
$resultDocument->loadXML($responseBody);
header('Content-Type: application/xml');
echo $resultDocument->saveXML();
}
?>
You need to learn how to help yourself.
There's no error detection in the code - you should at least check fp is valid after the call to fsockopen, for preference there should be a LOT more error checking.
Also, get hold of something like wireshark and see what packets your code is generating.
C.
You could aso use stream_context_create();
Once i wrote a php class you are wecome to use it.
<?php
class HTTPRequest
{
protected $url;
protected $method;
protected $headers;
protected $data = "";
protected $useragent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
public function __construct(){}
public function setHeaders($headers)
{
if(is_array($headers))
{
$this->headers = $headers;
return true;
}
return false;
}
public function get($request)
{
if(!$this->headers)
{
throw new Exception("Please set Headers");
}
$this->url = $request;
$this->method = "GET";
return $this->send();
}
public function put($request,$xml)
{
if(!$this->header)
{
throw new Exception("Please set Headers");
}
$this->url = $request;
$this->method = "PUT";
$this->data = $xml;
return $this->send();
}
public function post($request,$xml)
{
if(!$this->headers)
{
throw new Exception("Please set Headers");
}
$this->url = $request;
$this->method = "POST";
$this->data = $xml;
return $this->send();
}
public function delete($request)
{
if(!$this->headers)
{
throw new Exception("Please set Headers");
}
$this->url = $request;
$this->method = "DELETE";
return $this->send();
}
public function setUserAgent($useragent)
{
$this->useragent = $useragent;
}
protected function send()
{
$params = array('http' => array
(
'method' => $this->method,
'content' => $this->data,
'user_agent' => $this->useragent
)
);
$headers = "";
if (!empty($this->headers) && is_array($this->headers))
{
foreach ($this->headers as $header)
{
$headers .= $header."\n";
}
}
$params['http']['header'] = $headers;
$context = stream_context_create($params);
$fp = fopen($this->url, 'r', false, $context);
if (!$fp)
{
throw new Exception("Problem with ".$this->url);
}
$response = stream_get_contents($fp);
if ($response === false)
{
throw new Exception("Problem reading data from ".$this->url);
}
return $response;
}
}
?>