Transfer array from one page to another using CURL - php

Im trying to transfer an array of data between two files.
The sender.php code (the file sending the array using POST method)
$url = 'http://localhost/receiver.php';
$myvars = array("one","two","three")
$post_elements = array('myvars'=>$myvars);
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_elements);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
echo "$response";
The receiver.php code (The file receiving the array from sender.php file and then take each element of the array and echo it and also put it in a document saved.txt.
echo $_POST($myvars); // To test the output of the received data.
foreach($myvars as $item) {
if (!empty($item)) {
echo $item."<br>";
$myfile = file_put_contents('Saved.txt', (" Name: ". ($_POST["$item"])) . PHP_EOL , FILE_APPEND);
}
}
The array isn't being transferred to the receiver.php or I am not catching it. In the document output I have only in the place of the variable $item instead of each element of the array.
Edit:
Added the following code in the receiving file in order to get the array elements from inside but all I get is array printed out:
foreach( $_POST as $stuff ) {
if( is_array( $stuff ) ) {
foreach( $stuff as $thing ) {
echo $thing;
}
} else {
echo $stuff;
}
}
By adding on the receiving file the following:
echo "<pre>";
print_r($_POST);
echo "</pre>";
I get the following:
Array
(
[myvars] => Array
)

OK, the bottom line of the discussion in the comments above leads to this result:
The sending part:
<?php
$url = 'http://localhost/out.php';
$myvars = array("one","two","three");
$post_elements = array('myvars'=>$myvars);
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($post_elements));
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
print_r($response);
The receiving part:
<?php
print_r($_POST);
The output on the sending side is:
Array ( [myvars] => Array ( [0] => one [1] => two [2] => three ) )
which basically says that you can simply use $_POST['myvars'] on the receiving side which will exactly hold the scalar array you want to transfer.

try to serialize the array because it always helps me :
$url = 'http://localhost/receiver.php';
$myvars = array("one","two","three");
$myvars_post=join(" ",$myvars);
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, "array=".urldecode($myvars_post));
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
echo "$response";
and in the receiver.php use :
print_r($_POST);

Related

Inline keyboard Telegram bot [PHP]

I want that my bot when I write /orario he answer me with a inline keyboard.
So.. I created an array for my keyboard in this way:
$tastierino_giorno = '[{"text":"Testo","callback_data":"StampaMessaggio"}]';
and in another function I write this:
function tastieraInline($chatid, $tastierino)
{
global $token;
$messaggio = "Scegli per che giorno inviare il messaggio:";
$tastiera = '&reply_markup={"inline_keyboard":
['.urlencode($tastierino).'],"resize_keyboard":true}';
$url = "https://api.telegram.org/$token/sendMessage?chat_id=$chatId&parse_mode=HTML&text=".urlencode($messaggio).$tastiera;
file_get_contents($url);
}
After this, with an if, I check if the users has write "/orario".
} elseif($message == "/orario"){
tastieraInline($chatid, $tastierino_giorno);
}
Now the problem is that it doesn't works... what's the problem?
Change
$tastiera = '&reply_markup={"inline_keyboard":
['.urlencode($tastierino).'],"resize_keyboard":true}';
to
$tastiera = '&reply_markup='.urlencode('{"inline_keyboard":
['.$tastierino.'],"resize_keyboard":true}');
you should URL encode the whole JSON data
You should pay attention to the result returned from your telegram calls. file_get_contents is great for getting something working quickly but doesn't return any error information.
You should use curl or a library like guzzle. An example for curl:
$ch = curl_init( $url );
if ( $ch == FALSE )
{
error_log( "Error initialising curl" );
return FALSE;
}
curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
curl_setopt( $ch, CURLOPT_POST, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $ch, CURLOPT_FORBID_REUSE, 1 );
// Set TCP timeout to 30 seconds
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 30 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Connection: Close' ) );
$result = curl_exec( $ch );
$error = curl_errno( $ch );
$errorStr = curl_error( $ch );
curl_close( $ch );
if ( $error != 0 )
{
return array( $errorStr, $result );
}
return $result;
Guzzle is a lot simpler if you don't mind installing an additional library.
Hopefully this will get you the error string from your failed telegram calls.
Onto your actual issue. You should create json for the keyboard markup using json_encode rather than appending strings. http_build_query makes building URLs much easier.

Securepay is not working

I have implemented Secure pay payment gateway in my website. It was working fine but from yesterday it is not working. I did not get any response from secure server. Also I am getting an error.
A PHP Error was encountered
Severity: Notice
Message: Trying to get property of non-object
Filename: libraries/securepay.php
Line Number: 479
In securepay.php 479 number line is
($this->_TranslateServerCode($this->ResponseTree->Status->statusCode) == SECUREPAY_STATUS_OK);
and full function is below
function TestConnection() {
$this->RequestXml = $this->_ComposeEcho();
$this->ResponseXml = $this->_Dispatch($this->RequestXml);
$this->ResponseTree = simplexml_load_string($this->ResponseXml);
return ($this->_TranslateServerCode($this->ResponseTree->Status->statusCode) == SECUREPAY_STATUS_OK);
}
Below is my sample code:
include('securepay.php');
$sp = new SecurePay('ABC0001','abc123', TRUE);
$sp->TestMode();
$sp->TestConnection();
$sp->Cc = 4111111111111111;
$sp->ExpiryDate = '07/20';
$sp->ChargeAmount = 1500;
$sp->ChargeCurrency = 'AUD';
$sp->Cvv = 321;
$sp->OrderId = 'ORD34234';
if ($sp->Valid()) {
$response = $sp->Process();
if ($response == SECUREPAY_STATUS_APPROVED) {
echo "Transaction was a success\n";
} else {
echo "Transaction failed with the error code: $response\n";
echo "XML Dump: " . print_r($sp->ResponseXml,1) . "\n";
}
} else {
die("Your data is invalid\n");
}
Please help me how to solve it.
You can use the following curl REST API code:
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, 'https://test.api.securepay.com.au/xmlapi/payment' );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, false );
curl_setopt ( $ch, CURLOPT_MAXREDIRS, 1 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, array (
'Content-Type: application/json'
) );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $jsonRequest );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 30 );
$result = curl_exec ( $ch );
Here $jsonRequest will consist of request data like "credit card payment". You can use the following link to find the JSON request data and test it.
SecurePay Sandbox Testing Environment

