Can not update product variant data in Shopify - shopify

I'm trying to update price and quantity of my product variant in Shopify using cURL and php below here my code:
$url = $api_url . '/admin/api/2020-01/variants/31941936382042.json';
$data_json = json_encode(
array(
'variants' => array(
'id' => 4574444978266,
'sku' => 'TEST-SKU-111',
'price' => 20,
'compare_at_price' => 20,
'cost' => 20, // This price will be coming form database
'inventory_quantity' => 10))
);
var_dump($data_json);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Content-Length: ' . strlen($data_json)));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
var_dump($response);
curl_close($ch);
When I test it every time it says :
{"errors":{"variant":"Required parameter missing or invalid"}}
I checked official document https://shopify.dev/docs/admin-api/rest/reference/products/product-variant#update-2020-01 but no luck still. Can someone correct me what is the wrong I'm doing ?
Thanks in advance

Try to change the key for your data array, variants => variant.
Also, note the warning at the top of the page you're referring to. You should use Inventory APIs to manager your items inventory instead of setting up inventory_quantity directly.

Related

How to create or update shopify fulfillments

I need to update/create shopify order fulfillment but getting some errors like
{
"errors": "Not Found"
}
I have checked creds everything is right key token store URL everything but getting this error again and again. is there someone who can help with this?
Code is copied and implemented from this guide Fulfillments orders
header("Access-Control-Allow-Origin: *");
set_time_limit(0);
error_reporting(E_ALL);
ini_set("display_errors", 1);
define("API_KEY", '8f6ba81c2bXXXXXXXXXXXXXXXXX');
define("ACCESS_TOKEN", 'XXXXXXXee88e7dXX3604d8XXXXXXXXXXXXXX');
define("SHOP", 'myshopistore-XXXXX');
define("API_VERSION", '2022-10');
$ch = curl_init();
echo $url = 'https://'.API_KEY.':'.ACCESS_TOKEN.'#'.SHOP.'.myshopify.com/admin/api/2022-10/fulfillments.json';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
"{"fulfillment":{"message":"The package was shipped this morning.",
"notify_customer":false,"tracking_info":{"number":1562678,"url":"https://www.my-shipping-company.com","company":"my-shipping-company"},
"line_items_by_fulfillment_order":[{"fulfillment_order_id":125846255999999}]}}");
$headers = array();
$headers[] = 'X-Shopify-Access-Token: XXXXXX27eeXX8e7d9e3604dXXXXXXXXXXXXXX';
$headers[] = 'Content-Type: application/json';
print_r($headers);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
echo $result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
Here is the answer of the question this can help someone in the same case, actually I was using wrong fulfillment_order_id and location_number
Before creating a fulfillment from above code we need to get the fulfillment_order_id from this API request https://'.API_KEY.':'.ACCESS_TOKEN.'#'.SHOP.'.myshopify.com'/admin/api/2022-10/orders/XXXXXXXXXXXXXX/fulfillment_orders.json
this request will return the fulfillment_order_id inside the line_items node then use this id to create your fulfillment.
below API will return locations in case you need them
https://'.API_KEY.':'.ACCESS_TOKEN.'#'.SHOP.'.myshopify.com'/admin/api/2022-10/locations.json

convert a curl request to php-curl - different responses received

I have this request to update a user using the user provisioning API in owncloud.
curl -X PUT https://example.com/ocs/v1.php/cloud/users/pinuccio -d 'key=email' -d 'value=jack#google.com' -H "OCS-APIRequest: true" -u 'admin:adminpwd'
I am trying to convert it to PHP CURL.
I ended up so far with this:
$username = 'admin';
$password = 'adminpwd';
$postData = array(
'key' => 'email',
'value' => 'jack#google.com'
);
$ch = curl_init('https://thesmartred.com/cloud/ocs/v1.php/cloud/users/'.$userid);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HEADER, "OCS-APIRequest: true");
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
but I get a 997 response. While if I run this on shell I get a 405. Why do I get two different answers?
Anyone can help?
Here are couple of differences between your commandline request and php curl request.
First, You are using CURLOPT_HEADER in a wrong way. In php curl manual it says
CURLOPT_HEADER TRUE to include the header in the output
So to add a header in a proper way, example is:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'OCS-APIRequest: true'
));
Second, you are passing the array to your post fields. For array it does a multipart/form-data post. You need to pass data as string, and http_build_query() comes handy this case.
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

Php curl for Survey Monkey API - webhook

