PHP code example of acefolio / laravel-shopify
1. Go to this page and download the library: Download acefolio/laravel-shopify library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
acefolio / laravel-shopify example snippets
Route::middleware('verify.shopify')->group(function () {
Route::get('/api/products', [ProductController::class, 'index']);
});
use LaravelShopify\Traits\ShopifyRequestContext;
class ProductController extends Controller
{
use ShopifyRequestContext;
public function index(Request $request)
{
$shopDomain = $this->getShopDomain($request);
$accessToken = $this->getAccessToken($request);
$session = $this->getShopifySession($request);
$shop = $this->getShop($request);
// ... your logic
}
}
Route::middleware(['verify.shopify', 'verify.billing'])->group(function () {
Route::get('/api/dashboard', [DashboardController::class, 'index']);
});
// Or
// config/shopify-app.php
'offline_tokens' => [
'expiring' => true,
'refresh_buffer_seconds' => 300, // Refresh 5 min before expiry
],
use LaravelShopify\Services\GraphQLClient;
$graphql = app(GraphQLClient::class);
$result = $graphql->query($shopDomain, $accessToken, '
{
products(first: 10) {
edges {
node {
id
title
}
}
}
}
');
// Mutations
$result = $graphql->mutate($shopDomain, $accessToken, '
mutation productCreate($input: ProductInput!) {
productCreate(input: $input) {
product { id title }
userErrors { field message }
}
}
', ['input' => ['title' => 'New Product']]);
use LaravelShopify\Services\ShopifyApiClient;
$api = app(ShopifyApiClient::class);
$products = $api->get($shopDomain, $accessToken, 'products.json', ['limit' => 10]);
$product = $api->post($shopDomain, $accessToken, 'products.json', ['product' => [...]]);
$api->put($shopDomain, $accessToken, 'products/123.json', ['product' => [...]]);
$api->delete($shopDomain, $accessToken, 'products/123.json');
use LaravelShopify\Facades\ShopifyApp;
$result = ShopifyApp::query($shopDomain, $accessToken, $query);
// config/shopify-app.php
'billing' => [
'enabled' => true,
'Plan',
'type' => 'recurring',
'price' => 9.99,
'currency' => 'USD',
'interval' => 'EVERY_30_DAYS',
'trial_days' => 7,
'test' => true,
],
'pro' => [
'name' => 'Pro Plan',
'type' => 'recurring',
'price' => 29.99,
'currency' => 'USD',
'interval' => 'EVERY_30_DAYS',
'trial_days' => 14,
'test' => true,
'capped_amount' => 100.00,
'terms' => 'Usage charges for API calls',
],
'lifetime' => [
'name' => 'Lifetime Access',
'type' => 'one_time',
'price' => 199.99,
'currency' => 'USD',
'test' => true,
],
],
],
use LaravelShopify\Services\BillingService;
$billing = app(BillingService::class);
// Create a charge and get the confirmation URL
$confirmationUrl = $billing->createCharge($shopDomain, $accessToken, 'pro');
// Check active subscription
$subscription = $billing->checkActiveSubscription($shopDomain, $accessToken);
// Confirm after merchant approves
$plan = $billing->confirmCharge($shopDomain, 'pro', $chargeId);
// config/shopify-app.php
'webhooks' => [
'APP_UNINSTALLED' => \App\Jobs\Shopify\AppUninstalledJob::class,
'PRODUCTS_UPDATE' => \App\Jobs\Shopify\ProductsUpdateJob::class,
],
class ProductsUpdateJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public string $shopDomain;
public array $data;
public string $topic;
public string $apiVersion;
public function handle(): void
{
// Your webhook handling logic
}
}
protected $except = [
'shopify/webhooks',
];
// app/Http/Kernel.php
'web' => [
// ...
\LaravelShopify\Http\Middleware\ShareShopifyInertiaData::class,
],
use LaravelShopify\Navigation\NavigationBridge;
// Generate nav items
$menu = NavigationBridge::buildMenu([
['label' => 'Dashboard', 'route' => 'dashboard'],
['label' => 'Products', 'route' => 'products.index'],
['label' => 'Settings', 'route' => 'settings'],
], Route::currentRouteName());
// For Inertia apps
$sharedData = NavigationBridge::inertiaSharedData($menuItems, $currentRoute);
// EventServiceProvider
protected $listen = [
\LaravelShopify\Events\ShopInstalled::class => [
\App\Listeners\SetupNewShop::class,
],
];
use LaravelShopify\Support\ShopifyHelper;
ShopifyHelper::sanitizeShopDomain('my-store');
// → "my-store.myshopify.com"
ShopifyHelper::adminUrl('my-store.myshopify.com', 'products');
// → "https://my-store.myshopify.com/admin/products"
ShopifyHelper::embeddedAppUrl('my-store.myshopify.com');
// → "https://admin.shopify.com/store/my-store/apps/{api_key}"
ShopifyHelper::shopFromHost($encodedHost);
// → "my-store.myshopify.com"
use LaravelShopify\Support\HmacVerifier;
HmacVerifier::verifyWebhook($body, $hmacHeader);
HmacVerifier::verifyProxy($request);
HmacVerifier::verifyOAuth($queryParams);
HmacVerifier::isValidShopDomain('my-store.myshopify.com'); // true
bash
# Publish everything
php artisan vendor:publish --provider="LaravelShopify\ShopifyAppServiceProvider"
# Or publish individually
php artisan vendor:publish --tag=shopify-config
php artisan vendor:publish --tag=shopify-migrations
php artisan vendor:publish --tag=shopify-views
php artisan vendor:publish --tag=shopify-stubs
php artisan vendor:publish --tag=shopify-vite-plugin
bash
php artisan migrate
bash
php artisan shopify:app:dev
# Options
php artisan shopify:app:dev --tunnel=cloudflare
php artisan shopify:app:dev --port=8000 --vite-port=5173
php artisan shopify:app:dev --no-tunnel
php artisan shopify:app:dev --no-update
bash
php artisan shopify:app:deploy
# Options
php artisan shopify:app:deploy --skip-build
php artisan shopify:app:deploy --skip-optimize
bash
php artisan shopify:generate:webhook PRODUCTS_UPDATE
php artisan shopify:generate:webhook APP_UNINSTALLED --force
bash
php artisan shopify:generate:webhook PRODUCTS_UPDATE
bash
php artisan vendor:publish --tag=shopify-vite-plugin