Skip to content
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 

PHP Shopify Private API Wrapper


Note: This isn't officially supported by Shopify and thus functionality could be adversely affected at any time


Faced with the need of automatically generating coupon codes I turned to the Shopify public API. Unfortunately, no such functionality existed. I figured the ones used by their admin panel were just undocumented, however the typical API credentials weren't accepted. This wrapper enables this use of such API's.

If you'd like to read more about how and why this works, see https://ma.rtin.so/reverse-engineering-shopify-private-apis

Requirements

  • PHP 5.4+
  • PHP curl
  • Shopify store admin account

Usage

<?php

require 'shopify.php';

$api = new \Shopify\PrivateAPI('username', 'password', 'https://mystore.myshopify.com/admin');

if (!$api->isLoggedIn() && !$api->login()) {
	echo 'invalid credentials';
} else {
	
	# Create a 5% discount coupon
	$new_discount = ['discount' => [
		'applies_to_id' => '',
		'code' => 'automatic_coupon',
		'discount_type' => 'percentage',
		'value' => 5,
		'usage_limit' => 1,
		'starts_at' => date('Y-m-d\TH:i:sO', mktime(0, 0, 0)),
		'ends_at' => null,
		'applies_once' => false
	]];
	
	# Set the CSRF token for the POST request
	try { $api->setToken('https://mystore.myshopify.com/admin/discounts/new'); } 
	catch (\Exception $ex) { }
	
	$do_discount = $api->doRequest('POST', 'discounts.json', $new_discount);

	print_r($do_discount);
	
	# List coupons
	$params = [
		'limit' => 50, 
		'order' => 'id+DESC', 
		'direction' => 'next'
	];
		
	$discounts = $api->doRequest('GET', 'discounts.json', $params);
	if (isset($discounts->discounts)) {
		$coupons = $discounts->discounts;
		foreach ($coupons as $coupon) {
			print_r($coupon);
		}
	}
	
	$params = [
		'reportcenter' => true,
		'start_date' => '2013-02-22',
		'end_date' => '2013-03-01',
		'timezone' => 'Pacific+Time+(US+%26+Canada)'
	];
	
	$referrals = $api->doRequest('GET', 'referrals.json', $params);
	print_r($referrals);
	
	$facts = $api->doRequest('GET', 'facts.json', $params);
	print_r($facts);
	
	$periodical_facts = $api->doRequest('GET', 'periodical_facts.json', $params);
	print_r($periodical_facts);
}

Sample Output

Create Token

stdClass Object
(
    [discount] => stdClass Object
        (
            [applies_once] => 
            [applies_to_id] => 
            [code] => automated_token_example
            [ends_at] => 
            [id] => 16956508
            [minimum_order_amount] => 0.00
            [starts_at] => 2013-03-01T00:00:00-08:00
            [status] => enabled
            [usage_limit] => 1
            [value] => 5.0
            [discount_type] => percentage
            [applies_to_resource] => 
            [times_used] => 0
        )

)

Get Token

(
	stdClass Object
	(
	    [applies_once] => 
	    [applies_to_id] => 
	    [code] => automated_token_example
	    [ends_at] => 
	    [id] => 16956508
	    [minimum_order_amount] => 0.00
	    [starts_at] => 2013-03-01T00:00:00-08:00
	    [status] => enabled
	    [usage_limit] => 1
	    [value] => 5.0
	    [discount_type] => percentage
	    [applies_to_resource] => 
	    [times_used] => 0
	)
	
	...	
)

Referrals

stdClass Object
(
    [start_date] => 2013-02-22
    [end_date] => 2013-03-01
    [search_terms] => Array
        (
            [0] => stdClass Object
                (
                    [terms] => shopify.com
                    [count] => 1
                    [percentage] => 100
                )

        )

    [top_referrals] => Array
        (
            [0] => stdClass Object
                (
                    [referrer] => www.example.com
                    [count] => 530
                    [percentage] => 56.025369978858
                )
                
            ....
        )
)

Facts

stdClass Object
(
    [start_date] => 2013-02-22
    [end_date] => 2013-03-01
    [facts] => stdClass Object
        (
            [orders] => xxx4
            [visits] => xxx83
            [customers] => xxx0
            [unique_visits] => xxx8
            [revenue_per_visitor] => x2.600408834586
            [revenue_per_customer] => xx9.10291304348
            [revenue_order_average] => xxx9.34515748031
            [repeat_customer_percentage] => 29.4488188976378
            [revenue] => xxxxxxx8
        )

    [conversions] => stdClass Object
        (
            [total] => stdClass Object
                (
                    [count] => xxx3
                    [percentage] => 100
                )

            [cart] => stdClass Object
                (
                    [count] => xxx1
                    [percentage] => 40.663436451733
                )

Notes

Use at your own risk, enjoy!