I am getting data from api using curl as a json object it is giving a Array I want to bind that into drop down

Now I want to bind that into drop down how to do that? I don't have any idea to create drio down using api data as a array.
<?php
// specify the REST web service to interact with
$baseurl = 'http://host/api/v1/specializations';
/**
* Authenicate and get back token
*/
$curl = curl_init($baseurl);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json',"Authorization: Bearer $atoken"));
// Set the POST arguments to pass to the Sugar server
$rawPOSTdata = array(
"type" => "private",
);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($rawPOSTdata));
// Make the REST call, returning the result
$response = curl_exec($curl);
if (!$response) {
die("Connection Failure.\n");
}
// Convert the result from JSON format to a PHP array
//echo "Success! response result is $response\n";
//print_r($response);
//var_dump(json_decode($response));
curl_close($curl);
if ( isset($result->error) )
{
die($result->error_message."\n");
}
var_dump(json_decode($response, true));
?>
I think this is what you were meaning - along these lines anyway. I'm not 100% sure that I have used the correct keys
<?php
$baseurl = 'http://host/api/v1/specializations';
$headers=array(
"Content-Type: application/json",
"Authorization: Bearer $atoken"
);
$data = array( "type" => "private" );
$curl = curl_init( $baseurl );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode( $data ) );
$result = curl_exec( $curl );
curl_close( $curl );
if( $result ) {
if ( isset($result->error) )die( $result->error_message );
/* Convert json data to array */
$arr=json_decode( $result, true );
/* Items of interest for menu are here? */
$json=$arr['data']['specialityMap'];
/* empty array to populate with html content */
$html=array();
/* add to the array */
$html[]="<select name=''>";
foreach($json as $i => $v )$html[]="<option value='$i'>$v";
$html[]="</select>";
/* echo or return html menu */
echo implode( PHP_EOL, $html );
}
?>
Please have a look if it helps.
$arr = json_decode($response);
foreach($arr['items'] as $val)
{
echo $val['fieldname'].'<br>';
}

PHP Proxy POST request to API with file upload

I have a job application form that contains a bunch of text inputs and two fields to upload files (resume and cover letter).
This form needs to post to a job board API endpoint but the request has to be proxied so the API key isn't seen in the post. This is working fine with just the text inputs but I can't figure out how to get the files to upload as well. Below is what I have so far, which only posts the text.
How do I need to go about uploading the files as well?
<?php
if ( $_POST ) {
// API key
$api_key = 'super_secret_key';
$url = "https://api.myjobboard.io/applications/";
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_USERPWD, $api_key . ":" . '' );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $_POST ) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HEADER, false );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
$response = curl_exec( $ch );
echo $response;
} else {
echo '<p>Error: No post data.</p>';
}
?>

Unable to send json string containing encoded string with curl in php

I have created a script to send json data to a url
$data = array();
$key = 'mysecretkey';
$string = 'teststring';
$data['date'] = '2013-06-19 05:38:00';
$data['encrypted_string'] = mcrypt_encode($string,$key);
$data['id'] = 231;
$data['source_ref'] = 'testreference';
$data['status'] = 'Active';
header('Content-type: text/json');
header('Content-type: application/json');
$url = 'http://localhost/myproject/test/add_json_data';
$json_string = json_encode($data);
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS,$json_string);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
mcrypt_encode encodes the string. Here is the json_string
{
"date": "2013-06-19 05:38:00",
"encrypted_string": "7Y4jqgIfhj25ghsF8yJ/qTtzXafTtIlwsz7xWIDVWJGoF22X2JbfSWfQtgmI1dYyyJDgs3nmaWctTEgKW5VmHw==",
"id": 231,
"source_ref": "testreference",
"status": "Active"
}
When i exe4cute the script nothing happens on the url i provided.
Here is what i am doing on the url.
function add_json_data()
{
$json = file_get_contents('php://input');
$obj = json_decode($json);
$this->load->helper('file');
write_file('json.json',$json);
}
I am using codeigniter so i am simply saving the post data in a file in json format to see what is coming. But i see the url is not called. I assume due to the encoded json string which contains encoded string it is not sending data to url. How can i send my encoded key to the url. I have also checked if i replace encrypted_string with something 'test' it is working fine. How can i send data to the url or any alternative? Please help.
Always turn on error_reporting when you're developing code, otherwise the simplest syntax error looks like a showstopping bug.
The line:
$string = 'teststring'
Is missing a semicolon.
I have found the answer for this. Here is how i can do this
$data = array();
$key = 'mysecretkey';
$string = 'teststring';
$data['date'] = '2013-06-19 05:38:00';
$data['encrypted_string'] = mcrypt_encode($string,$key);
$data['id'] = 231;
$data['source_ref'] = 'testreference';
$data['status'] = 'Active';
$url = 'http://localhost/myproject/test/add_json_data';
$json_string = json_encode($data);
$header[] = 'Content-type: text/json';
$header[] = 'Content-type: application/json';
$header[] = 'Content-Length: '.strlen($json_string);
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS,$json_string);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HTTPHEADER,$header);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
After setting header array and passing it to curl as an option it is working fine.

Categories