I have problems configuring a webhook for "Survey Monkey".
According to the API docs: Survey Monkey - webhook I think I have all the required arguments covered in my code and still I get the error "Invalid schema in the body provided". That mostly means there is something wrong with the POSTed JSON string data. But I can't find what is wrong...
my curl:
$surveyId = '123456789';
$data_string = array(
'name' => 'my webhook 1233456789 name',
'event_type' => 'response_completed',
'object_type' => 'survey',
'object_ids' => array($surveyId),
'subscription_url' => 'http://sometunnel.ngrok.io/job-survey-monkey-listener/completed',
);
$data_string = json_encode($data_string);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.surveymonkey.net/v3/webhooks');
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: bearer 123myaccestoken456.abc.def', 'Content-Length: ' . strlen($data_string)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$server_output = curl_exec($ch);
curl_close($ch);
var_dump(json_decode($server_output, true)); die;
The dump of the return from Survey Monkey is:
array (size=1)
'error' =>
array (size=5)
'docs' => string 'https://developer.surveymonkey.com/api/v3/#error-codes' (length=54)
'message' => string 'Invalid schema in the body provided.' (length=36)
'id' => string '1002' (length=4)
'name' => string 'Bad Request' (length=11)
'http_status_code' => int 400
What do I do wrong here?
Thanks to General Kandalaft
Survey Monkey API does not accept integers for making a Curl to create a new webhook... You MUST send Id's as strings. So the above code in the question is correct.

using Guzzle to access Wink API (Can't get it to work)

Thanks in advance for looking and any help/direction you can give me.
I am new to programming (and api's) and am trying to integrate with the Wink api. Documentation: http://docs.wink.apiary.io/
Using their examples I was able to accomplish oauth2 authentication and then query a listing of devices, etc. but can not get that to work with Guzzle (400 error) I am trying to use the CommerceGuys Guzzle Oauth2 plugin. https://github.com/commerceguys/guzzle-oauth2-plugin
Here is the example code that I can get to work:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://winkapi.quirky.com/oauth2/token");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\n \"client_id\": \"consumer_key_goes_here\",\n \"client_secret\": \"consumer_secret_goes_here\",\n \"username\": \"user#example.com\",\n \"password\": \"password_goes_here\",\n \"grant_type\": \"password\"\n}");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
I have tried many ways to use Guzzle to accomplish this but I always get a 400 (Bad Request) error. My code that I am trying to use is currently in my route for testing purposes:
use Guzzle\Http\Client;
use CommerceGuys\Guzzle\Plugin\Oauth2\Oauth2Plugin;
use CommerceGuys\Guzzle\Plugin\Oauth2\GrantType\PasswordCredentials;
use CommerceGuys\Guzzle\Plugin\Oauth2\GrantType\RefreshToken;
Route::get('wink', function(){
$oauth2Client = new Client('https://winkapi.quirky.com/oauth2/token');
$config = array(
'client_id' => 'xxxxxxxxxx',
'client_secret' => 'xxxxxxxxxxxxxxx',
'username' => 'kevin#xxxxxxxxxxs.com',
'password' => 'xxxxxxxx',
'grant_type' => 'password'
);
$grantType = new PasswordCredentials($oauth2Client, $config);
$refreshTokenGrantType = new RefreshToken($oauth2Client, $config);
$oauth2Plugin = new Oauth2Plugin($grantType, $refreshTokenGrantType);
$client = new Client('https://winkapi.quirky.com');
$client->addSubscriber($oauth2Plugin);
$response = $client->get('/users/me/wink_devices')->send();
var_dump($response);
});
Any help would be appreciated!!

Get products of an order in Bigcommerce

I need a little help regarding to BigCommerce API. I wanted to ask that how can I write this statement
GET orders/{id}/products.json
in php.
Basically I am trying to get products from a specific order. IF I type it in command prompt it returns me the products in the shel but i wanna run it in php.
Any ideas?
Let me know thanks.
You can make a cURL request to BigCommerce Products API
Following is a simple cURL snippet to get products details:
<?php
$api_url = 'https://XYZ.mybigcommerce.com/api/v2/orders/201/products.json';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HTTPHEADER, array ('Accept: application/json', 'Content-Length: 0') );
curl_setopt( $ch, CURLOPT_URL, $api_url );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt( $ch, CURLOPT_USERPWD, "admin:YOUR API KEY" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
$response = curl_exec( $ch );
$result = json_decode($response);
echo "<pre>";
print_r($result);
echo "</pre>";
?>