culturekings / shopify-app-auth-laravel by jared-fraser

Shopify OAuth App for Laravel 5.x
13,263
11
15
Package Data
Maintainer Username: jared-fraser
Maintainer Contact: j.bird@culturekings.com.au (Jonathan Bird)
Package Create Date: 2017-05-08
Package Last Update: 2023-04-19
Home Page:
Language: PHP
License: MIT
Last Refreshed: 2024-03-24 03:10:39
Package Statistics
Total Downloads: 13,263
Monthly Downloads: 1
Daily Downloads: 0
Total Stars: 11
Total Watchers: 15
Total Forks: 5
Total Open Issues: 6

shopify-app-auth-laravel

Laravel Auth Boilerplate for Shopify App

Installation

Install

composer require culturekings/shopify-app-auth-laravel

Add to Providers

Add to Providers in config/app.php CultureKings\ShopifyAuth\ShopifyAuthServiceProvider::class

Publish

php artisan vendor:publish

Setup Views

Install Success page

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).

Auth Middleware

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');
    }
);

Configure App in config

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"),
],

Usage

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);

Authenticate Shop App

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

Common Controller Setup

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']),
    ]);
}