PHPShopify is a simple SDK implementation of Shopify API. It helps accessing the API in an object oriented way.
Install with Composer
composer require phpclassic/php-shopify
PHPShopify uses curl extension for handling http calls. So you need to have the curl extension installed and enabled with PHP.
However if you prefer to use any other available package library for handling HTTP calls, you can easily do so by modifying 1 line in each of the
get()
,post()
,put()
,delete()
methods inPHPShopify\HttpRequestJson
class.
You can pass additional curl configuration to ShopifySDK
$config = array(
'ShopUrl' => 'yourshop.myshopify.com',
'ApiKey' => '***YOUR-PRIVATE-API-KEY***',
'Password' => '***YOUR-PRIVATE-API-PASSWORD***',
'Curl' => array(
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true
)
);
PHPShopify\ShopifySDK::config($config);
You can use PHPShopify in a pretty simple object oriented way.
If you are using your own private API (except GraphQL), provide the ApiKey and Password.
$config = array(
'ShopUrl' => 'yourshop.myshopify.com',
'ApiKey' => '***YOUR-PRIVATE-API-KEY***',
'Password' => '***YOUR-PRIVATE-API-PASSWORD***',
);
PHPShopify\ShopifySDK::config($config);
For Third party apps, use the permanent access token.
For GraphQL, AccessToken is required. If you are using private API for GraphQL, use your password as AccessToken here.
$config = array(
'ShopUrl' => 'yourshop.myshopify.com',
'AccessToken' => '***ACCESS-TOKEN-FOR-THIRD-PARTY-APP***',
);
PHPShopify\ShopifySDK::config($config);
You can use specific Shopify API Version by adding in the config array
$config = array(
'ShopUrl' => 'yourshop.myshopify.com',
'AccessToken' => '***ACCESS-TOKEN-FOR-THIRD-PARTY-APP***',
'ApiVersion' => '2022-07',
);
PHPShopify\ShopifySDK::config($config);
There is a AuthHelper class to help you getting the permanent access token from the shop using oAuth.
- First, you need to configure the SDK with additional parameter SharedSecret
$config = array(
'ShopUrl' => 'yourshop.myshopify.com',
'ApiKey' => '***YOUR-PRIVATE-API-KEY***',
'SharedSecret' => '***YOUR-SHARED-SECRET***',
);
PHPShopify\ShopifySDK::config($config);
- Create the authentication request
The redirect url must be white listed from your app admin as one of Application Redirect URLs.
//your_authorize_url.php
$scopes = 'read_products,write_products,read_script_tags,write_script_tags';
//This is also valid
//$scopes = array('read_products','write_products','read_script_tags', 'write_script_tags');
$redirectUrl = 'https://yourappurl.com/your_redirect_url.php';
\PHPShopify\AuthHelper::createAuthRequest($scopes, $redirectUrl);
If you want the function to return the authentication url instead of auto-redirecting, you can set the argument
$return
(5th argument) totrue
.
\PHPShopify\AuthHelper::createAuthRequest($scopes, $redirectUrl, null, null, true);
- Get the access token when redirected back to the
$redirectUrl
after app authorization.
//your_redirect_url.php
PHPShopify\ShopifySDK::config($config);
$accessToken = \PHPShopify\AuthHelper::getAccessToken();
//Now store it in database or somewhere else
You can use the same page for creating the request and getting the access token (redirect url). In that case just skip the 2nd parameter
$redirectUrl
while callingcreateAuthRequest()
method. The AuthHelper class will do the rest for you.
//your_authorize_and_redirect_url.php
PHPShopify\ShopifySDK::config($config);
$accessToken = \PHPShopify\AuthHelper::createAuthRequest($scopes);
//Now store it in database or somewhere else
$shopify = new PHPShopify\ShopifySDK;
You can provide the configuration as a parameter while instantiating the object (if you didn't configure already by calling config()
method)
$shopify = new PHPShopify\ShopifySDK($config);
Now you can do get()
, post()
, put()
, delete()
calling the resources in the object oriented way. All resources are named as same as it is named in shopify API reference. (See the resource map below.)
All the requests returns an array (which can be a single resource array or an array of multiple resources) if succeeded. When no result is expected (for example a DELETE request), an empty array will be returned.
- Get all product list (GET request)
$products = $shopify->Product->get();
- Get any specific product with ID (GET request)
$productID = 23564666666;
$product = $shopify->Product($productID)->get();
You can also filter the results by using the url parameters (as specified by Shopify API Reference for each specific resource).
- For example get the list of cancelled orders after a specified date and time (and
fields
specifies the data columns for each row to be rendered) :
$params = array(
'status' => 'cancelled',
'created_at_min' => '2016-06-25T16:15:47-04:00',
'fields' => 'id,line_items,name,total_price'
);
$orders = $shopify->Order->get($params);
- Create a new order (POST Request)
$order = array (
"email" => "[email protected]",
"fulfillment_status" => "unfulfilled",
"line_items" => [
[
"variant_id" => 27535413959,
"quantity" => 5
]
]
);
$shopify->Order->post($order);
Note that you don't need to wrap the data array with the resource key (
order
in this case), which is the expected syntax from Shopify API. This is automatically handled by this SDK.
- Update an order (PUT Request)
$updateInfo = array (
"fulfillment_status" => "fulfilled",
);
$shopify->Order($orderID)->put($updateInfo);
- Remove a Webhook (DELETE request)
$webHookID = 453487303;
$shopify->Webhook($webHookID)->delete();
You must provide the ID of the parent resource when trying to get any child resource
- For example, get the images of a product (GET request)
$productID = 23564666666;
$productImages = $shopify->Product($productID)->Image->get();
- Add a new address for a customer (POST Request)
$address = array(
"address1" => "129 Oak St",
"city" => "Ottawa",
"province" => "ON",
"phone" => "555-1212",
"zip" => "123 ABC",
"last_name" => "Lastnameson",
"first_name" => "Mother",
"country" => "CA",
);
$customerID = 4425749127;
$shopify->Customer($customerID)->Address->post($address);
- Create a fulfillment event (POST request)
$fulfillmentEvent = array(
"status" => "in_transit"
);
$shopify->Order($orderID)->Fulfillment($fulfillmentID)->Event->post($fulfillmentEvent);
- Update a Blog article (PUT request)
$blogID = 23564666666;
$articleID = 125336666;
$updateArtilceInfo = array(
"title" => "My new Title",
"author" => "Your name",
"tags" => "Tags, Will Be, Updated",
"body_html" => "<p>Look, I can even update through a web service.<\/p>",
);
$shopify->Blog($blogID)->Article($articleID)->put($updateArtilceInfo);
- Delete any specific article from a specific blog (DELETE request)
$blogArticle = $shopify->Blog($blogID)->Article($articleID)->delete();
The GraphQL Admin API is a GraphQL-based alternative to the REST-based Admin API, and makes the functionality of the Shopify admin available at a single GraphQL endpoint. The full set of supported types can be found in the GraphQL Admin API reference. You can simply call the GraphQL resource and make a post request with a GraphQL string:
The GraphQL Admin API requires an access token for making authenticated requests. You can obtain an access token either by creating a private app and using that app's API password, or by following the OAuth authorization process. See GraphQL Authentication Guide
$graphQL = <<<Query
query {
shop {
name
primaryDomain {
url
host
}
}
}
Query;
$data = $shopify->GraphQL->post($graphQL);
If you want to use GraphQL variables, you need to put the variables in an array and give it as the 4th argument of the post()
method. The 2nd and 3rd arguments don't have any use in GraphQL, but are there to keep similarity with other requests, you can just keep those as null
. Here is an example:
$graphQL = <<<Query
mutation ($input: CustomerInput!) {
customerCreate(input: $input)
{
customer {
id
displayName
}
userErrors {
field
message
}
}
}
Query;
$variables = [
"input" => [
"firstName" => "Greg",
"lastName" => "Variables",
"email" => "[email protected]"
]
]
$shopify->GraphQL->post($graphQL, null, null, $variables);
This SDK only accepts a GraphQL string as input. You can build your GraphQL from Shopify GraphQL Builder
Some resources are available directly, some resources are only available through parent resources and a few resources can be accessed both ways. It is recommended that you see the details in the related Shopify API Reference page about each resource. Each resource name here is linked to related Shopify API Reference page.
Use the resources only by listed resource map. Trying to get a resource directly which is only available through parent resource may end up with errors.
- AbandonedCheckout
- ApiDeprecations
- ApplicationCharge
- AssignedFulfillmentOrder
- Blog
- Blog -> Article
- Blog -> Article -> Event
- Blog -> Article -> Metafield
- Blog -> Event
- Blog -> Metafield
- CarrierService-
- Cart (read only)
- Collect
- Comment
- Comment -> Event
- Country
- Country -> Province
- Currency
- CustomCollection
- CustomCollection -> Event
- CustomCollection -> Metafield
- Customer
- Customer -> Address
- Customer -> Metafield
- Customer -> Order
- CustomerSavedSearch
- CustomerSavedSearch -> Customer
- DraftOrder
- Discount (Shopify Plus Only)
- DiscountCode
- Event
- FulfillmentService
- Fulfillment
- FulfillmentOrder
- FulfillmentOrder -> FulfillmentRequest
- FulfillmentOrder -> Fulfillment
- GiftCard (Shopify Plus Only)
- InventoryItem
- InventoryLevel
- Location (read only)
- Location -> InventoryLevel
- Metafield
- Multipass (Shopify Plus Only, API not available yet)
- Order
- Order -> FulfillmentOrder
- Order -> Risk
- Order -> Refund
- Order -> Transaction
- Order -> Event
- Order -> Metafield
- Page
- Page -> Event
- Page -> Metafield
- Policy (read only)
- Product
- Product -> Image
- Product -> Variant
- Product -> Variant -> Metafield
- Product -> Event
- Product -> Metafield
- ProductListing
- ProductVariant
- ProductVariant -> Metafield
- RecurringApplicationCharge
- RecurringApplicationCharge -> UsageCharge
- Redirect
- ScriptTag
- ShippingZone (read only)
- Shop (read only)
- SmartCollection
- SmartCollection -> Event
- ShopifyPayment
- ShopifyPayment -> Dispute (read only)
- Theme
- Theme -> Asset
- User (read only, Shopify Plus Only)
- Webhook
- GraphQL
There are several action methods which can be called without calling the get()
, post()
, put()
, delete()
methods directly, but eventually results in a custom call to one of those methods.
- For example, get count of total products
$productCount = $shopify->Product->count();
- Make an address default for the customer.
$shopify->Customer($customerID)->Address($addressID)->makeDefault();
- Search for customers with keyword "Bob" living in country "United States".
$shopify->Customer->search("Bob country:United States");
The custom methods are specific to some resources which may not be available for other resources. It is recommended that you see the details in the related Shopify API Reference page about each action. We will just list the available actions here with some brief info. each action name is linked to an example in Shopify API Reference which has more details information.
-
(Any resource type except ApplicationCharge, CarrierService, FulfillmentService, Location, Policy, RecurringApplicationCharge, ShippingZone, Shop, Theme) ->
- count() Get a count of all the resources. Unlike all other actions, this function returns an integer value.
-
Comment ->
- markSpam() Mark a Comment as spam
- markNotSpam() Mark a Comment as not spam
- approve() Approve a Comment
- remove() Remove a Comment
- restore() Restore a Comment
-
Customer ->
- search() Search for customers matching supplied query
- send_invite($data) Sends an account invite to a customer.
-
Customer -> Address ->
- makeDefault() Sets the address as default for the customer
- set($params) Perform bulk operations against a number of addresses
-
DraftOrder ->
- send_invoice($data) Send the invoice for a DraftOrder
- complete($data) Complete a DraftOrder
-
Discount ->
-
DiscountCode ->
- lookup($data) Retrieves the location of a discount code.
-
Fulfillment ->
- complete() Complete a fulfillment
- open() Open a pending fulfillment
- cancel() Cancel a fulfillment
-
GiftCard ->
-
InventoryLevel ->
- adjust($data) Adjust inventory level.
- connect($data) Connect an inventory item to a location.
- set($data) Set an inventory level for a single inventory item within a location.
-
Order ->
- close() Close an Order
- open() Re-open a closed Order
- cancel($data) Cancel an Order
-
Order -> Refund ->
- calculate() Calculate a Refund.
-
ProductListing ->
- productIds() Retrieve product_ids that are published to your app.
-
RecurringApplicationCharge ->
- activate() Activate a recurring application charge
- customize($data) Customize a recurring application charge
-
SmartCollection ->
- sortOrder($params) Set the ordering type and/or the manual order of products in a smart collection
-
User ->
- current() Get the current logged-in user
- Mapped FulfillmentOrder->FulfillmentRequest
- Mapped Order(id)->FulfillmentOrder
// Requesting the FulfilmentOrder for a given order
$fo = $client->Order("1234567890")->FulfillmentOrder()->get();
// Requesting assigned fulfillment orders (with status fulfillment_requested)
$fo = $client->AssignedFulfillmentOrder()->get(["assignment_status" => "fulfillment_requested"]);
// Creating a FulfilmentRequest
// Follow instructions to get partial fulfilments
$fr = $client->FulfillmentOrder('0987654321')->FulfillmentRequest->post([]);
// Accepting \ Rejecting a FulfilmentRequest
$fr = $client->FulfillmentOrder('0987654321')->FulfillmentRequest->accept();
$fr = $client->FulfillmentOrder('0987654321')->FulfillmentRequest->reject();
// Communicating fulfillment
$client->Fulfillment->post($body)
To send X-Shopify-Api-Features
headers while using the SDK, you can use the following:
$config['ShopifyApiFeatures'] = ['include-presentment-prices'];
$shopify = new PHPShopify\ShopifySDK($config);
You can hire the author of this SDK for setting up your project with PHPShopify SDK.
Support us with a monthly donation and help us continue our activities. [Become a backer]
Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]