Amazon SP API - createFeedDocument - php

The goal is to do a "POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA" so right now I'm trying to do a createFeedDocument which I believe is the 1st step.
There's few questions about this but none in PHP curl.
I spent hours....HOURS and still can't figure it out..
I get error:
"message": null,
"code": "InvalidInput"
I even tried removing "contentType" from the URL and put it in the header, but then I get error msg: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method."
Please....please is there anyone out there that knows what I need to change with code below?
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://sellingpartnerapi-na.amazon.com/feeds/2021-06-30/documents?contentType=text/tab-separated-values;charset=UTF-8',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => array(
'Accept: application/json',
'x-amz-access-token: the token<hidden>',
'X-Amz-Date: 20230125T073105Z',
'Authorization: AWS4-HMAC-SHA256 Credential=The_AccessKey/20230125/us-east-1/execute-api/aws4_request, SignedHeaders=accept;host;x-amz-access-token;x-amz-date, Signature=a6e8bdf306ea24438978a5fff961d08fc65d06c10f43c782af15a6a60<hidden>'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;

Related

PHP cURL Content-Length

I am trying to add a record to the database with POST operation via API and I generated the attached code from Postman.
On Postman, the process goes without any problem and user registration takes place.
But when I try to generate the code as "PHP cURL" via Postman and run it on PHP, I get the relevant error.
HTTP Error 411. The request must be chunked or have a content length.
I defined POSTFIELDS as array, calculated Content-Length using strlen function and added it to Headers. But it didn't work.
My PHP code;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://xxx.xxx/xxx/xxx/xxx',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"TokenKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"EmployeeList": [
{
"Example1": "1",
"Example2": "somedata2",
"Example3": "somedata3",
"Example4": "somedata4",
"Example5": "somedata5",
"Example6": "somedata6",
"Example7": "somedata7",
"Example8": "somedata8",
"Example9": "somedata9",
"Example10": "somedata10",
"Example11": "somedata11",
"Example12": "somedata12",
"Example13": "somedata13",
"Example14": "somedata14",
"Example15": "somedata15",
"Example16": "somedata16",
"Example17": "somedata17",
"Example18": "somedata18",
"Example19": "somedata19",
"Example20": "somedata20",
"Example21": "somedata21",
"Example22": "somedata22",
"Example23": "somedata23",
"Example24": "somedata24",
"Example25": "somedata25",
"Example26": "somedata26",
"Example27": "somedata27",
"Example28": "somedata28",
"Example29": "somedata29",
"Example30": "somedata30",
"Example31": "somedata31",
"Example32": null,
"Example33": null,
"Example34": null,
"Example35": "2022-12-06 22:05:22",
"Example36": false,
"Example37": true
}
]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
echo "<br>";
echo $statusCode;````

Postmates API using php/curl - returns unauthorized / Invalid OAuth 2.0 credentials provided

I got myself some postmates customer and api credentials (https://partner.postmates.com/welcome-api)
followed the example here https://documenter.getpostman.com/view/3967924/RW1Yq1oN#993c52be-abcc-b06b-3f3d-0abfe9782484 like so
$customerId = 'cus_xxxxxxxxxx';
$apiKey = 'aaaaaa-bbbbb-ccc-dddd-eeeeeeee';
$authKey = base64_encode($apiKey.':');
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.postmates.com/v1/customers/'.$customerId.'/delivery_quotes',
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('pickup_address' => '76 9th Ave, New York, NY','dropoff_address' => '46 Maujer St, Brooklyn, NY'),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/x-www-form-urlencoded',
'Accept: application/json',
'Authorization: Basic '.$authKey.'',
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
exit();
(of course using the actual customerId and apiKey)
but i only ever get as a result the following:
{"code":"unauthorized","message":"Invalid OAuth 2.0 credentials provided."}
(the CURLOPT_SSL_VERIFYPEER = false is just added for simplicities sake in a test environment here, using it on a live server with ssl verified yields the same results)
I have of course double and triplechecked the customerid and api key, but the result does not change
If anyone has any idea what i am missing , that would be great as i have been banging my head against the wall for hours now

Trouble with Param arguments for an Api

Im trying to get all cities of a specific country from an API(https://countriesnow.space/). Im using Php and curl but the result says:
{
"error": true,
"msg": "missing param (country)"
}
Im using a script which is given by but it does not work: https://documenter.getpostman.com/view/1134062/T1LJjU52#4829d16f-0f4e-43ec-886e-68ebad1221d8
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://countriesnow.space/api/v0.1/countries/cities',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"country": "nigeria"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
Could anyone tell me whats wrong here? Really cant tell whats the issue.
cURL will automatically set the Content-Type to application/x-www-form-urlencoded, when you pass a string value for CURLOPT_POSTFIELDS.
But this is not supposed to be form data, but JSON. Add
CURLOPT_HTTPHEADER => ['Content-Type: application/json']
to your cURL options, to let the API know you are in fact sending JSON.

cURL: wait for response until it is processed by api

everybody,
I am using the following code for synchronizing data with an API ($method= POST) and then I call using the GET method ($method= GET) to print the result of the synchronization:
function sendCurl ($fileName, $method)
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_POSTFIELDS => array('file' => new CURLFILE($fileName)),
CURLOPT_HTTPHEADER => array(
"Authorization: xxxxxxxxxxxxxxx",
"Accept: application/json."
"Content-Type: multipart/form-data"
),
));
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
The problem is that the GET method response arrives before the API has time to process it. Therefore, when I print the response I print WAITING FOR RESPONSE and not whether it went ok or failed.
What can I do to print the ok or fail and not the WAITING FOR RESPONSE?
Thank you very much!

Netsuite API throws 400 bad request

I am trying to connect with Netsuite Customer API but it throws "400 bad request"
Here is my code in PHP
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://xxxxxxx-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer/1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_FAILONERROR => true,
CURLOPT_SSL_VERIFYHOST=>false,
CURLOPT_SSL_VERIFYPEER=>false,
CURLOPT_HTTPHEADER => array(
"Authorization: OAuth realm=\"xxxxxxx_SB1\",oauth_consumer_key=\"consumer_key_xxxxxx\",oauth_token=\"auth_token_xxxxxxxx\",oauth_version=\"1.0\""
),
));
$response = curl_exec($curl);
if (curl_errno($curl)) {
$error_msg = curl_error($curl);
}
var_dump($error_msg);
curl_close($curl);
var_dump($response);
?>
Here above code I copied from postman. In a postman, it returns data but when I copied code for php in a file it is not working, Could anyone suggest me where I am going to wrong ?
My localhost url : localhost/netsuite_api.php
For whatever reason, the netsuite API returns 400 even where it should be a 401 according to the docs.
From the docs about the Authentication, you need to send more fields (see page 169 following):
Authorization:
OAuth realm="12345",
oauth_consumer_key="4a3ff6c251a55057bb1e62d8dc8998a0366e88f3a8fe735265fc425368b0f154",
oauth_token="52cfe88fecf2e2b74e833e7dfc4cae79ff44c3ca9f696d61e2a7eac6c8357c3c",
oauth_nonce="qUwlmPvtGCS4sHJe8F7x",
oauth_timestamp="1462453273",
oauth_signature_method="HMAC-SHA1", oauth_version="1.0",

Categories