Laravel Auth Boilerplate for Shopify App
composer require culturekings/shopify-app-auth-laravel
Add to Providers in config/app.php
CultureKings\ShopifyAuth\ShopifyAuthServiceProvider::class
php artisan vendor:publish
In your resources/views folder, create your folder and install-sucess.blade.php file, and then within shopify-auth.app_name
, set your view_install_success_path
value to whatever it is (see below in configure app for example).
Set the middleware on routes - ensure that ShopifyAuthCheck if sitting around the routes. Web too, but I think that is standard in the web.php file. Also note that when creating routes, the appname must be second in the url route e.g. apps/app_name/create.
Route::group(
[
'prefix' => 'shopify-apps',
'namespace' => 'ShopifyApps',
'middleware' => 'CultureKings\ShopifyAuth\Http\Middleware\ShopifyAuthCheck'
],
function () {
Route::get('appname', 'AppnameController@getDashboard');
}
);
Once published, set up your app.
You can see below that everything is setup under "appname" and then app_name is used from then on.
In the routes, you see that appName is passed as a variable in the auth url, so this is very important that url is the same as the array key of "appname".
You can change this to be whatever you like so you can run multiple apps through a single auth flow.
'appname' => [
'name' => 'app_name', // checked in db, so shouldn't change after launch
'price' => 0.00,
'redirect_url' => '/shopify-auth/app_name/auth/callback', // relative uri
'success_url' => '/shopify-auth/app_name/install/success',
'dashboard_url' => '/apps/app_name/dashboard',
'scope' => [
"write_products",
"write_script_tags"
],
'view_folder_path' => 'shopify-apps.app_name',
'view_install_success_path' => 'shopify-apps.app_name.install-success',
'key' => env("SHOPIFY_APPNAME_APIKEY"),
'secret' => env("SHOPIFY_APPNAME_SECRET"),
],
All shopify calls should be made through a service and make a call similar to below:
// $appName comes from url passed into method as param (look at middleware)
$shopifyAppConfig = config('shopify-auth.'.$appName);
/ call shopify api
$this->shopify
->setKey($shopifyAppConfig['key'])
->setSecret($shopifyAppConfig['secret'])
->setShopUrl($shopUrl)
->setAccessToken($accessToken)
->post('admin/script_tags.json', $scriptTags);
Navigate to: http://exampledomain.dev/shopify-auth/app_name/install?shop=shopifydomain.myshopify.com
It will then redirect you to your shops auth process to start
I'd generally use this as the construct:
public function __construct(ShopifyApi $shopify, Request $request, ShopifyAuthService $shopifyAuthService)
{
$this->shopify = $shopify;
$this->shopifySession = $request->session()->get('shopifyapp');
$this->shopifyAuthService = $shopifyAuthService;
}
Then set up a method:
public function getDashboard()
{
$shopUrl = $this->shopifySession['shop_url'];
$appName = $this->shopifySession['app_name'];
// find user, then get countdowns based on that
$user = ShopifyUser::where([
'shop_url' => $shopUrl,
'app_name' => $appName,
])->first();
$appConfig = config('shopify-auth.' . $appName);
$this->checkExistsAndCreateScriptTag($shopUrl, $user->access_token, $user, $appName);
return view('app_name.dashboard')->with([
'app_key' => config($appConfig['key']),
]);
}