I have seen examples of people sending JSON data in an array. An using cURL to send the data. Problem is most of them are something like
$data = array('first_name' => 'Thomas', 'last_name' => 'Woods')
My question is, if I have something like below that isnt as dry cut. Example:
"products": [
{
"product_id": "B00I9KDFK0",
"quantity": 1,
"seller_selection_criteria": [
{
"condition_in": ["New"],
"international": false,
"handling_days_max": 5
}
]
}
],
So how would I put that info into an Array?
More Info: Ive tried the following with no luck
<?php
// Your ID and token
// The data to send to the API
$postData = array(
'client_token' => 'XXXXXXXXXXXXXXXXXXXXXX',
'retailer' => 'amazon',
'products' => array('product_id' => '0923568964', 'quantity' => '1', 'seller_selection_criteria' => array('condition_in' => 'New', 'international' => 'false', 'handling_days_max' => '5')),
'max_price' => '1300',
'shipping_address' => array('first_name' => 'Thomas', 'last_name' => 'XXXXX', 'address_line1' => 'XXXXXX Loop', 'address_line2' => '', 'zip_code' => 'XXXXX', 'city' => 'XXXX', 'state' => 'MS', 'country' => 'US', 'phone_number' => 'XXXXXX'),
'is_gift' => 'false',
'gift_message' => "",
'shipping_method' => 'cheapest',
'payment_method' => array('name_on_card' => 'XXXXXXXX', 'number' => 'XXXXXXXXXXXX', 'security_code' => 'XXX', 'expiration_month' => 'XX', 'expiration_year' => 'XXXX', 'use_gift' => 'false'),
'billing_address' => array('first_name' => 'Thomas', 'last_name' => 'XXXXXX', 'address_line1' => 'XXXXXXXXX', 'address_line2' => '', 'zip_code' => 'XXXXXX', 'city' => 'XXXXXXXX', 'state' => 'MS', 'country' => 'US', 'phone_number' => 'XXXXXXXX'),
'retailer_credentials' => array('email' => 'XXXXXXXX', 'password' => 'XXXXXXXXX')
);
// Setup cURL
$ch = curl_init('https://api.zinc.io/v0/order');
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => json_encode($postData)
));
// Send the request
$response = curl_exec($ch);
// Check for errors
if($response === FALSE){
die(curl_error($ch));
}
// Decode the response
$responseData = json_decode($response, TRUE);
// Print the date from the response
echo $responseData['published'];
echo $response;
?>
There error im getting is:
{"_type":"error","_request_id":"5663c16b75f682d920000758","code":"invalid_request","message":"Validation failed on the request.","data":{"validator_errors":[{"value":[],"path":"products","message":"'' is not a permitted value for 'products' field."}]},"host":"zincapi-5","offers_urls":[],"screenshot_urls":[],"_created_at":"2015-12-06T05:02:35.567Z"}
Here is the code from the Echo of Json_echo
{"client_token":"xxxxxxxxxxxxxxxxxxxxxxx","retailer":"amazon","products":{"product_id":"0923568964","quantity":1,"seller_selection_criteria":{"condition_in":"New","international":false,"handling_days_max":5}},"max_price":"1300","shipping_address":{"first_name":"Thomas","last_name":"xxxxxx","address_line1":"xxxxx","address_line2":"","zip_code":"xxxx","city":"xxxxx","state":"MS","country":"US","phone_number":"xxxxxx"},"is_gift":"false","gift_message":"","shipping_method":"cheapest","payment_method":{"name_on_card":"xxxxxxxxxx","number":"xxxxxxxxxxxxx","security_code":"xxxx","expiration_month":"xx","expiration_year":"xxxx","use_gift":false},"billing_address":{"first_name":"Thomas","last_name":"xxxxx","address_line1":"xxxxxxx","address_line2":"","zip_code":"xxxx","city":"xxxxxx","state":"MS","country":"US","phone_number":"xxxxxx"},"retailer_credentials":{"email":"xxxxxxxxxx","password":"xxxxxxxxxx"}}
You should be able to use json_encode() which will put it into a properly formatted array.
After reading your response and the error you were getting back from the API you are making the request to, I think the error has to do with the format of your request.
If you look at their API documentation you'll see that it's expecting an array of products. You are only sending one, but it will need to be in an array format.
Here is what it is expecting:
"products": [
{
"product_id": "0923568964",
"quantity": 1,
"seller_selection_criteria": [
{
"condition_in": ["New"],
"international": false,
"handling_days_max": 5
}
]
}
],
So, to change this, you'll need to update the products key of your array to:
'products' => array(array('product_id' => '0923568964', 'quantity' => '1','seller_selection_criteria' => array('condition_in' => 'New', 'international' =>'false', 'handling_days_max' => '5'))),
If you noticed, I put an array declaration around the array of your product details. If you had a second product, you'd put a comma after your first array of product details and add a second.
Related
My assertJSON test isn't working and says I get the below error
Here's the test code
$user = Sanctum::actingAs(
User::factory()->create(),
['*']
);
$customer = Customer::first();
$response = $this->getJson('api/customers/' . $customer->slug);
$response->assertStatus(200);
$response->assertJson(
[
'data' => [
'uuid' => $customer->uuid,
'customer_name' => $customer->customer_name,
'email' => $customer->email,
'slug' => $customer->slug,
'street_1' => $customer->street_1,
'street_2' => $customer->street_2,
'city' => $customer->city,
'postcode' => $customer->postcode,
'telephone_number' => $customer->telephone_number,
'county' => $customer->county,
'customer_type' => $customer->customerType,
'archived' => $customer->archived ? 'Yes' : 'No',
]
]
);
And here is the customer resource
public function toArray($request)
{
return [
'uuid' => $this->uuid,
'customer_name' => $this->customer_name,
'email' => $this->email,
'slug' => $this->slug,
'street_1' => $this->street_1,
'street_2' => $this->street_2,
'city' => $this->city,
'postcode' => $this->postcode,
'telephone_number' => $this->telephone_number,
'county' => $this->county,
'customer_type' => $this->customerType,
'archived' => $this->archived ? 'Yes' : 'No',
];
}
The 2 JSON arrays are exactly the same and the other tests are working and everything on the front end is working just fine too.
More of the error
I'm having a tough time figuring out how to properly code sequenced SOAP requests to the Bing Ads API. Prefer not to use their SDK, which I have used in the past.
The parameters 'Scope', 'Time', 'Filter', and 'Sort' do not affect the result. The entire account keywords are returned instead. For 'Scope', I am using the Adgroups param to select keywords in that Adgroup. Any help is greatly appreciated.
Reference: https://learn.microsoft.com/en-us/advertising/reporting-service/keywordperformancereportrequest?view=bingads-13
WSDL: https://reporting.api.bingads.microsoft.com/Api/Advertiser/Reporting/V13/ReportingService.svc?singleWsdl
$request = [
'ReportRequest' => new SoapVar(
[
'Format' => 'Csv',
'ReportName' => 'Bing Keyword Performance Report',
'ReturnOnlyCompleteData' => false,
'Aggregation' => 'Daily',
'Sort' => array('SortColumn' => 'Clicks','SortOrder' => 'Ascending'),
'Scope' => ['AdGroups' => array(array('AccountId' => $bClientId,
'AdGroupId' => $apiDBIdGroupBing,
'CampaignId' => $apiDBIdCampaignBing,
))],
'Time' => [
'CustomDateRangeStart' =>
array('Day' => $startDay,'Month' => $startMonth,'Year' => $startYear),
'CustomDateRangeEnd' =>
array('Day' => $endDay,'Month' => $endMonth,'Year' => $endYear)
],
'Filter' => ['Keywords' => array($criteriaValue)],
'Columns' => [
"TimePeriod",
"Spend",
"Clicks",
"CurrentMaxCpc",
"Impressions",
"AdGroupName"
]
],
SOAP_ENC_OBJECT,
'KeywordPerformanceReportRequest',
"https://bingads.microsoft.com/Reporting/v13"
)];
Solved:
$request = [
'ReportRequest' => new SoapVar(
[
'Format' => 'Csv',
'ReportName' => 'Bing Keyword Performance Report',
'ReturnOnlyCompleteData' => false,
'Aggregation' => 'Monthly',
'Sort' => array('SortColumn' => 'Clicks','SortOrder' => 'Ascending'),
'Scope' => ['AccountIds' => [$bClientId]],
'MaxRows' => '9000000',
'Time' => ['PredefinedTime' => $reportTimeFrame],
'Columns' => [
"Keyword",
"Spend",
"CampaignId",
"AdGroupId",
"AveragePosition",
"CurrentMaxCpc",
"KeywordId",
"BidMatchType",
"Impressions",
"Clicks",
"TimePeriod",
"QualityScore",
"ExpectedCtr",
"AdRelevance",
"LandingPageExperience",
"CampaignStatus",
"AdGroupStatus",
"KeywordStatus",
"AccountName",
"CampaignName",
"AdGroupName",
"BidStrategyType",
]
],
SOAP_ENC_OBJECT,
'KeywordPerformanceReportRequest',
"https://bingads.microsoft.com/Reporting/v13"
)];
$response = $SoapClient->SubmitGenerateReport($request);
I'm trying to send a post to an API, but the "items should be an array" error is returned.
$response2 = $client2->request('POST', 'https://api.iugu.com/v1/invoices?api_token='.$token, [
'form_params' => [
'email' => $email,
'due_date' => $due_date,
'items' => ['description' =>
'Item Um',
'quantity' => 1,
'price_cents' => 1000
],
'payer' => [
'cpf_cnpj' => $cpf_cnpj,
'name' => $name,
'phone_prefix' => $phone_prefix,
'phone' => $phone,
'email' => $email,
'address' => [
'zip_code' => $zip_code,
'street' => $street,
'number' => $number,
'district' => $district,
'city' => $city,
'state' => $state,
'country' => 'Brasil',
'complement' => $complement
]
]
]
]);
I've tried it in several ways.
['items' => 'description' =>
'Item Um',
'quantity' => 1,
'price_cents' => 1000
],
But none of the ways showed the result I wanted. It's weird, because when I run with PHP and CURL lib this code works like charm.
Any sugestion? Thanks in advance for community!
Each item should be an array with their own description, quantity, and price_cents keys. Wrap each within one more array like so:
'items' => [
[
'description' => 'Item Um',
'quantity' => 1,
'price_cents' => 1000
],
]
You'll get an array of items now:
Array
(
[0] => Array
(
[description] => Item Um
[quantity] => 1
[price_cents] => 1000
)
)
This is the Json code
{"data":{"user":{"first_name":"xx","last_name":"xx","email":"xx","countryOfResidence":"GB","country":"LK","nationality":"LK"},"billing_address":{"line1":"xx","city":"xx","postal_code":"xx","country":"LK"},"shipping_address":{"first_name":"xx","last_name":"xx","line1":"xx","city":"xx","postal_code":"xx","country":"LK"},"phone":{"type":"Mobile","number":"xx","countryCode":"94"},"marketing_optin":true,"shipping_address_validation":false,"poma_flow":false,"prox_flow":false,"testParams":{},"content_identifier":"LK:en:2.0.287:signupTerms.signupC","card":{"type":"MASTERCARD","number":"xx","security_code":"xx","expiry_month":"xx","expiry_year":"xx"},"skipInitiateAuth":true},"meta":{"token":"xx","calc":"xx","csci":"xx","locale":{"country":"LK","language":"en"},"state":"ui_checkout_guest","app_name":"xoonboardingnodeweb"}}
This is the PHP code I want to write the code in a correct way and make it work.
I want to know where my fault is. Can anyone correct this file from​ me?
Please help with this example clearly.
$link = "https://www.paypal.com/webscr?cmd=_express-checkout&token=EC-7Y207450BE832821N#/checkout/guest";
$post = "";
$s = _curl($link, json_encode($post), $cookie);
$post = json_encode($array);
$array = json_decode($json_string, true);
$link = "https://www.paypal.com/webapps/xoonboarding/api/onboard/guest";
$post = [
'data' => [
'user' => [
'first_name' => 'xx',
'last_name' => 'xx',
'email' => 'xx',
'countryOfResidence' => 'GB',
'country' => 'LK',
'nationality' => 'lk',
],
'billing_address' => [
'line1' => 'xx',
'city' => 'xx',
'postal_code' => 'xx',
'country' => 'lk',
],
'shipping_address' => [
'first_name' => 'xx',
'last_name' => 'xx',
'line1' => 'xx',
'city' => 'xx',
'postal_code' => 'xx',
'country' => 'lk',
],
'phone' => [
'type' => 'Mobile',
'number' => 'xx',
'countryCode' => '94',
],
'marketing_optin' => true,
'shipping_address_validation' => false,
'poma_flow' => false,
'prox_flow' => false,
'testParams' => [],
'content_identifier' => "LK:en:2.0.287:signupTerms.signupC",
'card' => [
'type' => 'xx',
'number' => xx,
'security_code' => xx,
'expiry_month' => xx,
'expiry_year' => xx,
],
'skipInitiateAuth' => true
],
'meta' => [
'token' => xx,
'calc' => xx,
'csci' => xx,
'locale' => [
'country' => 'LK',
'language' => 'en',
],
'state' => 'ui_checkout_guest',
'app_name' => 'xoonboardingnodeweb',
]
];
$s = _curl($link, json_encode($post), $cookie);
You can use a JSON Formatter to easily visualize the structure of your JSON, and transpose it in PHP. Or you can just create a PHP variable thanks to json_decode with you JSON code giving in example.
$link = "https://www.paypal.com/webapps/xoonboarding/api/onboard/guest";
$data = [
'data' => [
'user' => [
'first_name' => 'xx',
'last_name' => 'xx',
'email' => 'xx',
'countryOfResidence' => 'GB',
'country' => 'LK',
'nationality' => 'lk',
],
'billing_address' => [
'line1' => 'xx',
'city' => 'xx',
'postal_code' => 'xx',
'country' => 'lk',
],
'shipping_address' => [
'first_name' => 'xx',
'last_name' => 'xx',
'line1' => 'xx',
'city' => 'xx',
'postal_code' => 'xx',
'country' => 'lk',
],
'phone' => [
'type' => 'Mobile',
'number' => 'xx',
'countryCode' => '94',
],
'marketing_optin' => true,
'shipping_address_validation' => false,
'poma_flow' => false,
'prox_flow' => false,
'testParams' => [],
'content_identifier' => "LK:en:2.0.287:signupTerms.signupC",
'card' => [
'type' => 'xx',
'number' => 'xx',
'security_code' => 'xx',
'expiry_month' => 'xx',
'expiry_year' => 'xx',
],
'skipInitiateAuth' => true
],
'meta' => [
'token' => 'xx',
'calc' => 'xx',
'csci' => 'xx',
'locale' => [
'country' => 'LK',
'language' => 'en',
],
'state' => 'ui_checkout_guest',
'app_name' => 'xoonboardingnodeweb',
]
];
$json = json_encode($data, true);
$ch = curl_init($link);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Content-Length: ' . strlen($json)]);
$result = curl_exec($ch);
The Aramex Rate calculator API is returning the error code ISE01 and and the following error message:
Internal Server Error has occurred while getting calculating rate` while requesting
What it the reason for this error?
The following is the sample code for the Aramex rate calculator API:
<?php
$params = array(
'ClientInfo' => array(
'AccountCountryCode' => 'JO',
'AccountEntity' => 'AMM',
'AccountNumber' => '00000',
'AccountPin' => '000000',
'UserName' => 'user#company.com',
'Password' => '000000000',
'Version' => 'v1.0'
),
'Transaction' => array(
'Reference1' => '001'
),
'OriginAddress' => array(
'City' => 'Amman',
'CountryCode' => 'JO'
),
'DestinationAddress' => array(
'City' => 'Dubai',
'CountryCode' => 'AE'
),
'ShipmentDetails' => array(
'PaymentType' => 'P',
'ProductGroup' => 'EXP',
'ProductType' => 'PPX',
'ActualWeight' => array('Value' => 5, 'Unit' => 'KG'),
'ChargeableWeight' => array('Value' => 5, 'Unit' => 'KG'),
'NumberOfPieces' => 5
)
);
$soapClient = new SoapClient('http://url/to/wsdl.wsdl', array('trace' => 1));
$results = $soapClient->CalculateRate($params);
echo '<pre>';
print_r($results);
die();
?>
Just download WSDL FILE, put it somewhere on your server, and change this line to correct one (fix the url!):
$soapClient = new SoapClient('http://url/to/wsdl.wsdl', array('trace' => 1));
-
Your SOAP Client simply doesn't really recognize CalculateRate command without directions...
PS. Worked for me, just tried.